请问如何直接更新clientDataSet的data到数据库里而不是只更新delta。(100分)

  • 主题发起人 主题发起人 薄荷
  • 开始时间 开始时间

薄荷

Unregistered / Unconfirmed
GUEST, unregistred user!
情况是这样的:比如一个教委下面有10个学校,现在到了期末,每个学校想把自己的数据上报,我就是用一个clientdataset得到本地的数据,然后把ClientDataSet连接远端的provider,然后调用ApplyUpdate,但是这个时候Delta是空的。所以更新失败。
我又试过直接调用 IAppServer.As_ApplyUpdate;还是不行。可能是我没用好。
还望各位赐教。
 
呵呵,有 有意思.
我觉得你可以这样.写
 
在服务器端提供一个函数给客户端,以data做为参数,在这个函数中来处理数据更新
 
数据更新的原理实际上就是对ProviderFlags的更改
可以循环一下DataSet,加入更新标志
DataSetTask.First;
while not DataSetTask.Eofdo
begin
if (pfInUpdate not in DataSetTask.FieldByName('Stu_NO').ProviderFlags) then
DataSetTask.FieldByName('Stu_NO').ProviderFlags:=DataSetTask.FieldByName('Stu_NO').ProviderFlags+[pfInUpdate];
DataSetTask.Next;
end;
 
既然delta是空的
就在delta上想办法啊
clientdatase.delta=yourdataset;//把你的数据集赋给delta
在用ApplyUpdate
试试把,不知道行不行。
 
对不起,刚刚的我试过了不行,落木潇潇的回答也不对,delta是一个只读属性,其实解决的办法很简单!比如你连接provider的是clientdataset1,赋值时候,使用clientdataset1.insert然后post,这样就可以做到自动更新delta了.要看delta是否更新,你还可以在使用一个clientdataset2,在clientdataset1中的onafterpost中写入clientdataset2.data=clientdataset1.delta就可以观察的到是否你有更新delta,通过这种办法,到最后你只需要简单的使用clientdataset1.applyupdate就可以顺利更新数据了
 
服务器端,放一个专门用于更新数据的query1,
sql为update table1 set field1=:field1 where custno=:custno
procedure UpdateData(Data: OleVariant);
var
cdsTemp: TClientDataSet;
begin
cdsTemp.Data := Data;
while not cdsTemp.eofdo
begin
query1.params.parambyname('field1').value := cdstemp.fields[0].value;
query1.params.parambyname('custno').value := cdstemp.fields[1].value;
query1.execute;
cdsTemp.Next;
end;
end;

客户端用UpdateData(ClientDataSet1.Data)来更新数据
 
把原来服务器上的这部分数据删了,然后重新Insert就可以了啊
 
ClientDataSet1.First
while not ClientDataSet1.Eof
begin
ClientDataSet2.InsertRecord([ClientDataSet1.Fields[0].Value,ClientDataSet1.Fields[1].Value...]);
ClientDataSet1.Next
end;
ClientDataSet2.ApplyUpdates(-1);
ClientDataSet2连应用服务器端即可
这样应该可以了吧
 
刚刚有点搞错了,我以为你是要把那些数据插进去,不知道你是要更新因为你说要把DATA里的数据全部更新到数据库,好象和插入就没区别了
如果这样更新的话,还不如先删后插,我和hongxing_dl意见差不多,因为你现在表结构和以前的应该是一模一样的,是新数据到了,先删后插比更新要简单得多,否则要用嵌套循环来处理,一个ClientDataSet取出先前数据,一个ClientDataSet当前数据然后在用KEY FIELDS
找到相应记录再修改,这样太慢了吧
 
mickeyboy的答案和我最后的做法差不多,不过我用了两个clientDataset而已。
至于先删除,我觉得对我这个问题没有影响把?因为我本地的数据已经有了,不管你删除不删除服务器上的数据,不会改变我本地的clientDataSet的delta把。
其实我得问题可以这样看:我的clientDataset从一个provider得到了数据,现在要更新到另外一个provider里,这两个表是相同的。
 
delta中存的是本地数据及已修改的对应的数据记录,用ClientDataSet的ApplyUpdate(-1)可以提交单个库。也可以调用应用服务器中的接口属性,但必须要传递Delta。另凡修改的ClientDataSet的数据,Delta一定不会为空的。
 
superMay 你还是没有明白我的意思啊。我现在就是用clientDataset从一个provider得到了数据,现在要更新到另外一个provider里,这两个表是相同的。我是直接给data赋值,没有涉及到insert等操作,不会改变delta的。
 
你用什么控件??????????、、还是自己写的程序!!!!
 
如果是我我就这样:
目的表(远程):Table (Field1,Field2)
1、Clientdataset连provider,执行SQL:select * from table where 1=2
2、ClientDataset Add本地数据,可以用循环从另一数据源得到。
3、ClientDataSet.ApplyUpdate
 
你所用的控件?、
还是自己写的程序
 
试一下我的:
如果是三层结构,那么不能直接用更新,
必须用update或insert,对于这个我是深有体会的,
因为直接更新只对客房端产生效果而没有实现真正的服务器端更新。
但是如果是两层结构就完全可以用。
 
to 嫁给cpu:
delphi的标准控件,
to 伊天笑:
我就是希望能有别的方式绕过去。比如我看到有个IAppServer有个as_ApplyUpdate方法好像可以实现。不过我没有测试成功。
 
后退
顶部