在DotNet中用Insert Into语句插入1万条记录大概要45s,而在VB中用AddNew只要4s;
大家在一条条插入大量数据时一般通过什么方法?

解决方案 »

  1.   

    操作的是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();
    }
      

  2.   

    DotNet中有没有类似Ado,AddNew的方法?
      

  3.   

    這樣肯定會比較慢的啦!
    最好用存儲過程﹐如果不放便﹐可以用Command加參數﹐通過給Command的參數賦值來執行添加數據。
      

  4.   

    操作的是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();
                    }
      

  5.   


    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();
                    }
      

  6.   

    cmdDest.Parameters.Clear();
    忘了这一句不要.
      

  7.   

    可能是程序编写上有别的问题,正常情况不可能这么慢.
    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
      

  8.   

    光说对数据的操作方面,VB可能比DotNet快,不过用MSSQL可能就不一样了。尤其是带参数之后。我在本机测试:PM1.6, DDR333 768M, 插入本机MSSQL2K,平均每条小于0.4ms.
      

  9.   

    应该是Ado的AddNew方法比Sql语句的Insert快,不过资料上都说insert快,真搞不懂,为什么会这样
      

  10.   

    没有人遇到这种问题吗?
    大家在需一条条往access中插入大量数据时如何处理?
      

  11.   

    VB是采用ADO的AddNew,然后UpdateBatch统一提交。
    你试验一下用ADO.net的DataSet打开表,然后循环添加,最后更新DataSet的办法,比较一下速度,我这里暂时没.net环境
      

  12.   

    试试使用DataAdapter的update方法可以update一个datatable,而不需要一条一条的处理
      

  13.   

    另外 增加一行command.Prepare看看
      

  14.   

    支持用意见:使用DataAdapter的update方法批量更新
      

  15.   

    感觉DataAdpater不见得会快,如果结合SqlCommandBuilder的话
      

  16.   

    试试使用DataAdapter的update方法可以update一个datatable,而不需要一条一条的处理----------------------------------------------
    这个也不行,填充datatable还是很快的,但用DataAdapter的update方法时就比较慢了,和一条条insert区别不大
      

  17.   

    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
      

  18.   

    首先需要这么多的数据,现在access就是一种错误!
      

  19.   

    这么点数据,用Access完全能胜任
      

  20.   

    如果要用dotnet+access进行开发,插入大量数据如果解决插入慢的问题?
      

  21.   

    .net+access,就是程序优化的很好了,也快不到哪去。DataAdapter也快不了的。
      

  22.   

    .net+access,就是程序优化的很好了,也快不到哪去。DataAdapter也快不了的。
    --------------------------------------------------------
    有什么依据证明你的说法不?我这样说了,老板未必会信啊
      

  23.   

    我写了一下程序把搂主的ado.net方案测试了一下,使用Command Insert方式执行,大概要执行1分11秒,
    用DataAdapter.Update(DataSet)方式来更新,64秒钟。用DAO效率最高
    ADO 次之
    ADO.net最慢数据库换成SQL Server,速度有提升,但是ADO还是快。
      

  24.   

    在dotnet 1.1中,DBAdapter的Update()方法,就是转化为DBCommand来执行的。不会有速度上的差别。可能在构造查询对象、查询参数、还有Command对象的CommandBehavior属性的不同会给结果造成不同。在dotnet里面访问access,速度可能比老vb用ado慢,因为oledb是对ado的再次包装,而且不支持oledb的批量方式等很多特性。