Пример процедуры транзакции между Delphi и Firebird. Сразу извиняюсь за оформление, форматировать не стал. Достаточно простое на мой взгляд решение с откатом транзакции в случае исключения. Передаете строку sql-запроса в процедуру и все. Подойдет естественно не только для Insert. На форме должны быть типовые компоненты со вкладки InterBase. Сам помню долго искал, разбирался, потом правил под себя, в общем примерно такую конструкцию, ну плюс-минус, использую во всех своих приложениях.
Посмотрим насколько актуальна тема Delphi, если приходить будут разовью дальше.
procedure TMainForm.InsertSQL(QueryString: string);
begin
try
with IBQuery do
begin
SQL.Text := QueryString;
Transaction.StartTransaction;
ExecSQL;
Transaction.Commit;
Transaction.Active := false;
end;
except
on E: Exception do
begin
if IBQuery.Active then
IBQuery.Transaction.Rollback;
Application.MessageBox(PChar(E.Message), ‘Ошибка’, MB_ICONERROR);
end;
end;
end;
begin
try
with IBQuery do
begin
SQL.Text := QueryString;
Transaction.StartTransaction;
ExecSQL;
Transaction.Commit;
Transaction.Active := false;
end;
except
on E: Exception do
begin
if IBQuery.Active then
IBQuery.Transaction.Rollback;
Application.MessageBox(PChar(E.Message), ‘Ошибка’, MB_ICONERROR);
end;
end;
end;
у меня пишет ошибку «Transaction in active»
Попробуйте перед SQL.Text := QueryString; вставить Transaction.Active := False;
Где-то, возможно при открытии DataSet например, транзакция у вас не закрывается. Как вариант, можно использовать несколько транзакций.
старт, операторы и завершение транзакции выполняется в одном блоке кода, например в процедуре обработчика нажатия кнопки.