PDA

Ver la Versión Completa : Missing right quote


luisny
17-03-2004, 13:37:18
Hola a todos.

Mi pregunta es: ¿Cómo evitar el error "Missing right quote" en una sentencia SQL en firebird?.

Un saludo.

Gracias

delphi.com.ar
17-03-2004, 14:11:08
No conozco FireBird, pero el error creo que es claro, falta una comilla a la izquierda. Posiblemente has avierto un string y nunca lo has cerrado, por ejemplo

INSERT INTO TABLA (CAMPO) VALUES('Texto')

luisny
17-03-2004, 14:50:21
gracias delphi.com.ar


el problema es que estaba haciendo una consulta tal que:



TQuery1(Sender1).SQL[0]='SELECT * FROM PROVEEDORES WHERE NOMBRE =' + TQuery2(Sender2).FieldByName('NOMBRE').AsString;


donde TQuery2(Sender2).FieldByName('NOMBRE').AsString puede contener nombres como SEAN O'DONELL



Gracias de nuevo.

delphi.com.ar
17-03-2004, 15:08:32
Bueno, puedes utilizar la función QuotedStr para prevenir este tipo de errores.

Saludos!

jachguate
17-03-2004, 15:14:10
falta una comilla a la izquierda En realidad, falta una comilla a la derecha, aunque lo importante es simplemente que falta una comilla, pequeño desliz del amigo delphi.com.ar...

Para evitar ese problema... es mejor hacer uso de la función QuotedStr...

TQuery1(Sender1).SQL[0]='SELECT * FROM PROVEEDORES WHERE NOMBRE =' + QuotedStr(TQuery2(Sender2).FieldByName('NOMBRE').AsString);

o claro... el uso de parámetros...


TQuery1(Sender1).SQL[0] :=
'SELECT * FROM PROVEEDORES WHERE NOMBRE = :Nombre';
(Sender1 as TQuery).ParamByName('Nombre').AsString :=
(Sender2 as TQuery).FieldByName('NOMBRE').AsString;


Hasta luego.

;)

Jvilomar
19-03-2004, 13:13:07
Hola Juan....Delphi....Luisny....

Mi pregunta es la siguiente: podria alguno de ustedes explicarme el codigo descrito mas arriba? por que utilizan las clase sender para manejar la cadena SQL y al mismo tiempo para pasarle los parametros al query?...me gustaria saber si esta forma es mucho mas conveniente que la convencional ( o mejor dicho la que yo conocia hasta ahora);

Gracias....

delphi.com.ar
19-03-2004, 14:29:47
Me parece que ese código no es muy real, me llaman la atención las clases TQuery1 y TQuery2... y las variables Sender1 y Sender2, pero:

Si tienes un evento que dispara un DataSet, o llamas a un evento, con el parámetro asignado a un dataset, puedes usar este parámetro para hacer referencia al DataSet. Obviamente que si se trata de un Form, con un solo dataset, o sabes que ese evento solo actualizará un dataset, es mucho mas rápido acceder a este por la variable que lo contiene, que hacer estos malabares.

Otra cosa que no me agrada mucho, es que solo asigne la primer línea del Sql (SQL[0]), ya que si en alguna momento asigna mas de una línea o una línea tiene un CR+LF, esto producirá errores impredecibles.

procedure TMiForm.MiEvento(Sender: TObject);
begin
if Sender is TQuery Then
with Sender as TQuery do
begin
Sql.Text := 'SELECT....';
Open;
....
end;