好一个 OleVariant 类型!! 有谁懂吗?(200分)

  • 主题发起人 主题发起人 xlwang
  • 开始时间 开始时间
X

xlwang

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:
大家好,
我在 Delphi 中使用ADO 控件 ,但我要绕过本身的Recordset 直接调用 Com 口的
Recordset ,我在增加一条记录时出现问题:
Adodataset1.Recordset.addNew(Fieldlist:OleVariant,Value :OleVariant)
我的想法是
ads.Recordset.addNew; (这里行不通!)!! (但VB 却简单的多)
ads.Recordset.Fields[0].Value:='01';
ads.Recordset.Fields[1].Value:='2000';
ads.Recordset.Fields[2].Value:='2001' ;
ads.Recordset.Fields[3].Value:='p' ;
ads.Recordset.UpdateBatch(adAffectAll) ;
这个 OleVariant 到底怎么来用?
这中的Delete ,edit, 都好用 这个 addNew 怎就这么麻烦?
这样能加快数据的传输(确实!)
还有什么方法来加快速度吗???
我现在的程序要跑 6 个小时!!(做文件到数据库的传输)
相反方向的 却只要20 分钟!
 
帮帮嘛!
众大虾
给我一点活下去的嘛!
谢了先
 
直接使用原生的aod控件应不能快多少,
主要还是你处理的方法问题吧。
说仔细点。
大约有多少记录要倒进库,
用什么数据库。
大家清楚了才能更好帮你解答。
 
To :zhanggeye
Delphi +SQL SERVER 7.0
有六个文件,是从数据库中下下来的,
记录数从 3000 到 80 万不等,数据库有的有Parimary key 有的没有。
对那个OleVariant 方法多个字段我不会用,我试过只有一个字段的 的确能快一点(30%)
现在我的方法是用 参数赋值法 例如:
Adcinsert.CommandText:='insert into buy_Barcode '+
'(code , Product_code,internal, Longcode , '+
'Createby,modifyby,create_date,Modify_date ) ' + ' values ' +
'(:code,:Product_code,:internal,:Longcode ,'+
':Createby,:modifyby,:create_date,:Modify_date )' ;
Adcinsert.Prepared ;
....
// 以下在循环体内:
Adcinsert.Parameters.ParamByName('code').value :=arr_field[1] ;
Adcinsert.Parameters.ParamByName('Product_code').value :=arr_field[2] ;
Adcinsert.Parameters.ParamByName('internal').value :=arr_field[3] ;
Adcinsert.Parameters.ParamByName('Longcode').value :=sn;
Adcinsert.Parameters.ParamByName('Createby').value := VPrepareBy;
Adcinsert.Parameters.ParamByName('modifyby').value :=Vmodifyby ;
Adcinsert.Parameters.ParamByName('create_date').value :=Vmodify_date ;
Adcinsert.Parameters.ParamByName('Modify_date').value :=Vmodify_date ;
adcinsert.Execute;
//
我现在不想用这个方法 。能快就要快一点。
 
采用原生ado操作能快30%实是出呼意料之外。
因为delphi的aod组件也是封装ado com对象的,
按理不应有这种情况。
OleVariant用法你可象下面这样:

var vf,vv:OleVariant; //vf是字段列表,vv是值列表
begin
vf:=VarArrayOf(['字段1','字段2']);

// 循环
vv:=VarArrayOf([字段1值,字段2值]);
adotable1.Recordset.AddNew(vf,vv);
// 循环

还有的建议是:
1.不要和任何数据敏感控件连接,减少介面刷新的时间.(可能你已注意到这个问题。)
2.采用存储过程来增加记录.
 
请将你最后采用的办法和测试结果贴出来给大家参考。
 
关注此问题,怎么没有了消息?
 
各位:
大家好,实在不好意思,我好长时间上不了 大富翁论坛。现在我来把我做的几种方法来
一起说一下:
1: 直接用insert .. Value ..('','','' ),型的速度最慢。(100s)
2: 用 insert into value(:code,:Product_Code,...) 在循环外做好 Prepared ,
在循环内 直接参数赋植,快很多了。(30^s)
3: 用原生的 Ado 做又能快一点的,就是zhanggeye的点子可以实现的。(20^s)
4:最快的要数storeProc, 调用了,送参数。快了很多(10^s)!

好了现在也该结束问题了。
 
后退
顶部