2013-07-29 36 views
2

您好我有一個表單設置使用TMySQL51Connection,TSQLTransaction & TSQLQuery模塊,它從數據庫中檢索信息沒有問題,但我有更新的問題。Lazarus無法使數據庫更新正常工作。我如何預覽正在提交的內容?

數據庫非常大,所以我開始時只是第一對行,一旦他們工作,我會延長查詢。

我TSQLQuery.UpdateSQL如下

UPDATE table SET 
ContactFirst = :ContactFirst, 
ContactSur = :ContactSur 
WHERE AccountID = :AccountID 

然後我在表單中有一個按鈕,onclick事件包括:

begin 
    accSelect.Edit; 
    accSelect.Post; 
    accSelect.ApplyUpdates; 
    dbTransaction.CommitRetaining; 
    sqlbl1.Caption := accSelect.UpdateSQL; 
end; 

點擊按鈕不正是沒有與DB,它不生成錯誤消息,只是更新sqlbl1上的標題。無論如何預覽Lazarus發送給數據庫的數據包含的值,以便我可以追蹤哪些地方出錯?

我試着向SQLConnection添加一個日誌記錄事件,但不知道如何讓它生成日誌。

+0

你知道如何在IDE中「步入」和「跨越」代碼嗎?你的IDE支持手錶嗎?我知道在Delphi中,您可以逐行瀏覽您的代碼,只需將鼠標懸停在變量上即可查看其當前值(以調試模式顯示)。我想如果您希望我們找到某個特定功能的缺陷或不完整編碼,則需要發佈更多代碼。 – Sam

+0

你給參數賦值(例如:ParamByName('ContactFirst').Value:= SomeVariant)?也許你需要在Edit和Post之間的TSQLQuery上調用Update或Exec方法? – Sam

回答

4

根據我的經驗,Edit,PostApplyUpdates方法與TClientDataSet結合使用。在這種情況下,您只需將新值分配給CDS中的字段(導航到要編輯的記錄),然後發佈這些更改(不需要更新SQL語句)。事情是這樣的......

MyCDS.Edit; 
MyCDS.FieldByName('ContactFirst').Value := sContactFirstName; 
MyCDS.FieldByName('ContactSur').Value := sContactSurname; 
MyCDS.Post; 
MyCDS.ApplyUpdates; 

或者,你可以使用查詢部分,寫UPDATE SQL插入SQL屬性,並使用ExecSQL或任何方法,該組件中實現(也有很多數據庫訪問組件每個人都有自己的特質)

這是一些代碼,我的頭頂。請原諒我,但我不熟悉拉撒路細節 - 它基本上是Delphi代碼。

MySQLQuery.SQL.Clear; 
MySQLQuery.SQL := 'UPDATE MyTable 
        SET ContactFirst = :ContactFirst, 
          ContactSur = :ContactSur 
        WHERE AccountID = :AccountID'; 
MySQLQuery.Params.ParamByName('ContactFirst').Value := sContactFirstName; 
MySQLQuery.Params.ParamByName('ContactSur').Value := sContactSurname; 
MySQLQuery.Params.ParamByName('AccountID').Value := iAccountID; 
try 
    MySQLQuery.ExecSQL; 
    ShowMessage('Update succeeded'); 
except on e: Exception do 
    ShowMessage(e.Message); 
end; 

所以它可能是你已經結束了使用這兩種方法的一半,他們都沒有完全。

+0

這對我來說已經足夠好了,我使用了第二個建議,完美地工作:D – Funk247

+0

未來的FPC版本將會有TSqlStatement,這個版本稍微更好地針對這種東西進行了優化。 –