 |
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: Jue 15 Nov, 2012 1:05 pm Asunto: ¿Qué evento se ejecuta con ExecSQL? |
|
|
Estoy desarrollando una aplicación con Firebird y me viene una duda. Cada vez que tengo que hacer insert o update en una tabla, previamente hay que activar la transacción asociada a la base de datos. Lo estoy haciendo así:
| Código: | if (IBTransaction1->InTransaction)
IBTransaction1->StartTransaction();
Query->Close();
Query->SQL->Text = "UPDATE Concepto SET Emisor = 0 WHERE Emisor = :Emisor";
Query->ParamByName("Emisor")->AsInteger = Emisor->Tag;
try
{
Query->ExecSQL();
IBTransaction1->Commit();
}
catch(...)
{
IBTransaction1->Rollback();
return;
} |
Dado que siempre he de hacer eso me gustaría saber que evento del query, de la base de datos o de la transacción se dispara antes de ejecutar el ExecSQL. Ahora, por ejemplo, en el BeforOpen del query tengo puesto esto:
| Código: | void __fastcall TForm1::QueryBeforOpen (TDataSet *DataSet)
{
Query->Prepare();
}
//--------------------------------------------------------------------------- |
Y así siempre que se cierra el query queda preparado para la siguiente ejecución. ¿Hay algo parecido para el ExecSQL? _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
jugado1820 Ens

Registrado: 16 Jun 2010Mensajes: 37
|
Publicado: Mar 27 Nov, 2012 10:38 pm Asunto: |
|
|
| A ver, no se exactamente lo que quieres hacer. Si quieres dejar limpia la consulta, utiliza sql->Clear(); no close(); y antes del commit se ejecuta execsql. Commit y rollback son transacciones, commit si se ejecuta correctamente, guarda los cambios, en caso de error, volvemos al estado anterior con rollback. Pero antes del execsql no puedes ejecutar otra cosa, puesto que es la que inicia la consulta. Hay otra que es open(), pero esta se usa mas cuando la consulta devuelve algun valor. Espero haberte ayudado un poco. Un saludo |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 28 Nov, 2012 9:04 am Asunto: |
|
|
Gracias por la respuesta. Lo que me explicas ya lo sabía pero lo que quisiera evitar es tener que andar poniendo StartTransaction cada vez que tenga que actualizar la base de datos, de la misma forma que como explico hago con el Prepare. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
jugado1820 Ens

Registrado: 16 Jun 2010Mensajes: 37
|
Publicado: Mie 28 Nov, 2012 12:03 pm Asunto: |
|
|
Hola de nuevo ejej:
Bueno la verdad es que yo no programo arrastrando los objetos
y utilizando sus propiedades, yo lo hago con la programacion orientada
a objetos (POO). Eso mismo lo realizo yo asi:
Un constructor:
Tclientes::Tclientes(database *db)
{
ibtclientes = new TIBTable (NULL);
dsclientes = new TDataSource (NULL);
ibqCons = new TIBQuery(NULL);
dsCons = new TDataSource(NULL);
dbase = db;
//Ajuste propiedades tabla usuario
ibtclientes->Database = db->getDataBase();
ibtclientes->Transaction= db->getTransaction();
ibtclientes->TableName= "CLIENTES";
ibtclientes->Active = true;
dsclientes->DataSet = ibtclientes;
ibqCons->Database = db->getDataBase();
ibqCons->Transaction = db->getTransaction();
ibqCons->Active = false;
dsCons->DataSet = ibqCons;
}
y después ya puedes crear tus funciones para cualquier consulta si llamar al startransaction:
//Realizamos conexion y modificacion de la base de datos
ibqCons->Close();
ibqCons->SQL->Clear();
ibqCons->SQL->Add("update clientes set nombre=:name, direccion=:street,tlf1=:tlf1,tlf2=:tlf2,fax=:xaf where nombre=:origin");
//Metemos los datos
ibqCons->Params->ParamByName("origin")->AsString=origen;
ibqCons->Params->ParamByName("name")->AsString=nombre;
ibqCons->Params->ParamByName("street")->AsString=direccion;
ibqCons->Params->ParamByName("tlf1")->AsString=t1;
ibqCons->Params->ParamByName("tlf2")->AsString=t2;
ibqCons->Params->ParamByName("xaf")->AsString=fax;
dbase->estadoTransaccion(false);
dbase->trDARollback();
dbase->beginTR();
try
{
ibqCons->ExecSQL();
dbase->TRCommit();
ShowMessage("Los datos del cliente han sido modificados");
}
catch(...)
{
dbase->TRRollback();
ShowMessage("La modificacion del cliente ha fallado");
}
dbase->estadoTransaccion(true);
dbase->trDACommit();
}
Espero haberte ayudado algo un poco mas. Si quieres, creo que tengo por ahi, en mi blog un programilla creado por mi, software libre, utilizando este metodo y puede ayudarte, esta en interbase, pero se puede cambiar a tu sistema gestor de base de datos (SGBD). Es un ejemplo por si te sirve de ayuda.
Un saludo |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| 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.
|