Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2009-09

tquery insertSQL

13 messages · 4 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Rafael Bidegain

Hola a todos.

Perd�n si la pregunta es reiterada. Intuyo que s� lo es, pero despues de buscar con google y no encontrar ninguna ayuda no me queda mas alternativa que realizarla en la lista.

estoy haciendo una prueba con mysql 5 en linux con lazarus 0.9.24

tengo un componente mysql50connection, un sqltransaction, un sqlquery un dataset un dbgrid y un dbnavigator
con esos elementos ejecuto un select * desde una tabla y funciona. (cosa que me permite asegurar que todo esta configurado correctamente)

tengo un error "sql statement not set" cuando intento ejecutar un insert de esta manera:

procedure TMySQL.btInsertClick(Sender: TObject);
begin
     SQLQuery1.Active := false;
     SQLQuery1.SQL.clear;
     SQLQuery1.ParseSQL := false;
     SQLQuery1.InsertSQL.clear;
     SQLQuery1.InsertSQL.Add('insert into tabla_prueba (cadena,
numero) values ("hola", 10)');
     SQLQuery1.Active := true;
     SQLQuery1.Open;
     SQLQuery1.Insert;
     SQLQuery1.Post;
     SQLQuery1.ApplyUpdates;
end;

� qu� estoy haciendo mal ?

gracias

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

Claudio Romero
to Rafael Bidegain

Bueno te paso lo que uso en mis sistemas, aunque lo uso para Firebird, lo puedes adaptar para MySql
Le da 2 parametros la sentencia SQL (insert,update,delete) y la coneccion y listo. En una sola linea hace todo. Chequea uses db, sqldb (seguro ya las tienes)
Para mi deberias actualizar a la version 0.9.27 svn, que es la proxima 0.9.28, porque la 0.9.24 tenia muchos errores, ya corregidos.

procedure EjecutaSql(consulta:string;IBexecSql:TIBConnection);
var SQLQuery1:TSQLQuery;SQLTransaction1:TSQLTransaction;
begin
	try
	    SQLQuery1:=TSQLQuery.Create(nil);
    	SQLTransaction1:=TSQLTransaction.Create(nil);
        SQLTransaction1.DataBase:=IBexecSql;
        SQLQuery1.UsePrimaryKeyAsKey:=false;
        SQLQuery1.Transaction:=SQLTransaction1;
        //
        SQLQuery1.SQL.add(consulta);
        try
  		    SQLTransaction1.StartTransaction;
    		SQLQuery1.ExecSQL;
            SQLTransaction1.Commit;
        except on e:exception do
           	begin
            	SQLTransaction1.Rollback;
            	ShowMessage('procedure EjecutaSql'+#13+'Error al
ejecutar: '+#13+consulta+#13+e.message);
			end;
        end;
	finally
    	SQLTransaction1.free;
	    SQLQuery1.free;
	end;
end;

Saludos

El d�a 29 de septiembre de 2009 11:04, Rafael Bidegain <r.bidegain en gmail.com> escribi�:

Show quoted text 45 lines
Hola a todos. Perd�n si la pregunta es reiterada. Intuyo que s� lo es, pero despues de buscar con google y no encontrar ninguna ayuda no me queda mas alternativa que realizarla en la lista. estoy haciendo una prueba con mysql 5 en linux con lazarus 0.9.24 tengo un componente mysql50connection, un sqltransaction, un sqlquery un dataset un dbgrid y un dbnavigator con esos elementos ejecuto un select * desde una tabla y funciona. (cosa que me permite asegurar que todo esta configurado correctamente) tengo un error "sql statement not set" cuando intento ejecutar un insert de esta manera: procedure TMySQL.btInsertClick(Sender: TObject); begin SQLQuery1.Active := false; SQLQuery1.SQL.clear; SQLQuery1.ParseSQL := false; SQLQuery1.InsertSQL.clear; SQLQuery1.InsertSQL.Add('insert into tabla_prueba (cadena, numero) values ("hola", 10)'); SQLQuery1.Active := true; SQLQuery1.Open; SQLQuery1.Insert; SQLQuery1.Post; SQLQuery1.ApplyUpdates; end; � qu� estoy haciendo mal ? gracias -- Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse) _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Reply by email

