首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

晕,delphi保存数据的速度如何比VB慢那么多

2012-03-23 
晕,delphi保存数据的速度怎么比VB慢那么多?我做了一个测试程序,,用来测试VB和DELPHI保存1000条数据的速度,

晕,delphi保存数据的速度怎么比VB慢那么多?
我做了一个测试程序,,用来测试VB   和DELPHI   保存1000条数据的速度,,为什么DELPHI的速度,竟然比VB慢那么多!!不是说DELPHI操作数据库的速度是最快的吗??
      测试结果,同时保存1000条数据,VB平均用1562毫秒,delphi   用13156毫秒!!!

测试程序如下:
      tab_gops_data   表里面已经有数据265674条数据了
(1)delphi:

在DataModule2里建有一个TAdoQuery表,属性sql:   select   *   from   tab_gps_data
procedure   TForm1.Button3Click(Sender:   TObject);
  var   i:integer;
      pp:double;
      ss:string;
begin
          DataModule2.qry1.Active   :=true;
          pp:=GetTickCount();
          for   i:=1   to   1000   do
          begin
                DataModule2.qry1.Append   ;
                DataModule2.qry1.FieldByName( 'deviceid ').AsString:= '212121 ';
                DataModule2.qry1.FieldByName( 'Lng ').AsString:= '120.36384   ';
                DataModule2.qry1.FieldByName( 'Lat ').AsString:= '36.111021   ';
                DataModule2.qry1.FieldByName( 'Speed ').AsString:= '21.3 ';
                DataModule2.qry1.FieldByName( 'Direction ').AsString:= '97 ';
                DataModule2.qry1.FieldByName( 'DateTime ').AsDateTime   :=date;
                DataModule2.qry1.Post;
      end   ;
      pp:=GetTickCount()-pp;
      ss:=floattostr(pp);
      showmessage(   ss);
end;


(2)vb测试程序:
Private   Sub   Form_Load()
      Dim   CCString   As   String
      CCString   =   "Provider=SQLOLEDB.1;Password=feng;Persist   Security   Info=True;User   ID=sa;Initial   Catalog=GPSBase;Data   Source=127.0.0.1 "
      rst.Open   "Tab_GPS_Data ",   CCString,   adOpenKeyset,   adLockOptimistic,   adCmdTable
End   Sub

Private   Sub   Command1_Click()
                '存数据库
                iii   =   0
                Dim   k
                Dim   i   As   Integer
                Label1.Caption   =   GetTickCount
                k   =   Val(Label1.Caption)
                For   i   =   1   To   1000
                        rst.AddNew
                        rst!DeviceID   =   "000026 "
                        rst!Lat   =   "36.123456 "
                        rst!Lng   =   "120.36547 "


                        rst!speed   =   Left( "235.12 ",   3)
                        rst!Direction   =   "125 "
                        rst!DateTime   =   Now
                        rst.Update
                Next   i
                  Label2.Caption   =   GetTickCount   &   "- "   &   (GetTickCount   -   k)
End   Sub


[解决办法]
// 又重写了段代码试了下,qry1是TADOCommand;
var
ss, sDate: string;
pp, i, J: Integer;
begin
ss := 'insert into testeffice values( ' '212121 ' ', ' '120.36384 ' ', ' '36.111021 ' ', ' '21.3 ' ', ' '97 ' ', ' '%s ' '); ';
pp := GetTickCount();
J := 0;
while J < 10 do
begin
qry1.CommandText := ' ';
for i := 1 to 100 do
begin
sDate := DateToStr(Now);
qry1.CommandText := qry1.CommandText + Format(ss, [sDate]);
end;
qry1.Execute;
Inc(J);
end;
pp := GetTickCount() - pp;
ss := floattostr(pp);
Memo1.Lines.Add(ss);
end;
[解决办法]
一组数据三十条,需要一条一条分析,实际上这个操作是在本机,如果没有特别的文件等慢速IO设备的操作,速度是可以忽略的,而访问数据库则尽可能减少访问次数来保证效率。

procedure AppendData(SrcData:array of TDataType;//源数据组
ADOCommand:TADOCommand;//执行SQL语句的组件
);
var
CommandString : TStringList;//SQL语句列表
begin
CommandString:=TStringList.Create;//创建对象
try
for i:=0 to sizeof(SrcData)-1 do //对源数据组进行独分析
begin
SingleSQL := AnalyData(SrcData[i]); //单个数据分析并生成一个SQL语句;
if Length(SingleSQL)> 0 then
CommandString.Add(SingleSQL+ '; ');//MSSQL多个SQL间使用分号分隔类似查询分析器当中的 "GO "
end;
ADOCommand.CommandText:=CommandString.Text; //批量SQL
ADOCommand.Execute; //执行批量
finally
CommandString.Free; //使用try ... finally来保证资源被释放
end;
end;

热点排行