MIDAS 中如何快速、批量添加数据(100分)

  • 主题发起人 主题发起人 kaida
  • 开始时间 开始时间
可以qq联系吗?比较快
 
整个数据包传送到了中间层当然不再用provider来更新数据库.
用clientdataset对query/table循环添加数据应是最快的(只占对本例)
客户端:定义一个临时的clientdataset,将要导入的数据导入其中,通过接口传送clientdataset.data
中间层:定义一个接口,接收数据包并存入clientdataset中,由clientdataset再导入数据库中.
如果数据量大,可对数据包进行压缩后再传送.
 
to zhanggeye:
>>中间层:定义一个接口,接收数据包并存入clientdataset中,由clientdataset再导入数据库中.
clientdataset好像不能直接和表连接吧?我看了一下它的属性,好像没有发现有可以定义
数据库、表的地方。
你是不是在中间层用的Ttable或tquery,然后自定义接口传输数据到它们?
 
to admintty:
上面我已说得很清楚,对于他这种情况,充分发挥数据库引擎的性能。
用clientdataset对query/table直接循环添加数据应是最快的。
 
to zhanggeye:
我想,你可能没有搞清我问题。我问的是,在中间层,你是不是用的Ttable或tquery,因为
clientdataset没有直接针对具体数据库的属性!
 
"用clientdataset对query/table直接循环添加数据" 不明白?
是我表达不清吗?还是你的理解有问题.
 
表达不清
 
while not clientdataset.eofdo

begin
query.append;
query.fieldbyname('afield').value:=clientdataset.fieldbyname('field').value;
query.post;
clientdataset.next;
end;
--------
很普通的操作,但要比用接口来得快,
如果要更快,换sql server,用存储过程真接更新。
 
ClientDataSet的目的本来就是为了实现瘦客户端,因而一次处理的记录数量不应太大,
这样反而能提高程序的运行效率...你可以一次读入所有的数据,但你可以分批将数据
存入的(这要充分利用ClientDataSet的功能),比如说:
//到此时,tempDataSet1已经获得了上万条数据,ClientDataSet已经与目的表连接
j:=tempDataSet1.RecordCount div 200;
inc(j);
//分j次存入
tempDataSet2.Data:=tempDataSet1.Data;
for i:=1 to jdo
begin
tempDataSet1.First;
if tempDataSet1.RecordCount>200 then
begin
tempDataSet1.RecNo:=201;
//定位于第200条之后并将后面的删除
for k:=201 to tempDataSet1.RecordCountdo
tempDataSet1.Delete;
end;
//好了,现在tempDataSet1中应该剩下不超过200个记录了
ClientDataSet.Data:=tempDataSet1.Data;
ClientDataSet.ApplyUpdates;
if i=j then
break;
//若已是最后一次,则没必要继续了...
//下面清除已经保存的那200个记录
tempDataSet1.Data:=tempDataSet2.Data;
for k:=1 to 200do

if not tempDataSet1.eof then
tempDataSet1.Delete else
break;
if tempDataSet1.RecordCount=0 then
break;

tempDataSet2.Data:=tempDataSet1.Data;
//修正tempDataSet2中的以备下次使用
end;
...
大概意思是这样了...但上述代码只适于你所有的记录都是新增的...你可试一下改变
200为其它值,比如每次300或更高,以得到最佳的更新量...
上面代码未经验证,只是提供了一个思路...
 
建议使用SQL server数据库,使用ClientDataSet,
更新时ApplyUpdate...
提交ClientDataSet.Delta;
 
to yanghaijun:
这种方法应当就是自动实现分批更新,和kaida的做法相比,也就是一个是手工,一个是自动
分批传。是不是?
to zhanggeye:
这段代码是在那儿执行的?如果是中间层而不是客户端,clientdataset的数据怎样
从客户端获取的呢?客户端放置的clientdataset数据传送需要设置data provider的。
 
这个问题你只需通过公文包的形式传递到服务器上就可以了,或者使用本地XML数据传输
 
后退
顶部