Delphi Xe5 firedac Ошибка блокировки базы данных с базой данных SQLite
Я пытаюсь создать простой объект для обработки всех функций, связанных с моей базой данных. У меня есть функции, чтобы вернуть набор данных или выполнить команду. Теперь, когда я вызываю это из моей программы, я могу получить записи, используя 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;
Спасибо
1 ответ
Попробуйте установить свойства подключения SharedCache
на "Ложь" и LockingMode
на "Нормальный".
Значением по умолчанию для режима блокировки соединения является "исключительный", что может вызвать эту проблему. Вы можете сделать это, щелкнув правой кнопкой мыши по компоненту подключения (в форме) и выбрав ConnectionEditor
(Я не совсем уверен, что это правильное английское слово, но оно должно называться примерно так), а затем установить эти значения.
В качестве альтернативы вы можете установить эти свойства в исходном коде:
connection.Params.Add('SharedCache=False');
connection.Params.Add('LockingMode=Normal');
Я не уверен, что это лучший способ решить эту проблему. Там может быть лучшее решение для этого.
Sharedcache = false - действительно лучший способ решить эту проблему. Компоненты уже поддерживают соединения во время разработки.
Потому что другие связи существуют. Проверьте компонент соединения в модуле данных MyFDConnection.Connected:=False;