我使用
  
DBGird.DataSoure.ClientDataSet.TDataSetProvider.ADODataSet.ADOConnection想实现 在DBGird里面输入数据,可以多条。输入每条后不是马上更新到数据库,输入完成按btn按钮全部记录提交到数据库。其中DBGird录入的不是全部字段,某个字段如No,是读取的某个edit的值。如表4个字段 No1 No2 No3 No;DBGird只显示或输入No1 No2 No3;
而No4:=Edit.Text
   
-----------
不知道问题描述清楚,对数据库编程不熟,查了些资料,把ADODataSet的LockType=ltBatchOptimistic分别在 ClientDataSet.beforePost或AdoDataSet.beforePost或ClientDataSet.BeforeApplyUpdates对No赋值都有错。搞了半天头有点昏,请大家指点下!

解决方案 »

  1.   

    使用ADO的BATCHUPDATE功能
    优点:减少网络负载,因为他把用户更新的数据全部放在缓存,当用户要更新的时候再一次性提交
    缺点:必须编写足够多的错误处理代码进入batchupdate模式比如设定:
    cursortype为keyset或static
    locktype为batchoptimistic
    执行的sql命令必须是select.
    Cursorlocation为cluseclient.Datamodule2.adodataset1.updatebatch    更新数据
    datamodule2.ADODataSet1.CancelBatch;取消更新
      

  2.   

    谢谢lzy7314 
    我是按你说的那样设定的,但是我主要是在提交数据时不知道怎么处理多条记录的某个字段的值, 在更新数据之前如何对整列字段重新赋值呢?
    我试了在beforePost里写代码 dataset.FieldByName().AsString:=edit.text;
    不能实现!
      

  3.   

    借宝地一用:欢迎加入delphi群(37792189)
      

  4.   

    ClientDataSet.post
    ClientDataSet.ApplyUpdates(0)
      

  5.   

    借宝地一用:欢迎加入delphi群(37792189)
      

  6.   

    使用dataset的onnewrecord事件,dataset.FieldByName(‘no1’).AsString:=edit.text;
      

  7.   

    clientdataset.post;//保存到clientdataset;
    clientdataset.applyupdate(-1)//保存到后台数据库;
      

  8.   

    可以选判断,用 if clientdataset.locate('字段',字段值,[])  then   edit else insert