2014-04-09 59 views
1

我想創建一個簡單的對象來處理我所有的數據庫相關的功能。我有一個函數來返回一個數據集或執行一個命令。現在,當我從我的程序調用這個時,我能夠使用Execute_Dataset獲取記錄,並且它工作正常,但是當我通過調用Execute_Command執行更改並執行命令時,在調用commit事務時出現「數據庫已鎖定」錯誤。我已經嘗試過所有可能會發生的事情。有人能說出我在做錯什麼,以及如何防止這種情況發生。德爾福Xe5 firedac數據庫SQLite數據庫鎖定錯誤

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; 

感謝

+0

連接組件是我在對象中創建的東西,但是如果我將連接組件放到我的表單上,並將其傳遞到對象中,它可以正常工作。這說明有一些屬性沒有設置導致問題。是否有任何其他屬性應該在連接組件上設置。 –

+0

在窗體上放置一個連接,將其設置爲可以正常工作。然後右鍵單擊表單,從上下文菜單中選擇「以文本形式查看」,然後搜索連接。您可以從結果文本中查看組件上的屬性值。將它們複製到剪貼板中。然後右鍵單擊文本,選擇「作爲表單查看」,然後將剪貼板內容粘貼到代碼中的註釋中。然後你可以在你的代碼中設置這些相同的屬性(並且知道你應該賦值給這些屬性的值)。 –

+0

我已經嘗試過了,創建的連接具有所有相同的值,這些值只不過是驅動程序名稱和數據庫文件路徑。 –

回答

3

嘗試設置連接的屬性SharedCache爲 '假' 和LockingMode到 '正常'。

連接的鎖定模式的默認值是'獨佔',這可能會導致此問題。您可以通過右鍵單擊您的Connection-Component(在表單上)並選擇ConnectionEditor(我不太確定,如果這是正確的英文單詞,但它應該被稱爲類似的東西),然後設置這些值。

或者,你可以在源代碼中設置這些屬性:

connection.Params.Add('SharedCache=False'); 
connection.Params.Add('LockingMode=Normal'); 

我不知道,這是解決這個問題的最好辦法。這可能有更好的解決方案。