Horacio Jamilis
to Rafael Bidegain: Hola a todos. Perd�n si la pregunta es reiterada. Intuyo que s� lo es, pero despues…

Veo dos detalles probables:

1) estas poniendo hola entre comillas dobles ("), y supongo que debe ir entre comillas simples (') ... pero al estar insertandolo por c�digo va a ir duplicada ('').
2) Estas poniendo una sentencia de inserci�n en SQL, la que se deber�a ejecutar con SQLQuery1.ExecSQL. El metodo .Open es solo para abrir consultas (SELECT).

Suerte

Horacio

Rafael Bidegain escribi�:

Show quoted text 35 lines
Hola a todos. Perd�n si la pregunta es reiterada. Intuyo que s� lo es, pero despues de buscar con google y no encontrar ninguna ayuda no me queda mas alternativa que realizarla en la lista. estoy haciendo una prueba con mysql 5 en linux con lazarus 0.9.24 tengo un componente mysql50connection, un sqltransaction, un sqlquery un dataset un dbgrid y un dbnavigator con esos elementos ejecuto un select * desde una tabla y funciona. (cosa que me permite asegurar que todo esta configurado correctamente) tengo un error "sql statement not set" cuando intento ejecutar un insert de esta manera: procedure TMySQL.btInsertClick(Sender: TObject); begin SQLQuery1.Active := false; SQLQuery1.SQL.clear; SQLQuery1.ParseSQL := false; SQLQuery1.InsertSQL.clear; SQLQuery1.InsertSQL.Add('insert into tabla_prueba (cadena, numero) values ("hola", 10)'); SQLQuery1.Active := true; SQLQuery1.Open; SQLQuery1.Insert; SQLQuery1.Post; SQLQuery1.ApplyUpdates; end; � qu� estoy haciendo mal ? gracias

Reply by email

Rafael Bidegain
to Claudio Romero: Bueno te paso lo que uso en mis sistemas, aunque lo uso para Firebird, lo puedes adaptar…

El d�a 29 de septiembre de 2009 11:24, Claudio Romero <clauslack en gmail.com> escribi�:

Show quoted text 5 lines
Bueno te paso lo que uso en mis sistemas, aunque lo uso para Firebird, lo puedes adaptar para MySql Le da 2 parametros la sentencia SQL (insert,update,delete) y la coneccion y listo. En una sola linea hace todo. Chequea uses db, sqldb (seguro ya las tienes)

as� funciona. Pero. �entonces me recomiendas que en todos los casos use SQLQuerysql en lugar de SQLQuery.InsertSQL, SQLQuery.DeleteSQL, SQLQuery.UpdateSQL ?

Para mi deberias actualizar a la version 0.9.27 svn, que es la proxima 0.9.28, porque la 0.9.24 tenia muchos errores, ya corregidos.

ya baje la version del svn, pero tuve problemas para compilarla y como estoy apurado opt� por usar las versiones de la distribucion que estoy usando
esta version me dio problemas con los tnotebooks, la version 0.9.26 tiene un problema muy grande en el equipo que uso. se cierra el ide por el bloq de notas (uso gkt2). vi que hay un parche pero todav�a no lo pude poner.

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

Claudio Romero
to Rafael Bidegain

SQLQuery.sql en lugar de SQLQuery.InsertSQL, SQLQuery.DeleteSQL, SQLQuery.UpdateSQL ?

SQLQuery.sql con SQLQuery.ExecSql funciona con bien con los insert, update, delete.
Francamente no se como se usan SQLQuery.InsertSQL, SQLQuery.DeleteSQL, SQLQuery.UpdateSQL ? Por algun forum presentaban algun problema. Pero nunca las use.

