 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 18 Oct, 2013 11:59 am Asunto: Se cierra solo un query |
|
|
Estoy usando Firebird con C++ 6. Tengo este código con dos TIBQuery:
| Código: | Query->Close();
Query->SQL->Text = "INSERT INTO Cuentas (Padre, Cuenta, Defecto) VALUES (:Padre, :Cuenta, :Defecto)";
qTemp->Close();
qTemp->SQL->Text = "SELECT DISTINCT A.Padre, B.Cuenta, B.Defecto FROM ALU_TEMP A, CUE_TEMP B WHERE A.Referencia||A.Recibo = B.Referencia";
qTemp->Open();
for (; !qTemp->Eof; qTemp->Next())
{
if (!tColegio->InTransaction)
tColegio->StartTransaction();
Query->Close();
Query->ParamByName("Padre")->AsInteger = qTemp->FieldByName("Padre")->AsInteger;
Query->ParamByName("Cuenta")->AsString = qTemp->FieldByName("Cuenta")->AsString;
Query->ParamByName("Defecto")->AsInteger = qTemp->FieldByName("Defecto")->AsInteger;
try
{
Query->ExecSQL();
tColegio->Commit();
}
catch(...)
{
tColegio->Rollback();
}
} |
Hace el primer insert pero cuando debería avanzar al segundo registro de lectura me dice que que no porque el dataset está cerrado (Cannot perform this operation on a closed dataset). Si fuera cierto no debría leer ni el primer registro.
He probado, en vez de un bucle, a hacer un INSERT masivo:
| Código: | INSERT INTO Cuentas (Padre, Cuenta, Defecto) SELECT DISTINCT A.Padre, B.Cuenta, B.Defecto FROM ALU_TEMP A, CUE_TEMP B WHERE A.Referencia||A.Recibo = B.Referencia |
y me da un error de violacion de claves (la tabla está indexada por padre y cuenta).
¿A alguien se le ocurre alguna idea? _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 19 Oct, 2013 8:18 am Asunto: |
|
|
Hola Angel
Yo de firebird tengo poca idea, pero creo que tienes un "fallito" en el código
¿has probado a hacer esto? | Código: |
try
{
Query->SQL->Text = "INSERT INTO Cuentas (Padre, Cuenta, Defecto) VALUES (:Padre, :Cuenta, :Defecto)";
Query->ExecSQL();
tColegio->Commit();
}
catch(...)
{
|
o incluso poniendo el Query->Close(); dentro del try
Saludos |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 21 Oct, 2013 9:23 am Asunto: |
|
|
Ya lo resolví. Basta con poner CommitRetaining() y RollbackRetainig() en vez de Commit() y Rollback(). Queda así:
| Código: | Query->Close();
Query->SQL->Text = "INSERT INTO Cuentas (Padre, Cuenta, Defecto) VALUES (:Padre, :Cuenta, :Defecto)";
qTemp->Close();
qTemp->SQL->Text = "SELECT DISTINCT A.Padre, B.Cuenta, B.Defecto FROM ALU_TEMP A, CUE_TEMP B WHERE A.Referencia||A.Recibo = B.Referencia";
qTemp->Open();
for (; !qTemp->Eof; qTemp->Next())
{
if (!tColegio->InTransaction)
tColegio->StartTransaction();
Query->Close();
Query->ParamByName("Padre")->AsInteger = qTemp->FieldByName("Padre")->AsInteger;
Query->ParamByName("Cuenta")->AsString = qTemp->FieldByName("Cuenta")->AsString;
Query->ParamByName("Defecto")->AsInteger = qTemp->FieldByName("Defecto")->AsInteger;
try
{
Query->ExecSQL();
tColegio->CommitRetaining();
}
catch(...)
{
tColegio->RollbackRetaining();
}
} |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Kusop Cdt

Registrado: 04 Oct 2004Mensajes: 4Ubicación: Toledo - España
|
Publicado: Mie 30 Oct, 2013 2:59 pm Asunto: |
|
|
Hola,
Si no me equivoco has asignado el objeto transacción tColegio a ambos querys (Query y qTemp), cuando haces el commit la transacción cierra todos sus cursores asociados (en este caso Query y qTemp) con lo cual al ir a consultar los query estos están cerrados.
En este caso lo correcto consiste en asociar una transacción a cada query y no tendrás mas problemas.
El commitretaining termina por degradar el rendimiento según va pasando el tiempo.
Un saludo. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 30 Oct, 2013 5:31 pm Asunto: |
|
|
| Kusop escribió: | | Si no me equivoco has asignado el objeto transacción tColegio a ambos querys (Query y qTemp), cuando haces el commit la transacción cierra todos sus cursores asociados (en este caso Query y qTemp) con lo cual al ir a consultar los query estos están cerrados. |
Gracias por contestar; no era el caso: cada query tiene asignada una transacción diferente, pero con el CommitRetainig se resolvió el problema. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|