Я пытаюсь создать простой объект для обработки всех функций, связанных с моей базой данных. У меня есть функции для возврата набора данных или выполнения команды. Теперь, когда я вызываю это из своей программы, я могу извлекать записи с помощью Execute_Dataset, и он работает нормально, но когда я делаю изменения и выполняю команду, вызывая Execute_Command, я получаю сообщение об ошибке «база данных заблокирована» при вызове транзакции фиксации. Я пробовал все, что я мог бы быть, это все еще происходит. Может ли кто-нибудь пролить свет на то, что я делаю неправильно, и как я могу предотвратить это.
function TConnectionManager.Execute_Dataset(const ASql: string; const AParams:
array of variant; out VDataset: TDataset; const ATrn_Name: string): Boolean;
var
lTrn: TFDTransaction;
lQry: TFDQuery;
begin
Result := True;
lTrn:= TFDTransaction.Create (Self);
try
lTrn.Connection := FConnection;
lTrn.StartTransaction;
lQry := TFDQuery.Create (Self);
lQry.Connection := FConnection;
lQry.Transaction := lTrn;
try
if Length (AParams) > 0
then lQry.Open (ASql, AParams)
else lQry.Open (ASql);
VDataset := lQry;
Result := True;
{ Commit transaction if started within the procedure }
lTrn.Commit;
except
on e:Exception
do begin
{ Rollback transaction if started within the procedure }
lTrn.Rollback;
lQry.DisposeOf;
//log
raise;
end;
end;
finally
lTrn.DisposeOf;
end;
end;
procedure TConnectionManager.Execute_Command(const ASql: string; const AParams:
array of variant; const ATrn_Name: string);
var
lTrn: TFDTransaction;
lQry: TFDQuery;
begin
lTrn:= TFDTransaction.Create (Self);
try
lTrn.Connection := FConnection;
lTrn.StartTransaction;
lQry := TFDQuery.Create (Self);
lQry.Connection := FConnection;
lQry.Transaction := lTrn;
try
{ Execute command }
if Length (AParams) > 0
then lQry.ExecSQL (ASql, AParams)
else lQry.ExecSQL (ASql);
{ Commit transaction if started within the procedure }
lTrn.Commit;
except
on e:Exception
do begin
{ Rollback transaction if started within the procedure }
lTrn.Rollback;
//log
raise;
end;
end;
finally
lQry.DisposeOf;
lTrn.DisposeOf;
end;
end;
Спасибо
View as text
в контекстном меню и найдите соединение. Вы можете увидеть значения свойств компонента из полученного текста. Скопируйте их в буфер обмена. Затем щелкните текст правой кнопкой мыши, выберитеView as form
и вставьте содержимое буфера обмена в комментарий в своем коде. Затем вы можете установить те же самые свойства в своем коде (и знать, какие значения вы должны присвоить этим свойствам). - person Ken White   schedule 10.04.2014ATrn_Name
, который вы никогда не используете? Каково содержимоеASql
при возникновении исключения? Какой была последняя операция перед исключением (что было сделано последним перед тем, какExec_Command
вызвало исключение)? Если та же самая настройка работает с компонентом в форме, что сообщает вам отладчик, когда вы выполняете код? Здесь много недостающих деталей. - person Ken White   schedule 10.04.2014