Sobre la 0.9.24, si te funciona asi no hay problema. Ten en cuenta las comillas.
Si debes pasar una cadena con comillas (porque lo requiere la base de datos)
utiliza QuotedStr('hola')   -> en la base llegaria 'hola'
Sino puedes usar sentencias parametrizadas:(seguro funciona en MySql)
Ej:(no lo compile :)
consulta:='insert into p_ucm_t (CODIGO, NOMBRE) VALUES ( :CODIGO, :NOMBRE)';
SQLQuery1.Sql.clear;
SQLQuery1.Sql.add(consulta);
with SQLQuery1.params do begin
    ParamByName('CODIGO').asinteger:= 21095;
    ParamByName('NOMBRE').asstring:= 'CLAUDIO';
end;
SQLQuery1.ExecSQL;
//Recuerda las transacciones StartTransaction y luego Commit

Saludos

Reply by email

Rafael Bidegain
to Horacio Jamilis: Veo dos detalles probables: 1) estas poniendo hola entre comillas dobles ("), y supongo…

Hola Horacio

El d�a 29 de septiembre de 2009 11:27, Horacio Jamilis <hjamilis en pymesoft.com.ar> escribi�:

Show quoted text 5 lines
Veo dos detalles probables: 1) estas poniendo hola entre comillas dobles ("), y supongo que debe ir entre comillas simples (') ... pero al estar insertandolo por c�digo va a ir duplicada ('').

aparentemente no es problema, porque con la solucion de Claudio funciona bien.

2) Estas poniendo una sentencia de inserci�n en SQL, la que se deber�a ejecutar con SQLQuery1.ExecSQL. �El metodo .Open es solo para abrir consultas (SELECT).

buen detalle!, pero obtengo el mismo error.
no me estar� faltando especificar que lo que quiero que se ejecute es la instruccion que est� en SQLQuery1.InsertSQL ?

Suerte

Gracias!

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

Rafael Bidegain
to Claudio Romero: SQLQuery.sql en lugar de SQLQuery.InsertSQL, SQLQuery.DeleteSQL, SQLQuery.UpdateSQL ?…

El d�a 29 de septiembre de 2009 12:38, Claudio Romero <clauslack en gmail.com> escribi�:

Show quoted text 8 lines
SQLQuery.sql en lugar de SQLQuery.InsertSQL, SQLQuery.DeleteSQL, SQLQuery.UpdateSQL � ? SQLQuery.sql con SQLQuery.ExecSql funciona con bien con los insert, update, delete. Francamente no se como se usan SQLQuery.InsertSQL, SQLQuery.DeleteSQL, SQLQuery.UpdateSQL ? �Por algun forum presentaban algun problema. Pero nunca las use.

ok. gracias

Show quoted text 16 lines
Sobre la 0.9.24, si te funciona asi no hay problema. Ten en cuenta las comillas. Si debes pasar una cadena con comillas (porque lo requiere la base de datos) utiliza QuotedStr('hola') � -> en la base llegaria 'hola' Sino puedes usar sentencias parametrizadas:(seguro funciona en MySql) Ej:(no lo compile :) consulta:='insert into p_ucm_t (CODIGO, NOMBRE) VALUES ( :CODIGO, :NOMBRE)'; SQLQuery1.Sql.clear; SQLQuery1.Sql.add(consulta); with SQLQuery1.params do begin � �ParamByName('CODIGO').asinteger:= 21095; � �ParamByName('NOMBRE').asstring:= 'CLAUDIO'; end; SQLQuery1.ExecSQL; //Recuerda las transacciones StartTransaction y luego Commit

justamente estaba por abrir otro hilo para preguntar sobre el uso de par�metros tu ejemplo me ayud� a resolver el inconveniente.

yo estaba usando algo como esto:

