每次保存数据前,都要检测该记录是否已经在数据库中
存在,如果存在则更新,否则就插入。我的问题是:目前有两种检测数据是否已经存在的方法,
            请大家评论一下,哪种方法更有效率?第一种方法:
           for ix:=0 to 1000 do
           begin
           ADODataSet1.Active:=False;
           ADODataSet1.CommandType:=CmdText;
           ADODataSet1.CommandText:='select * from table1 where id=:ix';
           ADODataSet1.Active:=True;
           if ADODataSet1.IsEmpty then
              //插入
           else
             //修改
           end;第二种方法:
           ADODataSet1.Active:=False;
           ADODataSet1.CommandType:=CmdText;
           ADODataSet1.CommandText:='select * from table1 ';
           ADODataSet1.Active:=True;
           
           for ix:=0 to 1000 do
           begin
             findflg:=False
             ADODataSet1.First;            while not ADODataSet1.Eof do
            begin
               if ADODataSet1['id']:=ix then
               findflg:=true;
            end;            if findflg then
                 //修改
            else
                //插入end;以上语法可能不完整,但请大家主要考虑思路先谢了,各位!

解决方案 »

  1.   

    两种方法都很低效,而且,你怎么能用1000作为外层循环计数?
    我给一种方法
    adoquery1.close;
    adoquery1.sql.clear;
    adoquery1.sql.add('select * from 表名 where 条件');
    adoquery1.open;
    //判断是否有相同记录
    if adoquery1.recordcount>0 then
    begin
      用update命令更新
    end
    else
    begin
      用insert命令插入
    end;
      

  2.   

    這樣每次都要循環查詢會很慢的,這樣可不可以,你反正都是以要保存的數據為最新的數據嘛,那就在保存之前查出所有的要保存的ID,然後在數據庫中DELETE TABLE WHERE ID IN (
    所有的要保存的ID) ,再執行保存.
      

  3.   

    第二中快,使用clientdataset,在本地执行,第一中要使用1000次的查询,查询多了就会慢,虽然第二中把全部的数据拉了回来
      

  4.   

    select * -->select count(*)
      

  5.   

    语法的问题大家不要介意,用1000只是表示,有很多数据要保存,不只一条。我则认为,第二种办法效率更高一点。因为第一种方法要频繁的连接到服务器,
    所以占用的网络资源要多。第二种方法,按刘维先生的说法,把CursorLocation设
    为Client,CacheSize设为1000,则其实查找工作很大一部分在本机内存中完成,所
    以速度要快。大家以为呢?
      

  6.   

    第一种好一些。
    'select count(*) as num from table1 where id=:ix'
    这样更有效一些。
      

  7.   

    同意hushaoshu2(西门吹雪) ~~我也是用这样的方法的~~
      

  8.   

    补充一下,数据库是sql2000
    软件结构是C/S
      

  9.   

    两种效率都不高
    应该在sql2000中对Table1设置Constraints,并对查询字段加indexfor ...
    {   try
         insertit;
       except
         updateit;
       end;}若是oracle update可以在后台完成,sql2000没用过不好说