用.net连接MySql后,两种驱动均使用(odbc和for .net)可是大量插入数据时速度非常之慢,和同等条件下的Access来比慢了将近5倍,这是为什么,起初我以为是odbc接口的问题,可是我把 Access的接口由oledb改为odbc测试一下仍然比MySql要快5倍!!!!
其实我所要插入的数据量并不大,几千条而已,可是为什么速度竟然到达分钟级别?那位大哥可以帮忙解释????急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!急!
插入方法我也用了两种比较1.循环插入2;update插入,可是并没有什么改观什么原因???
以下是我其中一种别插入方法的代码:
private void DataBaseInsert()
{
System.Data.Odbc.OdbcConnection cn =new System.Data.Odbc.OdbcConnection(this.strCnOdbc);string strSql ="insert into test.sima values (?,?,?,?)";
System.Data.Odbc.OdbcCommand cmd = new System.Data.Odbc.OdbcCommand(strSql,cn);
System.Data.Odbc.OdbcParameterCollection pc = cmd.Parameters;
pc.Add("id",System.Data.Odbc.OdbcType.Int,4);
pc.Add("ox",System.Data.Odbc.OdbcType.Double,8);
pc.Add("oy",System.Data.Odbc.OdbcType.Double,8);
pc.Add("name",System.Data.Odbc.OdbcType.Char,8);
int count = this.al.Count;
this.progressBar1.Maximum=count;
cn.Open();
for(int i=0;i<count;i++)
{
string name ="";
double ox=0,oy=0;
Form1.splitString(ref name,ref ox,ref oy,this.al[i].ToString());cmd.Parameters["id"].Value=i;
cmd.Parameters["ox"].Value=ox;
cmd.Parameters["oy"].Value=oy;
cmd.Parameters["name"].Value="name";
this.progressBar1.Value=i+1;
cmd.ExecuteNonQuery();
}
}
另外我还用postgresql尝试了一下速度也超慢,是不是.net控制数据库除了微软自己的(Access、SQL)
以外都特别慢呀????哪位同仁能上来解释一下多谢了

