Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

¿Qué evento se ejecuta con ExecSQL?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: ¿Qué evento se ejecuta con ExecSQL? Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por la ayuda.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.