PDA

Ver la Versión Completa : Select con parametros String


delphijm
09-04-2008, 19:09:15
Hola a todos,

Tengo un SQLDataSet al que, mediante codigo, le asigno la propiedad CommandText d ela siguiente forma:

--> SQLds_articulos.CommandText:='select * from articulos where IDarticulo=:IDarticulo';

Donde IDarticulo es un parametro de tipo String al que le doy valor a continuacion (El valor lo tomo del registro activo de otro SQLDataSet:

--> SQLds_articulos.ParamByName('IDarticulo').AsString:=cdsLineas.FieldByName('Articulo').AsString;

El problema es que al hacer el open, no me hace la consulta y, ademas, al intentar consultar la propiedad RecordCount me lanza un error del tipo:

--> EDataBase Error with message 0x0005 : Operation not supported

Tengo otros casos parecidos en los que el parametro es tipo Integer y me funcionan correctamente, el problema debe estar en el tipo string del parametro pero no se como solucionarlo...

Si uso el commandtext sin el parametro me funciona correctamente

--> SQLds_articulos.CommandText:='select * from articulos where IDarticulo="'+cdsLineas.FieldByName('Articulo').AsString+'"';

Estoy usando Delphi 2007 i MySQL

Si alguien puede ayudarme le estare muy agradecido!!

Saludos

gluglu
09-04-2008, 19:18:57
El nombre del parámetro no puede coincidir con el nombre del campo de tu tabla, como parece ser tu caso. ;)

ContraVeneno
09-04-2008, 20:23:51
Hasta donde se, no importa si el nombre del parámetro es igual al nombre del campo, ya que estos se accesan desde propiedades diferentes (Fields, parameters).

Lo que yo verificaría sería que el ID del artículo no tuviera espacios y luego verificar que cdsLineas.FieldByName('Articulo').AsString realmente contenga un ID de artículo.

delphijm
09-04-2008, 21:08:38
Hola Contraveneno,

Antes de nada gracias por responder...

Asi es, el nombre del parametro puede ser el mismo, en otras ocasiones he hecho esto mismo con el nombre del parametro y del campo identicos (pero de tipos integer) y funciona correctamente...

En cuanto a las verificaciones que me comentas ya las he hecho, y para mi mala suerte 1000 mas... El valor que asigno al parametro es correcto y valido y existe en la BBDD... De hecho cuando hago el select sin parametro sino normal me funciona...

Creo que el problema esta en las comillas... Si ves el mensaje original, en el select sin parametros que me funciona, el valor lo entrecomillo con comillas dobles y me funciona... El tema esta en que no se como entrecolillar el parametro... Si lo hago no me reconoce el parametro y si al valor del parametro le coloco las comillas dobles antes y despues tampoco me funciona.... Raro no??

darkerbyte
16-04-2008, 06:30:15
Prueba con comillas simples,


SQLds_articulos.CommandText:=
'select * from articulos where IDarticulo='+ #39 + cdsLineas.FieldByName('Articulo').AsString + #39;

rulo_m
18-04-2008, 01:47:01
puedes usar

quotedstr(cdsLineas.FieldByName('Articulo').AsString)

kuan-yiu
18-04-2008, 09:46:58
Yo he hecho muchas incorporaciones de parámetros como la que indicas y me funcionan perfectamente pero he detectado una peculiaridad, no sé si llamarla bug o es que lo que hace es lógico.
Si utilizo "FieldByName" para recoger alguno de los campos de una "query" no puedo haber incorporado ningún campo en "Fields" porque sino no funciona: O lo hago todo con "FieldByName" o no se me ocurre utilizarlo si tengo algo en "Fields".

Bueno, no sé si me he explicado demasiado bien...

eduarcol
18-04-2008, 14:24:38
Yo he hecho muchas incorporaciones de parámetros como la que indicas y me funcionan perfectamente pero he detectado una peculiaridad, no sé si llamarla bug o es que lo que hace es lógico.
Si utilizo "FieldByName" para recoger alguno de los campos de una "query" no puedo haber incorporado ningún campo en "Fields" porque sino no funciona: O lo hago todo con "FieldByName" o no se me ocurre utilizarlo si tengo algo en "Fields".

Bueno, no sé si me he explicado demasiado bien...

Si cuando dices Fields te refieres a campos persistentes me parece por demas logico, ya que el query la lista de campos que utiliza es la que esta creada alli, pero eso no quita que puedas utilizar el FieldbyName si el campo existe entre los persistentes.