这个问题有没有答案?!(300分)

  • 主题发起人 主题发起人 nikue
  • 开始时间 开始时间
N

nikue

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]300分大派送,欢迎讨论,只要有点意义,就会有分!
这两天一直在研究clientdataset。loadfromfile
发现一些问题,不知是否是delphi 的bug:
我用两个clientdataset,想实现到数据的功能:
cds1 //连接到服务器中
cds2。loadfromfile('c:/aa.cds')
cds1.appenddata(cds2.data,false);
showmessage(IntToStr(cds1.recordcount));//3000
showmessage(IntToStr(cds1.changecount));//0
for i := cds1.recordcount - 1do
begin
cds1.edit;
cds1.fields[0].asstring := cds1.fields[0].asstring + 'a';
cds1.next;
cds1.post;
end;
showmessage(IntToStr(cds1.changecount));//3000
cds1.applyupdates(0);//没有报错
但检查服务器中的记录却没有变化,这是delphi的bug吗?
 
哈哈,你还在研究clientdataset呀,
你的想法很巧妙,想骗过clientdataset将本地数据保存到数据库中,可惜clientdataset
可不容易骗呀,我给你解释一下你就明白了,
clientdataset有delta与data两个重要属性,data中保存的是当前clientdataset的数据,
可通过data进行相互赋值,所以cds1.appenddata(cds2.data,false);
与cds1.data:=cds2.data
结果是一样的。
delta是一个只读属性,它保存的是当前变动的数据,为了减少网络传输,boarland设计
非常巧妙,它里面只包含了变动的数据,如果是新增记录,则包含整条记录,如果是修改记录,
则只包含发生变化的字段值,如果是删除保存的就更少,这样可以最大限度减少数据量。
传到服务器端后,再转化为相应的insert,update,delete语句更新到数据库,
回过头来看你的程序,这3000条记录在数据库中是不存在的,如果只是cds1.appenddata(cds2.data,false);
由于delta为空,chnagecount为0,无法保存到数据库,于是你采用了每条记录修改一个值
使changecount=3000,以为就行了。
但根据上面描述可知,如果只是修改,delta中只保存发生变化的字段值,传到服务器端后
也只生成update语句,由于这些记录在数据库中根本不存在,当然就存不进去了。你跟踪一
下sql语句就明白了。
所以还是只有我说的笨办法,一条一条的插入,这样保证能成的,事实上插入记录应很快,
真正慢的是保存到数据库的过程,因为它也是一条一条的插入,但过程复杂多了。
祝你顺利
 
to myname :
我还跟踪了cds1的字段值,发现每一个字段的oldvalue='',newvalue==value
不是空为正确的值,
这又如何解释,而且还发现providerflag中都有pfinupdate,好痛苦呀,
 
难道你能将3000条记录update到数据库中吗?只能insert呀!
而修改记录只能生成update语句,不可能生成insert的
你可再用一个cds3, cds3.data:=cds1.delta,通过dbgrid你就可以发现
里面到底有些什么。我想肯定和我说的相符。
关于4分钟问题,你可只插入,先不保存,看需要多少时间,我想应该很快
另外oldvalue,newvalue不能说明什么,delta才是一切。
 
这几天住的地方停电,所以没有上来;
难道这个问题真的就没有解吗?
不知李维知不知道?呵呵,可惜没有没有联系方式的。
to myname:不知对于数据库的恢复,不知是否有其他的方法
(sqlserver to sqlserver)

 
高手們,看來我沒有答話的份了,提一下吧!
 
to sydan :你有何高见了,说吧,我等着呢!
 
1.如果同在局域网中,除了备份与恢复外,还可通过出版复制,如果是异地,恐怕还是
备份、恢复最可靠
2.最化时间的是clientdataset保存到数据库的过程,本地复制就算不化时间也没
多大意义。
 
to nikue
你好
这个问题解决了吗?
 
to bitd
还没有得到满意的解决……
 
后退
顶部