读的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有没有什么方法返回一个数组?感激涕零!
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有没有什么方法返回一个数组?感激涕零!
解决方案 »
- {在线等}拜托大家看看这个程序什么问题????连接到数据库的程序
- 一个关于vb6的结构体转成c#的结构体的问题
- C#关闭窗体问题。
- 没有权限写注册表,如何解决.
- C#视屛教程
- 关于文本框的问题
- 如何将一个函数作为另一个函数的参数?
- 图片流,音频,视频等,可以进入数据库吗,如:SQL server。怎么读取,写入呀?
- 无效的 URI: 未能确定 URI 的格式。
- Response.Write("<script>alert('error');</script>");可以;Response.Write("<script>alert('error\n error');</script>");不可以,Why
- 如何获得DATAGRID中的数据,急!!!!在线等
- 有关成员资格和角色管理的问题
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));
如果你非要用DataTable方式来读取,你自己做个代理,将操作都封装起来,设置参数一次读取指定的数量。
能说说
从EXCEL里读数据,往库里写,写前需要判断库中是否有重复的记录。
由于判断是否重复是依照EXCEL里指定的某几列为依据,我的做法是:
把库里数据依“order by 上面说的某个列”一把都读进System.Data.DataTable,,然后以二分法在DataTable.Rows检测是否有重复的数据,在库里23000条记录、EXCEL里4000条的情况下,这个比较过程为2-3秒,远比select四千次来的快。可是整个程序慢在了读取记录集上。大家有没有什么好的办法达到我要实现的功能呢。感激涕零!
其次,你的数据库大概没有建立索引,这也是慢的一个主要原因。
最后,因为不明白你的具体需求,如果真的需要用DataTable加载那么大的数据,那么请考虑以异步形式加载。
以前我做的是Excel一次上万条记录,还要每条每条的检索数据的正确性,分布式环境,每次执行导入检查都要10多,20分钟。
其次,你的数据库大概没有建立索引,这也是慢的一个主要原因。
最后,因为不明白你的具体需求,如果真的需要用DataTable加载那么大的数据,那么请考虑以异步形式加载。=================================
上面我说了我的意图,你帮看看
建索引了
异常只能让界面不卡在那里,校验过程还是漫长的。帮想想思路,一筹莫展
================================================
好,我试试,明天把结果贴出来
========================================================================
需求要求标识出所有的差异,所以全部加载(我这例子加载的是2)个字段)我试过多个线程一起跑,原先的路子是excel里的每一行都select一下,2个线程比一个线程几乎快一倍,但线程数一加上去速度的增加就急剧不明显起来,总的还是很慢的。现在全部读进记录集,然后比较,一个线程和两个没区别,三个线程开始就反而变慢了。
痛哭流涕
从EXCEL里读数据,往库里写,写前需要判断库中是否有重复的记录。
由于判断是否重复是依照EXCEL里指定的某几列为依据,我的做法是:
把库里数据依“order by 上面说的某个列”一把都读进System.Data.DataTable,,然后以二分法在DataTable.Rows检测是否有重复的数据,在库里23000条记录、EXCEL里4000条的情况下,这个比较过程为2-3秒,远比select四千次来的快。可是整个程序慢在了读取记录集上。大家有没有什么好的办法达到我要实现的功能呢。感激涕零!你只管插入数据,让ORACLE触发器来判断是否插入重复记录,如果重复里你再考虑更新,还是不更新或者删掉原来的再插入新的。用触发器肯定快的。
我是多个线程共享一个System.Data.DataRowCollection dataRows(数据库数据都在这里)、共享一个object[,] cells(EXCEL数据都在这里),然后给各个线程分派EXCEL数据的段落,让它们跑起来,各线程把比较结果放各自的System.Web.UI.WebControls.TableRow[] trs里,全部结束后由主线程调用System.Web.UI.WebControls.Table.Rows.AddRange()方法`把几个trs拼接成一个完整的表格显示在界面上。八只这路子是不是走的不好