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 

Problema al ejecutar sql contra TDatabase

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema al ejecutar sql contra TDatabase Responder citando

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

Volver arriba
Mensaje    Asunto: Problema al ejecutar sql contra TDatabase Responder citando

¿Has probado a pasar como parametro un puntero al objeto TDatabase? Quizás pueda ser de eso
Volver arriba
Mensaje    Asunto: Problema al ejecutar sql contra TDatabase Responder citando

No creo que sea de eso, pero de todos modos lo he probado pero sigue sin funcionar. Produce un error de "Access violation en Idapi32.dll". A ver si alguien puede ayudarme.Gracias
Volver arriba
Mensaje    Asunto: Problema al ejecutar sql contra TDatabase Responder citando

el problema se produce al devolver el control la bd, ya que la sentencia llega a ejecutarse, pero no mola que de un error. Aunque lo cacheo y puedo pasar de el, algo falla.
Volver arriba
Mensaje    Asunto: Problema al ejecutar sql contra TDatabase Responder citando

HOLA:

Demasiado largo para mi gusto.
Pero sin mirar donde te da el error concretamente, creo que tienes un fallo algo gordo, utilizas un formulario para albergar los controles de bases de datos, deberias utilizar un datamodule.

Nota ¿te da el error con todas las sentencias o solo cuando haces una select?.

By.

Volver arriba
Mensaje    Asunto: Problema al ejecutar sql contra TDatabase Responder citando

hola Toño,
utilizo entre 150 y 200 formularios en mi proyecto, y todos con varias tablas. Si utilizo un datamodule para tablas que se repiten en varios formularios, que pueden estar abiertos a la vez, necesito varios TTable o TQuery para cada uno para que al actualizar la consulta en uno de un formulario no me modifique el del otro. Del mismo modo no me compensa crear un datamodule para cada formulario, ya que asi seria mas engorroso. ¿Es posible usando un datamodule, por ejemplo, usar 2 DBEdit en dos formularios distintos de modo que apunten a la misma tabla y mismo campo pero registros distintos?
Yo con el datamodule solo se organizar TTable y Querys y establecer sus relaciones. Desconozco si tiene opciones más avanzadas. Si puedes darme algún consejo sobre su utilización, te lo agradezco. Gracias
Volver arriba
Mensaje    Asunto: Problema al ejecutar sql contra TDatabase Responder citando

HOLA:

Muchos formularios, para replantearte meter un datamodule, Sin embargo lo que quieres hacer se sale un poco de la norma, veamos a mi lo que mas me interesa es que todos los formularios tengan informacion actualizada, e intento tener el menor numero de transacciones en el limbo.

El por que datamodule es un poco para eso, tambien lo utilizo como enlace a todos mis formularios, Ejemplo : Tengo una clase de configuracion que afectan a todos mi formularios que tengan datos "¿En que divisa estoy trabajando?", bien pues la declaro dentro de la clase del datamodule y ya me es comun.

¿¿De todas formas cual era tu pregunta ??.

By.

Volver arriba
Mensaje    Asunto: Problema al ejecutar sql contra TDatabase Responder citando

hola de nuevo,
la primera pregunta (esta arriba de todo)era sobre un error de Access Violation en idapi32.dll al ejecutar una sentencia sql de insert o update a través del método Execute de un TDatabase.Solo se produce si lo ejecuto dentro de una funcion creada por mi. Si lo ejecuto en un método OnClick de un boton funciona bien.
La otra pregunta es sobre el datamodule(aun no tengo muy claro como funciona). Si quiero tener 4 formularios abiertos simultaneamente y acceder con un mismo objeto Ttable o Tquery a distintos registros de una tabla en las diferentes ventanas, ¿si en el datamodule solo tengo definido un objeto para los 4 forms, al modificar el apuntador en uno, me va a cambiar el registro en todos?¿hay alguna solución?
Volver arriba
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.