2012-09-17 71 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