求oledb.net插入10000条记录的时间测试数据 要求测试条件是:C#+winform+Access数据库,求向一个表中插入10000条记录所用的时间。我的目的是录求一个优化的目标,因为在我的系统里竟跑了10分钟才执行完成,被客户骂晕了。所以请有用符合我的测试条件做过序程序的朋友帮忙测试下提供点数据,跪谢了。另外要说明:未经测试的数据千万别发上来呀,别害人啊。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 表的结构大概是:RecId 自动编号 主键BillId nvarchar(20) 外键ProId nvarchar(20) 外键Qty intPrice MoneyUnit nvarchar(10)Re nvarchar(200)至于数据来源,执行插入操作时已全部存到内存里,我的具体做法是先把所有明细记录存在一个集合里:List<BillDetails>,等所有明细录入完毕再循环一条记录一条记录保存,我要的就是在List<BillDetails>已经有了一万条记录后点击保存按钮开始保存到保存完成所需要的时间。 刚刚Google了一下,有篇文章说存12000条记录用了23秒还歉慢,说java只需要9秒大家说说有这么牛吗?达不到啊。 你应该循环拼接一个StringBuilder,然后一次性执行:cmd.CommandType = CommandType.Text;cmd.CommandText = stringBuilder;cmd.ExecuteNonQuery(); 用的是access的啊。 拼接一个StringBuilder,然后一次性执行,这样可以吗??access支持这样的吗? 将cmd.CommandText属性的值设置为一堆sql语句,一次性执行。我在sql server里面试验过,你用Access试试吧。 12000条8秒下面是测试代码,表结构与楼主相同 DateTime b = DateTime.Now; OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\My Documents\db2.Mdb;"; conn.Open(); OleDbTransaction trans = conn.BeginTransaction(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.Transaction = trans; string sql = string.Empty; for ( int i = 0; i <= 12000; i++ ) { sql = string.Format( "insert into ttt (BillId,ProId,Qty,Price,Unit,Re) values ('{0}','{1}',{2},{3},'{4}','{5}')" , "Billid" + i.ToString() , "ProId" + i.ToString() , i , i * 0.258 , "U" + i.ToString() , "Re" + i.ToString() ); cmd.CommandText = sql; cmd.ExecuteNonQuery(); } trans.Commit(); conn.Close(); DateTime ee = DateTime.Now; Console.WriteLine( b ); Console.WriteLine( ee );不知道楼主的代码是如果实现的下面给出一些建议1、采用长链接,即所有数据采用一个链接来处理2、启动事务3、从楼主的描述来看,可能采用了实体类,那么应该是使用类似三层的架构,通过DBHELP来处理数据的这样即使启用了事务之类的,一个一个地循环传进去也会降低效率可以考虑在SQL层增加一个重载,接收实体类数组或集合来保存4、将ACCESS数据库用ACCESS打开,用工具菜单中的功能 ,将数据库压缩修复一下 C# 2个小问题,分不多,问题也很基础吧 在查看网页的源码时有下面的语句如何用C#来获取呢 C#绘图闪烁问题。 c# 文件权限操作 一些算法的问题,求解各位高人,无比感谢!! 我想提醒大家的是:要时时刻刻保存!! 无法获取托管类型的变量地址或大小? 请问如果用c#做个虚拟光驱的程序能不能做到? C# windows Form下,如何使用水晶报表问题! visual studio 2015 打开项目时卡住卡在“准备项目” 关于北大青鸟课程三层结构中创建DATASET的代码位置问题 在panel里的窗体,为什么不能MDI?
RecId 自动编号 主键
BillId nvarchar(20) 外键
ProId nvarchar(20) 外键
Qty int
Price Money
Unit nvarchar(10)
Re nvarchar(200)至于数据来源,执行插入操作时已全部存到内存里,我的具体做法是先把所有明细记录存在一个集合里:List<BillDetails>,等所有明细录入完毕再循环一条记录一条记录保存,我要的就是在List<BillDetails>已经有了一万条记录后点击保存按钮开始保存到保存完成所需要的时间。
大家说说有这么牛吗?达不到啊。
你应该循环拼接一个StringBuilder,然后一次性执行:cmd.CommandType = CommandType.Text;
cmd.CommandText = stringBuilder;
cmd.ExecuteNonQuery();
拼接一个StringBuilder,然后一次性执行,这样可以吗??
access支持这样的吗?
将cmd.CommandText属性的值设置为一堆sql语句,一次性执行。
我在sql server里面试验过,你用Access试试吧。
下面是测试代码,表结构与楼主相同 DateTime b = DateTime.Now; OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\My Documents\db2.Mdb;";
conn.Open(); OleDbTransaction trans = conn.BeginTransaction();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.Transaction = trans;
string sql = string.Empty; for ( int i = 0; i <= 12000; i++ )
{
sql = string.Format( "insert into ttt (BillId,ProId,Qty,Price,Unit,Re) values ('{0}','{1}',{2},{3},'{4}','{5}')"
, "Billid" + i.ToString()
, "ProId" + i.ToString()
, i
, i * 0.258
, "U" + i.ToString()
, "Re" + i.ToString()
);
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
} trans.Commit();
conn.Close(); DateTime ee = DateTime.Now;
Console.WriteLine( b );
Console.WriteLine( ee );
不知道楼主的代码是如果实现的
下面给出一些建议
1、采用长链接,即所有数据采用一个链接来处理
2、启动事务
3、从楼主的描述来看,可能采用了实体类,那么应该是使用类似三层的架构,通过DBHELP来处理数据的
这样即使启用了事务之类的,一个一个地循环传进去也会降低效率
可以考虑在SQL层增加一个重载,接收实体类数组或集合来保存
4、将ACCESS数据库用ACCESS打开,用工具菜单中的功能 ,将数据库压缩修复一下