PDA

Ver la Versión Completa : Parametros en Consultas


JosepGA
24-01-2011, 15:15:19
Hola a todos,

pues mi duda es la siguiente, con Delphi 7 podía hacer lo siguiente al filtrar una consulta mediante parametros:

With tArticulos Do
Begin
If Active Then
Active := FALSE;

With DataSet Do
Begin
CommandText := 'select CODIGO, DESCRIPCION FROM ARTICULOS WHERE ( CODIGO = :AUXCODART ) ORDER BY CODIGO';

Params.ParamByName( 'AUXCODART' ).AsString := sArticulo;
End;

Active := TRUE;
End;


Cada vez que la aplicaba me devolvia el registro del artículo solicitado, pero ahora con Delphi 2010 me encuentro que siempre se me quedaba en el primer artículo solicitado, los siguientes no los encontraba, haciendo muchas pruebas me encuentro de que en la propiedad "Params" del tSimpleDataSet ( No en la de tSimpleDataSet.DataSet.Params si no que en tSimpleDataSet.Params ) en tiempo de ejecución se han creado estos parametros, por lo que la solución es eliminarlo cada vez que se aplica la consulta para que funcione, quedando así:

With tArticulos Do
Begin
If Active Then
Active := FALSE;

Params.Clear; /* ESTO ES LO QUE AÑADO */
With DataSet Do
Begin
CommandText := 'select CODIGO, DESCRIPCION FROM ARTICULOS WHERE ( CODIGO = :AUXCODART ) ORDER BY CODIGO';

Params.ParamByName( 'AUXCODART' ).AsString := sArticulo;
End;

Active := TRUE;
End;

Ya se que he encontrado el problema, en Delphi 7 no me lo hacía, ¿ pero alguien me puede decir si esto tiene solución ? ¿ A que es debido este cambio ?

bitbow
25-01-2011, 01:23:05
Saludos, tengo ya algun tiempo con delphi y mi pregunta es por que params?
no digo que no los uses si no que mi duda es que diferencia hay entre pasarle la variable directamente y usar params.

Bueno se que no ayuda mucho otra pregunta, pero es para aprovechar la tuya y bueno esa seria una solucion.


With tArticulos Do
Begin
If Active Then
Active := FALSE;

With DataSet Do
Begin
CommandText := 'select CODIGO, DESCRIPCION FROM ARTICULOS WHERE ( CODIGO = '''+ sArticulo +''' ) ORDER BY CODIGO';
End;

Active := TRUE;
End;

JosepGA
25-01-2011, 09:52:27
Hola,

pues simplemente por definición de tipos, me queda mas claro a que tipo de datos estoy accediendo con los parametros y me evito los QuotedStr, etc...

Un saludo

mcs
25-01-2011, 10:05:26
me evito los QuotedStr

Para mi esto es lo más importante. Ya no hago nunca esto de pegar variables en la cadena del query, sinó que siempre uso parámetros.

A parte de esto, teoricamente (por lo menos en Java funciona así) es más rápido cuando se hacen múltiples llamadas a una query, ya que la query ya está interpretada y compilada en el servidor SQL, y solo tiene que ir variando los parámetros.

Sobre tu duda, pues no lo sé. Yo lo que me he encontrado es que usando query's con SELECT, si no llamo al Query.Close antes de modificar los parámetros, no se actualizan los valores. Pero estoy usando los componentes IBDAC, y no es lo mismo que tu...

Saludos,

Marc