解决方案 »

  1.   

    可视化生成的this.sqlInsertCommand1.CommandText中有个select,去掉就行了
      

  2.   

    你可以先生成一个大的SQL脚本,然后一次性提交给数据库
    速度应该会有所提高
    StringBuilder sb = new StringBuilder();
    for(int i=0;i<count;i++)
    {
      sb.append(YourSql);
    }
    .....
    cmd.CommandText=sb.ToString();
    .....
      

  3.   

    jeffwangxm 说的 select 怎么去掉,我没用可视化生成呀
    到底速度慢的原因是什么,哪位仁兄帮忙解释一下
      

  4.   

    看了下你的程序,可以考虑不必每次都cn.Open();打开关闭连接。作个判断,插入第一条时Open,最后一条时close.这样速度会快些
      

  5.   

    代码中循环执行cmd.ExecuteNonQuery();
    IO操作过于频繁
    在循环中操作数据库是一忌
    应该尽量少地访问数据库
    前面的方法,只需要跟数据库进行一次交互
    这是最快的了。
    ACCESS是文件型数据库,跟SQL SERVE、MYSQL有本质区别的
    ACCESS在数据量小、访问用户少的情况下,是比它们快,但是数量一大就不行了
    你插入几千条资料花1分钟,不算什么的,很正常
      

  6.   

    我的cn.open()是在循环外边的,只打开一次
      

  7.   

    可是我后来又用update()进行操作得到的效果也差不多,速度也很慢,那大量插入数据应该如何才可以提高速度?比如说要插10000条数据不用循环用什么办法?一下是我用update()方法进行操作的代码
    string strSql ="select * from test.sima";
    string insertSql ="insert into test.sima values (@id,@ox,@oy,@name)";
    System.Data.DataSet ds = new DataSet();
    CoreLab.MySql.MySqlParameter parm;
    //CoreLab.PostgreSql.PgSqlConnection cn = new PgSqlConnection(this.strCn);
    CoreLab.MySql.MySqlDataAdapter adapter = new CoreLab.MySql.MySqlDataAdapter(strSql,this.strCn);
    adapter.Fill(ds,"sima");
    int count = this.al.Count;
    this.progressBar1.Maximum=count;
    //ds.Tables[0].RowChanged+=new DataRowChangeEventHandler(Row_Changed);
    for(int i=0;i<count;i++)
    {

    string name ="";
    double ox=0,oy=0;
    Form1.splitString(ref name,ref ox,ref oy,this.al[i].ToString());
    adapter.InsertCommand=new CoreLab.MySql.MySqlCommand(insertSql,this.mySqlConnection1);
    parm=adapter.InsertCommand.Parameters.Add("@id",CoreLab.MySql.MySqlType.Int,4,"id");
    parm.SourceVersion=DataRowVersion.Current;
    parm.SourceColumn="id"; parm=adapter.InsertCommand.Parameters.Add("@ox",CoreLab.MySql.MySqlType.Double,8,"ox");
    parm.SourceVersion=DataRowVersion.Current;
    parm.SourceColumn="ox"; parm=adapter.InsertCommand.Parameters.Add("@oy",CoreLab.MySql.MySqlType.Double,8,"oy");
    parm.SourceVersion=DataRowVersion.Current;
    parm.SourceColumn="oy"; parm=adapter.InsertCommand.Parameters.Add("@name",CoreLab.MySql.MySqlType.Char,8,"name");
    parm.SourceVersion=DataRowVersion.Current;
    parm.SourceColumn="name"; this.progressBar1.Value=i+1;
    ds.Tables[0].Rows.Add(new object[]{i,ox,oy,name});////重要
    adapter.Update(ds.Tables[0]);
      

  8.   

    这样写行不行,为什么报错,是不时sql语句有毛病?
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    string strSql="";
    for(int i=1;i<3;i++)
    {
    strSql = "insert into test.sima values ("+i+",1.2,1.3,5)";
    sb.Append(strSql);
    }
    MySql.Data.MySqlClient.MySqlCommand cmd = new MySqlCommand(sb.ToString(),cn);
      

  9.   

    下面是mysql下进行插入数据的代码,自己看一下吧.
    public void InsertRow(string myConnectionString) 
    {
        // If the connection string is null, use a default.
        if(myConnectionString == "") 
        {
            myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass";
        }
        MySqlConnection myConnection = new MySqlConnection(myConnectionString);
        string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)";
        MySqlCommand myCommand = new MySqlCommand(myInsertQuery);
        myCommand.Connection = myConnection;
        myConnection.Open();
        myCommand.ExecuteNonQuery();
        myCommand.Connection.Close();
    }
      

  10.   

    其实楼主你要看了mysql for .net的帮助你就知道了,mysql提供了一整套基本和sqlserver数据库一样的一些个方法.所以你操作mysql完全可以和操作mysql一样的,只不过在sqlconnection等前面要加一个mysql
      

  11.   

    赫赫,现在用.net操作数据库一点问题都没有,关键现在的问题就是用它大量插入数据速度非常的慢不知道什么原因,刚才(心中有片蓝天)说的大量io操作影响速度,现在我该为了用stringBuilder,并且调试通了,但是速度仍然没有起色,很为难呀!!
    以下是条通知后的代码:速度还是将近1分钟....
    MySql.Data.MySqlClient.MySqlConnection cn = new MySqlConnection(this.strCn);
    cn.Open();
    this.progressBar1.Maximum=1000;
    System.Text.StringBuilder sb = new System.Text.StringBuilder();
    string strSql="";

    for(int i=1;i<=1000;i++)
    {
    strSql = "insert into test.sima values ("+i+",1.2,1.3,5)";
    sb.Append(strSql+";");
    this.progressBar1.Value=i;
    }
    MySql.Data.MySqlClient.MySqlCommand cmd = new MySqlCommand(sb.ToString(),cn);
    cmd.ExecuteNonQuery();
    cn.Close();
      

  12.   

    string strSql ="insert into test.sima values (?,?,?,?)";
    修改一下你的insert语句,把字段名都指定,看看是否不一样?
    string strSql ="insert into test.sima (id,ox,oy,name) values (?,?,?,?)";
      

  13.   

    可以先将数据存储在一个临时的数据库,或是XML中,然后,等到一个比较好的时间,在将数据倒入到mysql中就可以了
      

  14.   

    速度能提高吗?我从dataset中插入不也一样吗,现在的问题就是速度超级慢,怎么解决?
      

  15.   

    不知道大家都看没看我的代码,用Access速度一点问题没有,我共用了三种不同的方式进行插入。
      

  16.   

    Access数据库是文件形数据库,在用户少、数据库不大的情况下操作是很快的,用户多、数据库大的时候,就会特别慢。
    而MYSQL、sql server、oracle数据库在设计过程中考虑到太多的并发、事务等因素,所以你会感觉到比ACCESS慢,这是很正常的。
    我认为现在的速度都是正常的了,无法再提升了。
      

  17.   

    那用c#向MySql,sql、 server、oracale等数据库中大量插入数据,岂不是没有办法了?
      

  18.   

    是否和你my sql数据库的结构有关呢,比如不必要的索引之类的或者看看同样结构在sql server中的速度怎样
      

  19.   

    你的mysql是在本机嘛?如果是,在cmd.ExecuteNonQuery();后面加一个Application.DoEvents();看看。