读的ORACLE,20个字段,23000多条数据,用System.Data.DataTable加载一下要30秒钟,太慢了,有没有方法加快呢,代码如下
System.Data.OleDb.OleDbDataAdapter oleDbDataAdapter = new System.Data.OleDb.OleDbDataAdapter();
System.Data.OleDb.OleDbCommand oleDbCommand = new System.Data.OleDb.OleDbCommand(sql, conn);
oleDbDataAdapter.SelectCommand = oleDbCommand;
table = new DataTable();
oleDbDataAdapter.Fill(table); //就再这行上慢的另外请问DataReader有没有什么方法返回一个数组?感激涕零!

解决方案 »

  1.   

    不知道我是否看明白了,不能,根据datareader的读取方式,我觉得不能
      

  2.   

    执行一下这个。DataTable tb = new DataTable();
    tb.Columns.Add(new DataColumn("序号", typeof(int)));
    tb.Columns.Add(new DataColumn("时间", typeof(DateTime)));
    DateTime bt = DateTime.Now;
    DataRow tr;
    int i = 0;
    for (; i < 23000; i++)
    {
        tr = tb.NewRow();
        tr["序号"] = i;
        tr["时间"] = DateTime.Now;
    }
    TimeSpan te = DateTime.Now.Subtract(bt);
    MessageBox.Show(string.Format("插入{0}行数据总共用时{1}秒。", i, te.TotalSeconds));
      

  3.   

    大量数据建议你用DataReader来读取,
    如果你非要用DataTable方式来读取,你自己做个代理,将操作都封装起来,设置参数一次读取指定的数量。
      

  4.   

    winner2050(winner) ( ) 要读取那么多数据,说明你设计水平不够
    能说说
      

  5.   

    我要实现的功能是:
    从EXCEL里读数据,往库里写,写前需要判断库中是否有重复的记录。
    由于判断是否重复是依照EXCEL里指定的某几列为依据,我的做法是:
    把库里数据依“order by 上面说的某个列”一把都读进System.Data.DataTable,,然后以二分法在DataTable.Rows检测是否有重复的数据,在库里23000条记录、EXCEL里4000条的情况下,这个比较过程为2-3秒,远比select四千次来的快。可是整个程序慢在了读取记录集上。大家有没有什么好的办法达到我要实现的功能呢。感激涕零!
      

  6.   

    在DataTable里面放那么多数据干什么?
      

  7.   

    首先,也许你的设计思路会有问题,通常不需要用DataTable来加载那么大的数据记录。
    其次,你的数据库大概没有建立索引,这也是慢的一个主要原因。
    最后,因为不明白你的具体需求,如果真的需要用DataTable加载那么大的数据,那么请考虑以异步形式加载。
      

  8.   

    那你说的那种情况真的是没有更好的办法了。
    以前我做的是Excel一次上万条记录,还要每条每条的检索数据的正确性,分布式环境,每次执行导入检查都要10多,20分钟。
      

  9.   

    你试试OracleDataAdapter,既然你用Oracle,你为什么不用Oracle的专用引擎,而用Ole?
      

  10.   

    首先,也许你的设计思路会有问题,通常不需要用DataTable来加载那么大的数据记录。
    其次,你的数据库大概没有建立索引,这也是慢的一个主要原因。
    最后,因为不明白你的具体需求,如果真的需要用DataTable加载那么大的数据,那么请考虑以异步形式加载。=================================
    上面我说了我的意图,你帮看看
    建索引了
    异常只能让界面不卡在那里,校验过程还是漫长的。帮想想思路,一筹莫展
      

  11.   

    你试试OracleDataAdapter,既然你用Oracle,你为什么不用Oracle的专用引擎,而用Ole
    ================================================
    好,我试试,明天把结果贴出来
      

  12.   

    1. 不知道你一次要这两万多条记录干吗?如果只是显示,应该考虑分页,否则构建大对象即耗费内存又浪费时间。如果是需要在这两万多条记录上再次做离线的操作,那是否应该考虑直接在存储过程里面处理完了再拿出结果。2. DataReader类似游标,一行行向前读取。不知道返回数组是什么意思?其实真的有需要的话,可以在存储过程内以一定格式组织好,i.e.  返回“a#b#c#d#e”,然后在你的程序里面Split一下做为数组来用。
      

  13.   

    将你要匹配的字段加载就可以了,不要加载其它字段,检察完后,将检察完后的记录如根据ID组到数据库中加载检察后的数据则是你要的数据。还可以通过多线程的加载方式,将每个线程的Table都共享出来,给除了给自己的线程去匹配还给其它线程去匹配.
      

  14.   

    将你要匹配的字段加载就可以了,不要加载其它字段,检察完后,将检察完后的记录如根据ID组到数据库中加载检察后的数据则是你要的数据。还可以通过多线程的加载方式,将每个线程的Table都共享出来,给除了给自己的线程去匹配还给其它线程去匹配.
    ========================================================================
    需求要求标识出所有的差异,所以全部加载(我这例子加载的是2)个字段)我试过多个线程一起跑,原先的路子是excel里的每一行都select一下,2个线程比一个线程几乎快一倍,但线程数一加上去速度的增加就急剧不明显起来,总的还是很慢的。现在全部读进记录集,然后比较,一个线程和两个没区别,三个线程开始就反而变慢了。
    痛哭流涕
      

  15.   

    前面你既然可以把所有记录加载到Table,我想内存应该够了,所以,每个线程都开辟一个存储记录的区域,(每个线程都有自己的Table当然只是举例,也可能是别的)只负责加载数据,其它照旧,关键几个存储区的数据共享出来,你自己决定是整合还是直接查询。
      

  16.   

    唉,把需要检查重复的那几列建一个唯一索引,然后直接insert,如果重复,等数据库报唯一索引错误吧,catch后,继续下一条记录insert
      

  17.   

    我要实现的功能是:
    从EXCEL里读数据,往库里写,写前需要判断库中是否有重复的记录。
    由于判断是否重复是依照EXCEL里指定的某几列为依据,我的做法是:
    把库里数据依“order by 上面说的某个列”一把都读进System.Data.DataTable,,然后以二分法在DataTable.Rows检测是否有重复的数据,在库里23000条记录、EXCEL里4000条的情况下,这个比较过程为2-3秒,远比select四千次来的快。可是整个程序慢在了读取记录集上。大家有没有什么好的办法达到我要实现的功能呢。感激涕零!你只管插入数据,让ORACLE触发器来判断是否插入重复记录,如果重复里你再考虑更新,还是不更新或者删掉原来的再插入新的。用触发器肯定快的。
      

  18.   

    你只管插入数据,让ORACLE触发器来判断是否插入重复记录,如果重复里你再考虑更新,还是不更新或者删掉原来的再插入新的。用触发器肯定快的。================================================唉,不光是判断是否重复,还要标出哪些单元格和数据库中的数据相比有变化
      

  19.   

    站在和楼主的目的无关的思路上说几句,具体说慢是慢在从数据库取数据上了,不是慢在DataTable上,我现在正做的一个程序,有在DataTable上50万条数据的情况,自已用这个为源去生成一个PIVOT型的新表时也就几秒
      

  20.   

    前面你既然可以把所有记录加载到Table,我想内存应该够了,所以,每个线程都开辟一个存储记录的区域,(每个线程都有自己的Table当然只是举例,也可能是别的)只负责加载数据,其它照旧,关键几个存储区的数据共享出来,你自己决定是整合还是直接查询。==================================================================
    我是多个线程共享一个System.Data.DataRowCollection dataRows(数据库数据都在这里)、共享一个object[,] cells(EXCEL数据都在这里),然后给各个线程分派EXCEL数据的段落,让它们跑起来,各线程把比较结果放各自的System.Web.UI.WebControls.TableRow[] trs里,全部结束后由主线程调用System.Web.UI.WebControls.Table.Rows.AddRange()方法`把几个trs拼接成一个完整的表格显示在界面上。八只这路子是不是走的不好
      

  21.   

    楼上的楼上可否赐教“PIVOT型的新表”是个什么东东啊