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;
感謝
連接組件是我在對象中創建的東西,但是如果我將連接組件放到我的表單上,並將其傳遞到對象中,它可以正常工作。這說明有一些屬性沒有設置導致問題。是否有任何其他屬性應該在連接組件上設置。 –
在窗體上放置一個連接,將其設置爲可以正常工作。然後右鍵單擊表單,從上下文菜單中選擇「以文本形式查看」,然後搜索連接。您可以從結果文本中查看組件上的屬性值。將它們複製到剪貼板中。然後右鍵單擊文本,選擇「作爲表單查看」,然後將剪貼板內容粘貼到代碼中的註釋中。然後你可以在你的代碼中設置這些相同的屬性(並且知道你應該賦值給這些屬性的值)。 –
我已經嘗試過了,創建的連接具有所有相同的值,這些值只不過是驅動程序名稱和數據庫文件路徑。 –