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;

Другие вопросы по тегам