2012-10-03 89 views
2

我有一個查詢,數據集,可編輯dbgrid和updatesql組件的表單。當我需要保存在DBGrid中所做的更改,我把這個過程:Dbgrid - 自動發佈到數據庫

procedure TEditCardDetailForm.SaveChanges; 
begin 
    Database1.StartTransaction; 
    try 
    Query2.ApplyUpdates; 
    Database1.Commit; 
    except 
    Database1.Rollback; 
    raise; 
    end; 
    Query2.CommitUpdates; 
end; 

但是我想被自動應用到數據庫的變化,當我按Enter鍵或轉到其他行中編輯單元格後, dbgrid - 當我使用TTable組件時完成的方式。有沒有辦法做到這一點?

+1

您能否指定您使用的是哪個Delphi版本?另外,如果可能的話,我建議避免使用BDE組件,因爲它們已經過時了。 –

+0

我正在使用Delphi 5. – Rick77

+0

那麼是什麼? D5或多或少地能夠使EXE與最近的Windows兼容。即使XP主題可從SoftGems中獲益。但BDE與較新的Windows的兼容性報告相當差,不再需要開發或支持。在我最後的D5天中,我使用了Firebird數據庫後端,UIB組件集 –

回答

1

你有兩個場景來這裏處理:改變網格行

  • 保存時的變化而改變網格列
  • 第一個是當

    1. 保存更改通過在底層數據集的AfterPost事件中調用SaveChanges過程(query2,一個TClientDataSet?)。

      對於第二個,您只需在列更改後再撥query2.Post即可。這可以在datasourceOnDataChange事件中完成。確保檢查Field <> nildataset插入編輯模式之前致電post

    2

    如果我理解它是正確的(請糾正我,如果沒有),你有一個CachedUpdates設置爲true的TQuery,但希望它的行爲好像它不會使用緩存但立即更新。如果是這樣的話,你設置你的TQuery的方式與你期望的行爲相矛盾。在您決定使用ApplyUpdates手動將它們發佈到數據庫之前,緩存的更新將被「保留」在客戶端。

    在情況下,你可以設置CachedUpdates爲false,你只需要執行以下操作:

    1. 鏈接通過其UpdateObject財產TUpdateSQL到的TQuery。
    2. 編寫插入,更新和刪除語句,並將它們分配給TUpdateSQL的InsertSQL,ModifySQL和DeleteSQL屬性。

    我想你已經做了這兩件事情,所以把CachedUpdates設置爲false應該這樣做。

    有關Delphi 5的緩存更新的更多信息,請參閱here

    HTH

    +0

    我將CachedUpdates從True更改爲False,就像您告訴我的一樣。然後我運行了該項目,並在打開表單時收到了以下消息:「... EDBEngineError帶有消息'關鍵字無效使用。令牌:日期,行號:4'」當CachedUpdates設置爲True時,查詢工作正常。 – Rick77

    +0

    該錯誤通常會出現,因爲您的數據庫引擎(或BDE?)不喜歡SQL中的某些內容。你能告訴我們你的SQL嗎?此外,你有LiveRequest設置爲真(不應該,只是問如果)? –

    +0

    這是查詢條件: SELECT cd.N,cd.hourstart,cd.hourfinish,o.objname,cd。「work」,cd.worktime FROM Card c JOIN CardDetail cd ON cN = cd.card JOIN objects ON cd.project = oN WHERE c.worker =:worker AND c.data = CONVERT(DATE,GETDATE()) ORDER BY cd.hourstart; 我已經設置了工人蔘數。 – Rick77