Cita:
Empezado por duilioisola
También puedes ejecutar cada sql en una transacción distinta.
Yo lo hago así en Delphi:
Código Delphi [-]
function DameTransactionRW(BaseDeDatos: TFIBDatabase; Q: TComponent = nil): TFIBTransaction;
begin
Result := TFIBTransaction.Create(Q);
with Result do
begin
DefaultDatabase := BaseDeDatos;
TRParams.Clear;
TRParams.Add('read_committed');
TRParams.Add('rec_version');
TRParams.Add('nowait');
end;
end;
function DameTransactionRO(BaseDeDatos: TFIBDatabase; Q: TComponent = nil): TFIBTransaction;
begin
Result := TFIBTransaction.Create(Q);
with Result do
begin
DefaultDatabase := BaseDeDatos;
TRParams.Clear;
TRParams.Add('read_committed');
TRParams.Add('read');
end;
end;
function DameId(Generador : string) : integer;
begin
with THYFIBQuery.Create(nil) do
begin
try
Close;
DataBase := DMMain.DataBase;
Transaction := DameTransactionRW(DMMain.DataBase);
try
if (not Transaction.InTransaction) then
Transaction.StartTransaction;
SelectSQL.Add('SELECT GEN_ID(' + Generador + ', 1) FROM RDB$DATABASE');
ExecQuery;
Result := FieldByName('GEN_ID'); <--- Pero aquí estás devolviendo un objeto y no un número que sería (FieldByName('GEN_ID').AsInteger) --> Esto sería lo correcto o estoy equivocado.
Close;
Transaction.Commit;
finally
Transaction.Free;
end;
finally
Free;
end;
end;
end;
|
Pues me gusta la forma que tienes de desvincular y, en caso de error de creación del componente, puedes poner también un except y devolver -1 en caso de error y, eso es para dejarlo fino.
Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Última edición por olbeup fecha: 08-11-2025 a las 19:53:45.
Razón: Aclaración
|