PDA

Ver la Versión Completa : Insertar registros en Firebird


GustavoCruz
12-02-2010, 20:39:55
Hola amigos del foro, mi pregunta viene porque he estado intentando insertar unos registros pero no he podido lograr hacerlo.


de antemano mil gracias

Casimiro Notevi
12-02-2010, 20:48:46
¿Y por qué no has podido?

GustavoCruz
12-02-2010, 20:58:52
veras, yo conecto la base de datos y pongo el SQLtransaction. luego pongo el SQLQuery y en la propiedad de InsertSQL pongo la sentencia adecuada.

el problema es que cuando cierro la conección, se pierden los registro.

Al finalizar la inserción yo pongo SQLTransaction.CommintRetaing
y eso debería ser suficiente pero no...:mad:

De antemano mil gracias por vuestro tiempo y aportes

Casimiro Notevi
12-02-2010, 21:21:23
¿No habrás olvidado hacer 'post' después del insert?

marcoszorrilla
12-02-2010, 22:12:32
Haz caso a Casimiro:

procedure TfrProveedores.BitBtn1Click(Sender: TObject);
begin
if DmProv.IBDTsProv.State in [dsInsert, dsEdit] then
DmProv.IBDTsProv.Post;

procedure TDmProv.IBDTsProvAfterPost(DataSet: TDataSet);
begin
DmConex.IBTransaction.CommitRetaining;
end;


Un Saludo.

GustavoCruz
13-02-2010, 16:54:23
hola amigos, yo en lazarus escribo asì:
with SQLQuery1 do
begin
insertSQL.Clear;
insertSQL.Add('insert into tabla(campos) values(valores)');
...
end;


y eso debería ser suficiente para insertar los registros...

pero no funciona:mad:

Casimiro Notevi
13-02-2010, 17:42:42
¿No has leído el código que te ha puesto marcoszorrilla? :confused:, no es suficiente con que hagas el 'insert', debes hacer 'post' y luego 'commit', te falta el 'post' que viene a ser el comando que realmente graba los datos, luego el 'commit' confirma que se graben, pero te falta el post.

En tu código debes escribir algo así como:

with SQLQuery1 do
begin
insertSQL.Clear;
insertSQL.Add('insert into tabla(campos) values(valores)');

SQLQuery1.Post; <<-------------<

end;

