为何在DotNet中用Insert Into插入记录如此之慢?难道还不如VB中的AddNew? 在DotNet中用Insert Into语句插入1万条记录大概要45s,而在VB中用AddNew只要4s;大家在一条条插入大量数据时一般通过什么方法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 操作的是Access数据库:执行语句如下: OleDbCommand cmdSource = new OleDbCommand("Select * from testtable",connSource); OleDbDataReader drSource = cmdSource.ExecuteReader(); //------- while(drSource.Read()) System.Text.StringBuilder cmdTextDest = new System.Text.StringBuilder(); cmdTextDest.Append("Insert into tongji(RECNO,QUESTION_NO,[MODULE],SCORE,DIFICULT,DISTIN,GETSCORE,STUDENT_ID,QUESTION_TYPE,IsSend,IsJie,Num,papername,ScoreType,c_datacode)"); cmdTextDest.Append(" Values(" + drSource["RECNO"]); cmdTextDest.Append("," + drSource["QUESTION_NO"]); cmdTextDest.Append(",'" + drSource["MODULE"].ToString()); cmdTextDest.Append("'," + drSource["SCORE"]); cmdTextDest.Append(",'" + drSource["DIFICULT"].ToString()); cmdTextDest.Append("','" + drSource["DISTIN"].ToString()); cmdTextDest.Append("'," + drSource["GETSCORE"]); cmdTextDest.Append(",'" + drSource["STUDENT_ID"].ToString()); cmdTextDest.Append("','" + drSource["QUESTION_TYPE"].ToString()); cmdTextDest.Append("'," + drSource["IsSend"]); cmdTextDest.Append("," + drSource["IsJie"]); cmdTextDest.Append(",0");// + drSource["Num"]); cmdTextDest.Append(",'" + drSource["papername"].ToString()); cmdTextDest.Append("','" + drSource["ScoreType"]).ToString(); cmdTextDest.Append("','" + drSource["c_datacode"].ToString()); cmdTextDest.Append("')"); cmdDest.CommandText = cmdTextDest.ToString(); cmdDest.ExecuteNonQuery();} DotNet中有没有类似Ado,AddNew的方法? 這樣肯定會比較慢的啦!最好用存儲過程﹐如果不放便﹐可以用Command加參數﹐通過給Command的參數賦值來執行添加數據。 操作的是Access 没有存储过程---------------------------------用command的结果也是比较慢 while(drSource.Read()) { string commandText = "Insert into tongji(RECNO,QUESTION_NO) Values(@RECNO,@QUESTION_NO)"; OleDbParameter[] param = new OleDbParameter[2]; param[0] = new OleDbParameter("@RECNO",drSource["RECNO"]); param[1] = new OleDbParameter("@QUESTION_NO",drSource["QUESTION_NO"]); cmdDest.Parameters.Add(param[0]); cmdDest.Parameters.Add(param[1]); cmdDest.CommandText = commandText; cmdDest.ExecuteNonQuery(); cmdDest.Parameters.Clear(); //------- txtProgress.Text = index.ToString(); index ++; Application.DoEvents(); } string commandText = "Insert into tongji(RECNO,QUESTION_NO) Values(@RECNO,@QUESTION_NO)"; OleDbParameter[] param = new OleDbParameter[2]; param[0] = new OleDbParameter("@RECNO",""); param[1] = new OleDbParameter("@QUESTION_NO","") cmdDest.Parameters.Add(param[0]); cmdDest.Parameters.Add(param[1]); cmdDest.CommandText = commandText;while(drSource.Read()) { cmdDest.Parameters[0].Value=drSource["RECNO"]; cmdDest.Parameters[1].Value=drSource["QUESTION_NO"]; cmdDest.ExecuteNonQuery(); cmdDest.Parameters.Clear(); //------- txtProgress.Text = index.ToString(); index ++; Application.DoEvents(); } cmdDest.Parameters.Clear();忘了这一句不要. 可能是程序编写上有别的问题,正常情况不可能这么慢.string strSQL ="insert into T_SelfCustomerFees values('{0}','{1}','{2}','{3}','{4}','{5}')"; for(int i =0;i<10000;i++) { Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text, string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","1","2003-3-26","6000","sdf")); Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text, string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","2","2004-5-26","500","sdf")); Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text, string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","3","2005-7-26","500","sdf")); Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text, string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","4","2002-9-26","6000","sdf")); Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text, string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","5","2001-11-26","300","sdf")); Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text, string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","6","2000-12-26","6000","sdf")); }以上插入6万条才1分钟多点,以上代码还可以做很多方面优化,如果改用一个连接等.我电脑的配置并不高:p4 1.8,512M 光说对数据的操作方面,VB可能比DotNet快,不过用MSSQL可能就不一样了。尤其是带参数之后。我在本机测试:PM1.6, DDR333 768M, 插入本机MSSQL2K,平均每条小于0.4ms. 应该是Ado的AddNew方法比Sql语句的Insert快,不过资料上都说insert快,真搞不懂,为什么会这样 没有人遇到这种问题吗?大家在需一条条往access中插入大量数据时如何处理? VB是采用ADO的AddNew,然后UpdateBatch统一提交。你试验一下用ADO.net的DataSet打开表,然后循环添加,最后更新DataSet的办法,比较一下速度,我这里暂时没.net环境 试试使用DataAdapter的update方法可以update一个datatable,而不需要一条一条的处理 另外 增加一行command.Prepare看看 支持用意见:使用DataAdapter的update方法批量更新 感觉DataAdpater不见得会快,如果结合SqlCommandBuilder的话 试试使用DataAdapter的update方法可以update一个datatable,而不需要一条一条的处理----------------------------------------------这个也不行,填充datatable还是很快的,但用DataAdapter的update方法时就比较慢了,和一条条insert区别不大 http://www.easewe.com/SoftWare/downSoft.aspx?id=27&from=fromother上面这个是用VB写的一个insert和AddNew插入速度的测试程序,有兴趣的朋友请看看另外在VB版我也问了这个问题,也还没有明确的答案http://community.csdn.net/Expert/topic/4242/4242929.xml?temp=.256283 首先需要这么多的数据,现在access就是一种错误! 这么点数据,用Access完全能胜任 如果要用dotnet+access进行开发,插入大量数据如果解决插入慢的问题? .net+access,就是程序优化的很好了,也快不到哪去。DataAdapter也快不了的。 .net+access,就是程序优化的很好了,也快不到哪去。DataAdapter也快不了的。--------------------------------------------------------有什么依据证明你的说法不?我这样说了,老板未必会信啊 我写了一下程序把搂主的ado.net方案测试了一下,使用Command Insert方式执行,大概要执行1分11秒,用DataAdapter.Update(DataSet)方式来更新,64秒钟。用DAO效率最高ADO 次之ADO.net最慢数据库换成SQL Server,速度有提升,但是ADO还是快。 在dotnet 1.1中,DBAdapter的Update()方法,就是转化为DBCommand来执行的。不会有速度上的差别。可能在构造查询对象、查询参数、还有Command对象的CommandBehavior属性的不同会给结果造成不同。在dotnet里面访问access,速度可能比老vb用ado慢,因为oledb是对ado的再次包装,而且不支持oledb的批量方式等很多特性。 截取字符串问题 属性Font的默认值怎么写 关于使用Xceed FTP for .net 控件时碰到的问题 类的继承方面的问题 if语句通不过编译? 关于技术文档中的抽象方法 点NET,C#两个问题?? C# Json第三方类库Newtonsoft.Json 求DotNet控件 java与.net那个更有前途? 数据透视表中怎么对鼠标所选中的列进行上下排序,急! 什么是事件流,什么是业务流?什么是事务流?
执行语句如下:
OleDbCommand cmdSource = new OleDbCommand("Select * from testtable",connSource);
OleDbDataReader drSource = cmdSource.ExecuteReader();
//-------
while(drSource.Read()) System.Text.StringBuilder cmdTextDest = new System.Text.StringBuilder();
cmdTextDest.Append("Insert into tongji(RECNO,QUESTION_NO,[MODULE],SCORE,DIFICULT,DISTIN,GETSCORE,STUDENT_ID,QUESTION_TYPE,IsSend,IsJie,Num,papername,ScoreType,c_datacode)");
cmdTextDest.Append(" Values(" + drSource["RECNO"]);
cmdTextDest.Append("," + drSource["QUESTION_NO"]);
cmdTextDest.Append(",'" + drSource["MODULE"].ToString());
cmdTextDest.Append("'," + drSource["SCORE"]);
cmdTextDest.Append(",'" + drSource["DIFICULT"].ToString());
cmdTextDest.Append("','" + drSource["DISTIN"].ToString());
cmdTextDest.Append("'," + drSource["GETSCORE"]);
cmdTextDest.Append(",'" + drSource["STUDENT_ID"].ToString());
cmdTextDest.Append("','" + drSource["QUESTION_TYPE"].ToString());
cmdTextDest.Append("'," + drSource["IsSend"]);
cmdTextDest.Append("," + drSource["IsJie"]);
cmdTextDest.Append(",0");// + drSource["Num"]);
cmdTextDest.Append(",'" + drSource["papername"].ToString());
cmdTextDest.Append("','" + drSource["ScoreType"]).ToString();
cmdTextDest.Append("','" + drSource["c_datacode"].ToString());
cmdTextDest.Append("')");
cmdDest.CommandText = cmdTextDest.ToString();
cmdDest.ExecuteNonQuery();
}
最好用存儲過程﹐如果不放便﹐可以用Command加參數﹐通過給Command的參數賦值來執行添加數據。
---------------------------------
用command的结果也是比较慢
while(drSource.Read())
{
string commandText = "Insert into tongji(RECNO,QUESTION_NO) Values(@RECNO,@QUESTION_NO)";
OleDbParameter[] param = new OleDbParameter[2];
param[0] = new OleDbParameter("@RECNO",drSource["RECNO"]);
param[1] = new OleDbParameter("@QUESTION_NO",drSource["QUESTION_NO"]);
cmdDest.Parameters.Add(param[0]);
cmdDest.Parameters.Add(param[1]);
cmdDest.CommandText = commandText;
cmdDest.ExecuteNonQuery();
cmdDest.Parameters.Clear();
//-------
txtProgress.Text = index.ToString();
index ++;
Application.DoEvents();
}
string commandText = "Insert into tongji(RECNO,QUESTION_NO) Values(@RECNO,@QUESTION_NO)";
OleDbParameter[] param = new OleDbParameter[2];
param[0] = new OleDbParameter("@RECNO","");
param[1] = new OleDbParameter("@QUESTION_NO","")
cmdDest.Parameters.Add(param[0]);
cmdDest.Parameters.Add(param[1]);
cmdDest.CommandText = commandText;while(drSource.Read())
{
cmdDest.Parameters[0].Value=drSource["RECNO"];
cmdDest.Parameters[1].Value=drSource["QUESTION_NO"];
cmdDest.ExecuteNonQuery();
cmdDest.Parameters.Clear();
//-------
txtProgress.Text = index.ToString();
index ++;
Application.DoEvents();
}
忘了这一句不要.
string strSQL ="insert into T_SelfCustomerFees values('{0}','{1}','{2}','{3}','{4}','{5}')";
for(int i =0;i<10000;i++)
{
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text,
string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","1","2003-3-26","6000","sdf"));
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text,
string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","2","2004-5-26","500","sdf"));
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text,
string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","3","2005-7-26","500","sdf"));
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text,
string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","4","2002-9-26","6000","sdf"));
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text,
string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","5","2001-11-26","300","sdf"));
Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery("data source=rjb;initial catalog=HBIDCDB;user id=sa;pwd=gentle123;",System.Data.CommandType.Text,
string.Format(strSQL,Guid.NewGuid(),"5359408f-cb51-4efa-bc5c-5c58e4bb90c4","6","2000-12-26","6000","sdf"));
}
以上插入6万条才1分钟多点,以上代码还可以做很多方面优化,如果改用一个连接等.
我电脑的配置并不高:p4 1.8,512M
大家在需一条条往access中插入大量数据时如何处理?
你试验一下用ADO.net的DataSet打开表,然后循环添加,最后更新DataSet的办法,比较一下速度,我这里暂时没.net环境
这个也不行,填充datatable还是很快的,但用DataAdapter的update方法时就比较慢了,和一条条insert区别不大
上面这个是用VB写的一个insert和AddNew插入速度的测试程序,有兴趣的朋友请看看另外在VB版我也问了这个问题,也还没有明确的答案http://community.csdn.net/Expert/topic/4242/4242929.xml?temp=.256283
--------------------------------------------------------
有什么依据证明你的说法不?我这样说了,老板未必会信啊
用DataAdapter.Update(DataSet)方式来更新,64秒钟。用DAO效率最高
ADO 次之
ADO.net最慢数据库换成SQL Server,速度有提升,但是ADO还是快。