SQLQuery1.Params.CreateParam(ftString, 'mi_cadena', ptInput);
SQLQuery1.Params.ParamByName('mi_cadena').AsString := 'Hola';
SQLQuery1.Params.CreateParam(ftInteger, 'mi_numero', ptInput);
SQLQuery1.Params.ParamByName('mi_numero').AsInteger := 100;
SQLQuery1.SQL.Add('insert into tabla_prueba (cadena, numero) values
(:mi_cadena, :mi_numero)');

pero siempre insertaba valores nulos.
el resolv� el problema cuando vi tu ejemplo y advert� que deb�a escribir el sql antes de crear y setear los par�metros.

muchas gracias.

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

JoshyFun
to Claudio Romero: SQLQuery.sql en lugar de SQLQuery.InsertSQL, SQLQuery.DeleteSQL, SQLQuery.UpdateSQL ?…

Hello Claudio,

Tuesday, September 29, 2009, 5:38:11 PM, you wrote:

CR> SQLQuery.sql en lugar de SQLQuery.InsertSQL, SQLQuery.DeleteSQL, CR> SQLQuery.UpdateSQL ?

CR> SQLQuery.sql con SQLQuery.ExecSql funciona con bien con los insert, CR> update, delete.
CR> Francamente no se como se usan SQLQuery.InsertSQL, SQLQuery.DeleteSQL, CR> SQLQuery.UpdateSQL ? Por algun forum presentaban algun problema. Pero CR> nunca las use.

Los SQLQuery.InsertSQL, etc, son para cuando est�s modificando un dataset con un control visual como un dbgrid a menos que el select sea muy simple (Select * from XXX) el control visual no sabr� como hacer el insert, por lo tanto tenemos que darle una nueva sentencia SQL que usar� en el caso de las inserciones.

Un ejemplo, tenemos un dbgrid que rellenamos con un select tal que as�:

Select * from T1 inner join T2 on T1.code=T2.Code

No hay forma de saber como hacer un insert ah�, ya que los datos pueden ser cosa s�lo de T1, o tener que ir cosas a ambas tablas, as� que creamos un insertSQL con algo parecido a esto:

INSERT INTO T1 (Number,Code) values (:Number,:Code);

Sin a�adir nada a T2 en este caso claro.

Best regards, JoshyFun

Reply by email

JoshyFun
to Rafael Bidegain: El d�a 29 de septiembre de 2009 12:38, Claudio Romero <clauslack en gmail.com>…

Hello Rafael,

Tuesday, September 29, 2009, 6:22:04 PM, you wrote:

RB> pero siempre insertaba valores nulos.
RB> el resolv� el problema cuando vi tu ejemplo y advert� que deb�a RB> escribir el sql antes de crear y setear los par�metros.

No hace falta que crees los par�metros, lo hace la linea SQL autom�ticamente (a menos que quieras especificarle el tipo de datos exacto).

Best regards, JoshyFun

Reply by email

Rafael Bidegain
to JoshyFun: CR> SQLQuery.sql en lugar de SQLQuery.InsertSQL, SQLQuery.DeleteSQL, CR>…

Hola JoshyFun

El d�a 29 de septiembre de 2009 14:14, JoshyFun <joshyfun en gmail.com> escribi�:

Show quoted text 10 lines
Un ejemplo, tenemos un dbgrid que rellenamos con un select tal que as�: Select * from T1 inner join T2 on T1.code=T2.Code No hay forma de saber como hacer un insert ah�, ya que los datos pueden ser cosa s�lo de T1, o tener que ir cosas a ambas tablas, as� que creamos un insertSQL con algo parecido a esto: INSERT INTO T1 (Number,Code) values (:Number,:Code);

podr�as indicarme como ejecutar esta linea seteando:

SQLQuery1.InsertSQL.Add('INSERT INTO T1 (Number,Code) values (:Number,:Code)');
yo obtengo  "sql statement not set" cuando ejecuto
SQLQuery1.ExecSQL;

gracias

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

Rafael Bidegain
to JoshyFun: RB> pero siempre insertaba valores nulos. RB> el resolv� el problema cuando vi tu…

El d�a 29 de septiembre de 2009 14:21, JoshyFun <joshyfun en gmail.com> escribi�:

Show quoted text 11 lines
Hello Rafael, Tuesday, September 29, 2009, 6:22:04 PM, you wrote: RB> pero siempre insertaba valores nulos. RB> el resolv� el problema cuando vi tu ejemplo y advert� que deb�a RB> escribir el sql antes de crear y setear los par�metros. No hace falta que crees los par�metros, lo hace la linea SQL autom�ticamente (a menos que quieras especificarle el tipo de datos exacto).

gracias! lo advert� con el ejemplo de Claudio.

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email

JoshyFun
to Rafael Bidegain: Hola JoshyFun El d�a 29 de septiembre de 2009 14:14, JoshyFun <joshyfun en gmail.com>…

Hello Rafael,

Tuesday, September 29, 2009, 7:25:30 PM, you wrote:

RB> podr�as indicarme como ejecutar esta linea seteando:
RB> SQLQuery1.InsertSQL.Add('INSERT INTO T1 (Number,Code) values (:Number,:Code)');
RB> yo obtengo  "sql statement not set" cuando ejecuto
RB> SQLQuery1.ExecSQL;

Hace algunos meses que no ando con el SQL as� que la sintaxis puede estar mal :( pero SQLQuery1.ExecSQL SIEMPRE ejecuta lo contenido en SQLQuery1.SQL los UpdateSQL, InsertSQL y DeleteSQL son para ser usados por el dbgrid y otros autom�ticamente, no son para que tu los llames por c�digo manualmente.

Por ponerlo de otro modo, InsertSQL s�lo se ejecutar�a si existiera un m�todo "SQLQuery1.Insert" cosa que no existe.

B�sicamente lo que hace un dataset cuando tiene que hacer un insert es:

if SQLQuery1.InsertSQL'' then begin
  OldSQL:=SQLQuery1.SQL;
  SQLQuery1.SQL:=SQLQuery1.InsertSQL;
  for j:=0 to pamaters do begin
  //set paramenters
  end;
  SQLQuery1.ExecSQL;
  SQLQuery1.SQL:=OldSQL;
end;
Best regards, JoshyFun

Reply by email

Rafael Bidegain
to JoshyFun

El d�a 29 de septiembre de 2009 15:13, JoshyFun <joshyfun en gmail.com> escribi�:

Show quoted text 30 lines
Hello Rafael, Tuesday, September 29, 2009, 7:25:30 PM, you wrote: RB> podr�as indicarme como ejecutar esta linea seteando: RB> SQLQuery1.InsertSQL.Add('INSERT INTO T1 (Number,Code) values (:Number,:Code)'); RB> yo obtengo �"sql statement not set" cuando ejecuto RB> SQLQuery1.ExecSQL; Hace algunos meses que no ando con el SQL as� que la sintaxis puede estar mal :( pero SQLQuery1.ExecSQL SIEMPRE ejecuta lo contenido en SQLQuery1.SQL los UpdateSQL, InsertSQL y DeleteSQL son para ser usados por el dbgrid y otros autom�ticamente, no son para que tu los llames por c�digo manualmente. Por ponerlo de otro modo, InsertSQL s�lo se ejecutar�a si existiera un m�todo "SQLQuery1.Insert" cosa que no existe. B�sicamente lo que hace un dataset cuando tiene que hacer un insert es: if SQLQuery1.InsertSQL'' then begin �OldSQL:=SQLQuery1.SQL; �SQLQuery1.SQL:=SQLQuery1.InsertSQL; �for j:=0 to pamaters do begin �//set paramenters �end; �SQLQuery1.ExecSQL; �SQLQuery1.SQL:=OldSQL; end;

ok. muchas gracias por la explicaci�n. con eso me alcanza para investigar el uso de insertSQL, UpdateSQL y DeleteSQL cuando tenga listo un ejemplo lo voy a subir al wiki para que le sirva a otros.

saludos.

Rafael Bidegain Ya que los cuerdos no hablan, hablar� el loco. (The Fool, Padraic Pearse)

Reply by email