GustavoCruz
13-02-2010, 18:36:49
Definitivamente no...:(

with SQLQuery1 do
begin
InsertSQL.Clear;
InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
+','''+Dbf1.Fields[1].AsString+''')');
ExecSQL;
Post;
end;

Gracias por vuestro tiempo


Gustavo Cruz

GustavoCruz
13-02-2010, 18:50:10
Tal vez el problema se encuentre en SQLTransaction

el tiene una Params, ¿Qué de se debe colocar?.

yo ahí no tengo nada.


Gracias de Antemano por vuestro tiempo


GustavoCruz

Casimiro Notevi
13-02-2010, 18:53:47
Amigo GustavoCruz, el problema es que no somos adivinos, debes contarnos lo más detallado posible la situación de lo que estás haciendo, porque así, con lo parco en palabras que estás siendo... es bastante difícil poder ayudarte, cuéntanos en detalle los componentes que usas, cómo están enlazados, qué procesos haces, pasos que das hasta llegar a esa función, mensajes de error o aviso que te salgan, resultados obtenidos, etc.

Casimiro Notevi
13-02-2010, 18:58:51
Tal vez el problema se encuentre en SQLTransaction
el tiene una Params, ¿Qué de se debe colocar?.
yo ahí no tengo nada.
Gracias de Antemano por vuestro tiempo
GustavoCruz

Lo debes tener enlazado con la base de datos.

GustavoCruz
13-02-2010, 19:53:24
Bueno amigos, ustedes disculpen mi torpeza...

tengo los siguientes componentes:
IBConnection1
SQLTransaction1
SQLQuery1

conecto la base de datos al IBConnection1, luego hago el enlace
IBConnection1 - SQLTransaction1; y los activo...
luego al SQLQuery1 le asigno el IBConnection1 y el SQLTransaction1

lanzo una consulta para probar que todo está bien y me funciona...

esto es lo que probé la primera vez:


SQLTransaction1.StartTransaction;
while not Dbf1.EOF do
begin
with SQLQuery1 do
begin
InsertSQL.Clear;
InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
+','''+Dbf1.Fields[1].AsString+''')');
ExecSQL;
end;
Dbf1.Next;
end;
SQLTransaction1.CommitRetaining;


eso me dio el siguiente error: 'EDatabaseError' Transaction already active

luego probé con esto:

SQLTransaction1.EndTransaction;
SQLTransaction1.StartTransaction;
while not Dbf1.EOF do
begin
with SQLQuery1 do
begin
InsertSQL.Clear;
InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
+','''+Dbf1.Fields[1].AsString+''')');
ExecSQL;
end;
Dbf1.Next;
end;
SQLTransaction1.CommitRetaining;



ya aquí no hay errores pero sigue sin insertar...

luego probé hacer como ustedes me sugirieron y tampoco...
PD. Dbf1 es el lugar donde estoy sacando los datos que necesito migrar...

Muchas Gracias

Casimiro Notevi
13-02-2010, 20:16:54
ok, amigo, ahora está más claro, vamos a ver si conseguimos solucionar ese problemita :)
La "cadena de conexión" de componentes debe ser: DataBase->Transaction->DataSet, supongo que el IBConnection es el que conecta a la base de datos, según has explicado:

conecto la base de datos al IBConnection1, luego hago el enlace
IBConnection1 - SQLTransaction1; y los activo...
luego al SQLQuery1 le asigno el IBConnection1 y el SQLTransaction1
Creo que el asunto va a estar ahí, el SQLQuery es un DataSet que haces bien en conectarlo a la base de datos (IBConnection), pero creo que está sobrando ahí el enlace con SQLTransaction. Tengo que confirmarlo porque no sé exactamente qué componentes son esos, pero prueba a quitar eso y además añade el .post que te aconsejamos antes.

SQLTransaction1.StartTransaction;
while not Dbf1.EOF do
begin
with SQLQuery1 do
begin
InsertSQL.Clear;
InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString +','''+Dbf1.Fields[1].AsString+''')');
ExecSQL;
Post; <---------------
end;
Dbf1.Next;
end;
SQLTransaction1.CommitRetaining;
Si no te funciona, entonces infórmame qué componentes son esos para yo hacer una prueba.

Chris
13-02-2010, 20:33:46
Hola, veo con gran asombro los consejos dados al compañero, me van a disculpar si sueno odioso, pero quiero corregir algo: Cuando estas trabajando directamente con un componente que ejecuta consultas directamente como lo es un TSQLQuery, no necesitas de la llamada al procedimiento Post. Las razones técnicas ya son conocidas pos los que conozcan el funcionamiento interno del TDataset (que es donde se implementa este procedimiento).

Por otro lado, veo que segue habiendo un vacío de información aquí. No se sabe cuál es la configuración que estás utilizando para la transacción. La configuración la puedes encontrar en la propiedad Params del componente de transacción.

Con respecto al error que tenías ("Transaction Already Active") el código que has utilizado no es lo recomentado. Prueba el siquiente:



if not SQLTransaction1.InTransaction then // iniciar la transacción si aún no se ha iniciado
SQLTransaction1.StartTransaction;

while not Dbf1.EOF do
begin
with SQLQuery1 do
begin
InsertSQL.Clear;
InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
+','''+Dbf1.Fields[1].AsString+''')');
ExecSQL;
end;
Dbf1.Next;
end;

SQLTransaction1.CommitRetaining;



Debes asegurarte que el componente SQLQuery1 esté enlazado a SQLTransaction1 y estos últimos tambien conectados al componente de conección a la base de datos.

Saludos y quedo a la espera de que nos digas que estás colocando en la propiedad Params del SQLTransaction1 :)

Chris
13-02-2010, 20:42:20
Analizando mejor el código, ahora creo que el problema no está en los parámetros de la transacción, sino en el propio código y componentes que estás utilizando.

Fijate en lo siguiente:


if not SQLTransaction1.InTransaction then // iniciar la transacción si aún no se ha iniciado
SQLTransaction1.StartTransaction;

while not Dbf1.EOF do
begin
with SQLQuery1 do
begin
InsertSQL.Clear;
InsertSQL.Add('insert into detable values('+Dbf1.Fields[0].AsString
+','''+Dbf1.Fields[1].AsString+''')');
ExecSQL;
end;
Dbf1.Next;
end;

SQLTransaction1.CommitRetaining;


Veo confuso ese código. El nombre de componente SQLQuery1 por su nombre parece ser un decendiente de TSQLQuery, no se porque estás usando una propiedad "InsertSQL" (o estás confundiendo en el código un componente distinto que se llama "InsertSQL" o es una propiedad del componente "SQLQuery1") Si fuera la primero, asegurate que el componente InsertSQL esté conectado a cómo te dije con respecto a SQLQuery1 en el post anterior. Si es lo segundo, estas resolviendo un problema con otro problema. Deberías utilizar un componente más sencillo, un desenciente de TSQLQuery, el que solo tiene una propiedad llamada SQL que es donde insertas la instrucción SQL que deseas ejecutar.

Espero hallas entendido lo que quise decir. Sino, no me molesta y con gran gusto te aclaro la idea. Saludos. //

Casimiro Notevi
13-02-2010, 21:13:49
Es que ese es el problema, Chris, que no tenemos datos concretos de qué tipo de componentes son esos, y así es difícil aconsejar.

GustavoCruz
13-02-2010, 21:17:34
Hola amigo Chris, efectivamente se trata de TSQLQuery (de esos que vienen con lazarus).
Y estos componentes tienen la propiedades
InsertSQL,
DeleteSQL,
UpdateSQL y
SQL.

yo, pues, utilizo InsertSQL. Pienso igualmente que el problema radica en los parámetros de la Transacción. Pues en fibplus el componente de transacción tiene unos parámetros e igual que los interbase, pero dichos parámetros cuando los copio al componente respectivo de Lazarus me muestra un error de esos... que son graves. haz la prueba y verás

Gracias por vuestro tiempo


Gustavo Cruz

GustavoCruz
13-02-2010, 21:23:23
Problema solucionado.
Dejé de utilizar la propiedad InsertSQL, del componente SQLQuery, por SQL
y me funcionó:D. no sé, pero si ponen esa propiedad es para que funcione....:D


Gracias a todos por vuestro tiempo

Gustavo Cruz