Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Problema con Parambyname (https://www.clubdelphi.com/foros/showthread.php?t=80314)

Perenquen 18-09-2012 12:16:04

Problema con Parambyname
 
Buenas. Estaba teniendo problemas en una consulta con la que estaba usando Parambyname para pasar ciertas variables. Descubrí que el problema surge cuando le paso la misma variable varias veces. La consulta original es un poco larga asi que pongo un ejemplo con una más sencilla para ver si alguien me puede decir cual es el problema

Código:

AQ.SQL.text := 'SELECT :prueba,:prueba,:prueba';
AQ.Parameters.ParamByName('str').DataType := ftinteger;
AQ.Parameters.ParamByName('str').Value  := 35;
AQ.open;

Me debería devolver
35,35,35
Pero sin embargo me devuelve
35,NULL,NULL

Es como si sólo si cogiera la primera referencia al parámetro y el resto se lo saltara.

Un saludo y gracias de antemano.

Casimiro Notevi 18-09-2012 12:42:04

Cita:

Empezado por Perenquen (Mensaje 443384)

Código:

AQ.SQL.text := 'SELECT :prueba,:prueba,:prueba';
AQ.Parameters.ParamByName('str').DataType := ftinteger;
AQ.Parameters.ParamByName('str').Value  := 35;
AQ.open;

Me debería devolver
35,35,35
Pero sin embargo me devuelve
35,NULL,NULL

Ese ejemplo no sirve absolutamente para nada, bueno, sí, para saber que está mal, no puedes poner parámetros con el mismo nombre y luego en parambyname has puesto 'str' que no es el nombre de ninguno de ellos, bueno, del único, 'prueba'
En todo caso sería algo así:

Código Delphi [-]
AQ.SQL.text := 'SELECT * from tabla where campotal= :aprueba1 and campocual= :aprueba2 and campootro= :aprueba3';
AQ.Parameters.ParamByName('aprueba1').asinteger := 20;
AQ.Parameters.ParamByName('aprueba2').Value  := 35;
AQ.Parameters.ParamByName('aprueba3').Value  := loquesea;
AQ.open;

Perenquen 18-09-2012 12:51:29

Cita:

Empezado por Casimiro Notevi (Mensaje 443385)
Ese ejemplo no sirve absolutamente para nada, bueno, sí, para saber que está mal, no puedes poner parámetros con el mismo nombre y luego en parambyname has puesto 'str' que no es el nombre de ninguno de ellos, bueno, del único, 'prueba'
En todo caso sería algo así:

Código Delphi [-]
AQ.SQL.text := 'SELECT * from tabla where campotal= :aprueba1 and campocual= :aprueba2 and campootro= :aprueba3';
AQ.Parameters.ParamByName('aprueba1').asinteger := 20;
AQ.Parameters.ParamByName('aprueba2').Value  := 35;
AQ.Parameters.ParamByName('aprueba3').Value  := loquesea;
AQ.open;


Bueno, es obvio que cometí un error al transcribir el código

Código:

AQ.SQL.text := 'SELECT :prueba,:prueba,:prueba';
AQ.Parameters.ParamByName('prueba').DataType := ftinteger;
AQ.Parameters.ParamByName('prueba').Value  := 35;
AQ.open;

La razón de poner varios parámetros iguales es porque en la consulta original se utilizan en diversas sentencias SQL. Al margen del error cometido, lo que intenta demostrar el ejemplo es si saber si se puede utilizar el mismo parámetro varias veces dentro de la consulta.

El ejemplo que pones funciona correctamente, pero no es lo que pretendo tratar en este tema, ya que no se repite ningún parámetro.

Un saludo y gracias por tu pronta respuesta.

Casimiro Notevi 18-09-2012 12:59:03

Veamos, en principio, no puedes pasar como parámetros nombres de campos y...
tampoco puedes repetir el nombre del parámetro, ¿cómo sabe mysql a cual de ellos te refieres? :confused:

Perenquen 18-09-2012 13:13:25

Quizás el error lo cometí al poner una consulta tan banal para simplificar la cuestión a tratar.

La razón de pasar el mismo parametro quizás se vea mejor en una consulta como esta

Código:

SELECT funcion1(:ID),funcion2(:ID)
Lo que se pretende (y tiene sentido) es es que en cada :ID se sustituya por su valor correspondiente

Claro que se puede hacer como:

Código:

SELECT funcion1(:ID1),funcion2(:ID2)
Siendo ID1=ID2=35

Pero esto, desde mi punto de vista, es lo que no tiene mucho sentido. Sobre todo si ese valor se repite varias veces dentro de la consulta.

Un saludo.

Casimiro Notevi 18-09-2012 13:21:25

Ya te digo, desconozco mysql, pero dudo mucho que puedas hacer eso, repito lo de antes, ¿cómo sabe mysql a cual de los parámetros te refieres?

Casimiro Notevi 18-09-2012 13:25:18

A ver si alguien que conozca mejor mysql puede dar una opinión más segura.

roman 18-09-2012 15:58:10

Cita:

Empezado por Casimiro Notevi (Mensaje 443394)
Ya te digo, desconozco mysql, pero dudo mucho que puedas hacer eso, repito lo de antes, ¿cómo sabe mysql a cual de los parámetros te refieres?

¿Cuál sería el problema? Se trata de proveer un mismo valor en varios puntos de la consulta SQL. No recuerdo que hubiera una restricción de no poder repetir parámetros.

// Saludos

AzidRain 18-09-2012 21:26:16

El problema no es de MySQL sino del componente que usas para conectarte, yo uso Zeos y puedo utilizar sin problemas varias veces el mismo parámetro en la consulta. De hecho ni siquiera tengo que poner nada en los datos de cada parámetro, Zeos los crea automáticamente.

Código Delphi [-]
ZDataset.SQL.Add('SELECT :prueba,:prueba,:prueba');
ZDataset.ParamByNAme('prueba').AsInteger := 35;
ZDataset.Open;

TiammatMX 19-09-2012 03:13:59

Cita:

Empezado por AzidRain (Mensaje 443486)
El problema no es de MySQL sino del componente que usas para conectarte...

Yo tengo el MISMO problema con MS SQL Server, y después de mucho trastear, tuve que poner el mismo valor en tres parámetros diferentes (refiriéndome a tu caso, por ejemplo). Si por mí fuera, elegiría usar ZEOS, pero donde manda capitán...


La franja horaria es GMT +2. Ahora son las 20:03:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi