hola,
antes de nada puesta en situacion:
cuando dentro de un método (en este caso en el OnClick de un boton) intento ejecutar una sentencia sql hard-coded contra un Tdatabase definido en MainForm no tengo ningún tipo de problema:
...
sql_sentencia="insert into...";
sql_sentencia2="insert into...";
if(!MainForm->db1->InTransaction)
MainForm->db1->StartTransaction(); //--------
try
{
MainForm->db1->Execute(sql_sentencia, NULL, false, NULL);
}
catch(EDBEngineError &e)
{
MessageDlg(e.Message, mtWarning, TMsgDlgButtons() <<mbOK, 0);
if(MainForm->db1->InTransaction)
MainForm->db1->Rollback();
ShowMessage(sql_sentencia);
return;
}
try
{
MainForm->db1->Execute(sql_sentencia2, NULL, false, NULL);
}
catch(EDBEngineError &e)
{
MessageDlg(e.Message, mtWarning, TMsgDlgButtons() <<mbOK, 0);
if(MainForm->db1->InTransaction)
MainForm->db1->Rollback();
ShowMessage(sql_sentencia2);
return;
}
//------------
if(MainForm->db1->InTransaction)
MainForm->db1->Commit();
esto anterior funciona dpm pero como ese fragmento lo utilizo con bastante frecuencia he pensado en emplear una funcion que lo aisle del siguiente modo:
bool __fastcall TMainForm::ExecSQLdb (AnsiString sql_sentencia)
{
try
{
db1->Execute(sql_sentencia, NULL, false, NULL);
}
catch(EDBEngineError &e)
{
MessageDlg(e.Message, mtWarning, TMsgDlgButtons() <<mbOK, 0);
if(db1->InTransaction)
db1->Rollback();
ShowMessage(sql_sentencia);
return false;
}
catch (EAccessViolation &e)
{
ShowMessage (e.Message);
if(db1->InTransaction)
db1->Rollback();
return false;
}
return true;
}
en este caso me resultaria algo asi lo que me facilita crear varios insert o updates en una transaccion...
...
sql_sentencia="insert into...";
sql_sentencia2="insert into...";
if(!MainForm->db1->InTransaction)
MainForm->db1->StartTransaction();
if (!MainForm->ExecSQLdb(sentencia_sql)) return;
if (!MainForm->ExecSQLdb(sentencia_sql2)) return;
if(MainForm->db1->InTransaction)
MainForm->db1->Commit();
//-------
el problema es que al ejecutar la sentencia contra la bd dentro de otra funcion me produce un error de Access Violation en idapi32.dll
Espero que alguien pueda aconsejarme algo.Muchas