2012-09-17 110 views
0

我是Delphi的初學者,我需要以下問題的幫助。我必須在窗體上實現一個可編輯的DBGrid。 DBGrid顯示連接3個表的查詢的結果。我設法使DBGrid可編輯,但編輯對數據庫沒有影響。我可以在DBGrid中插入,編輯或刪除行,但這些更改不會保存到數據庫中。我有以下設置:可編輯DBGrid?

Query2.DatabaseName=Test 
Query2.SQL=SELECT cd.hourstart, cd.hourfinish, o.objname, cd."work", cd.worktime 
      FROM Card c JOIN CardDetail cd ON c.N=cd.card 
      JOIN objects o ON cd.project=o.N 
      WHERE c.worker=5 AND c.data=CONVERT(DATE, GETDATE()) 
Query2.UpdateObject=UpdateSQL2 
Query2.CachedUpdates=True 
Query2.RequestLive=True 

UpdateSQL2.DeleteSQL=delete from CardDetail 
        where hourstart = :OLD_houerstart and 
        hourfinish = :OLD_houerfinish and 
        work = :OLD_work and 
        worktime = :OLD_worktime 
UpdateSQL2.InsertSQL=... 
UpdateSQL2.ModifySQL=... 

DataSource2.DataSet=Query2 
DBGrid2.DataSource=DataSource2 

我可能錯過了一些東西,但我不知道是什麼。任何幫助,將不勝感激!

+1

五月值得一讀:http://stackoverflow.com/questions/12366772 –

回答

1

它聲稱,你需要幾個即updateSQL對象,一個每桌 http://docwiki.embarcadero.com/RADStudio/XE3/en/Using_Multiple_Update_Objects_Index

每個這些對象都應該有基礎數據集組件綁定到這些用於引用香草數據。 http://docwiki.embarcadero.com/Libraries/en/Bde.DBTables.TDataSetUpdateObject.DataSet

據稱,ApplyUpdates/Commit/CommitUpdates應該按照正確的順序在不同的對象上調用。 http://docwiki.embarcadero.com/RADStudio/en/Applying_Cached_Updates_with_Dataset_Component_Methods

PS。 BDE已被棄用,並且與最近的Windows和最新的數據庫服務器不兼容。

2
// Have a look at the below code, it uses an AdoCommand 
procedure DoSomething(DataSet: TDataSet); 
var 
    ADOCommand : TADOCommand; 
begin 
    ADOCommand:=TADOCommand.Create(nil); 
    try 
    try 
    ADOCommand.Connection:=Conn; 
    ADOCommand.Parameters.Clear; 
    Conn.BeginTrans; 
    if dataset.State = dsinsert then 
    begin 
     ADOCommand.CommandText := //Your insert statement 
     ADOCommand.ParamCheck:=False; 
     ADOCommand.Execute; 
    end 
    else 
    if DataSet.State = dsEdit then 
    begin 
     ADOCommand.CommandText := //Your edit statement 
     ADOCommand.ParamCheck:=False; 
     ADOCommand.Execute; 
    end 
    else 
    Begin 
     ADOCommand.CommandText := //Your delete statement 
     ADOCommand.ParamCheck:=False; 
     ADOCommand.Execute; 
    End; 
    Conn.CommitTrans; 
    except 
    on E : Exception do 
    begin 
     Conn.RollbackTrans; 
     MessageDlg('An exception occured, Error Class: ' + E.ClassName   +#13+      'ErrorMessage: '+ E.Message , mtError, [mbOK], 0); 
     Abort; 
    end; 
    end; 
    finally 
    ADOCommand.Free; 
    end; 
end; 
+1

其中conn =您的數據庫連接(TADOConnection)。 – user1878281

+0

我喜歡這個程序。我會嘗試在我的表格上使用它。 – ikutluay