问题流程如下:
1  从数据库中获取到一个记录集ds;
2  对ds中的数据进行处理;
3  将处理完的数据插入到数据库中的表里面.我现在是循环ds,每处理完一条记录,就把处理后的数据插入到数据库表中,然后再处理第二条记录.现在感觉效率太低了,处理2000条数据需要80s,我一开始以为是数据处理过程效率太低,现在做了很多优化,效果不明显,2000条数据还需要70s,和我的投入明显不成正比.我想是不是我每处理一条记录就插入一条记录,在数据库插入数据这一块太浪费时间了!能不能采用类似于批处理的方式,每处理完10条,20条数据,再往数据库中插入这些处理完的数据??我用的数据库为oracle,不知道我的想法可行不?请大家不吝指点,或者有什么更好的办法?大家一起分析!!

解决方案 »

  1.   

    你可以利用sqldataadapter的Update方法
      

  2.   

    不管是SQL还Oracle,最好应该将数据从界面层全部传到商业逻辑层,在商业逻辑层进行处理。优化的原则是:
       1.不要打开一次连接,只传输一条记录。  打开一次连接把数据全部传过去,再插入数据库
       2.不要传输好多次,一步到位。  用DataSet一次性将数据带到底层。
      

  3.   

    首先,肯定是先处理完所有数据再插入来的快些;
    其次,如果该表带有主键的话可以考虑使用sqldataadapter的Update方法
      

  4.   

    上面两位老大说的俺还看不大明白::
    我处理数据并不是在取出来的ds基础上修改,而是分析ds中的数据,将有用的数据取出来,再重新构造一个"insert"语句,将数据再插入到另外一个表中!!刚看了一下,去掉insert过程,光分析2000条数据,要不了几秒钟,!!
      

  5.   

    sqldataadapter的Update是在修改原ds的基础上吧,我的数据和原ds基本上没关系了,是新数据!
      

  6.   

    要提高效率,可以考虑使用存储过程。
    我想能不能自己用new 创建一个DataTable ,临时存储你修改的数据,然后再把这个DataTable写进数据库,试试~~
      

  7.   

    to: Vigorcsdn,我也想这么试一下!!
      

  8.   

    当你的数据处理好了后,别急往数据库里插,可以放在一个临时表DataTable里存一下,然后在打开一次连接把DataTable全部传过去,再插入数据库,这样比你的效率肯定要高
      

  9.   

    要写成方法调用才好插入最好用存储过程:
    public void aaa(DataTable dt)
    {
    try{
    //打开数据库连接 conn.open()
    int count = dt.rows.count;//得到dt的count  
    for(int i=0;i<count;i++)
    {
      string aa= dt.row[i][0].tostring();//从DT里去相应的数据
       …………
      insert //执行插入
    }
    }
    catch()
    {
    //错误处理
    }
    finlly//不管有无错误 都关闭数据库连接
    {
    conn.close();
    }
    }