//第一步从MySql数据库中的10个表中取出记录(公约5000条左右)
    MySqlDataReader Readers=MySqlToSqlServerMethod.SelectRecords();
    
    //第二步将取出的记录逐条插入SqlServer数据库中的一个表中
    while (Readers.Read())
    {
        //逐条插入数据
    }
以上方法运行时,在第二部非常耗时。如果第一步返回的记录上万,第二步的while 循环更慢。请问有什么好方法能比较快速的将一个Readers插到另一个库中的表中么?

解决方案 »

  1.   

    你可以一次把一张表的数据全部读取到datatable里,然后批量插入
      SqlTransaction tran = tb_Variety_myConnection.BeginTransaction();
                            SqlBulkCopy bulkCopyOrders = new SqlBulkCopy(tb_Variety_myConnection, SqlBulkCopyOptions.KeepNulls, tran);
                            bulkCopyOrders.DestinationTableName = "tb_Price";
                            bulkCopyOrders.ColumnMappings.Add("**", "iVarietyID_FK");
                            bulkCopyOrders.ColumnMappings.Add("**", "sMain");
                            bulkCopyOrders.ColumnMappings.Add("**", "dDate");
                            bulkCopyOrders.ColumnMappings.Add("**", "dTime");
                            bulkCopyOrders.ColumnMappings.Add("**", "mOpen");
                            try
                            {
                                bulkCopyOrders.WriteToServer(thisDataSet.Tables[0]);
                                tran.Commit();
                            }
                            catch (Exception ex)
                            {
                                Response.Write(ex.ToString());
                            }
      

  2.   

    插入应该在一个事务中完成,不要一条语句就开启一个事务。如果你根本没有写事务代码,那么SQL Server默认地为每一个语句自动产生一个事务。所以你需要显示地将while循环放到一个Transaction中,这样SQL Server就不会自动产生事务了。另外说明一下,所谓“插入”其实是没有意义的。真正的数据库从来不插入,而是寻找一个具有空闲记录单元的磁盘块,然后把记录写入,然后把记录加入索引。也就是说,Insert就是增加而已,谈不上什么插入。只有当你select时按照一定的order排序(如果不排序则SQL Server会默认地按照主键排序)返回数据,看到了insert的记录是有顺序的。但是insert并不是插入,只不过在追加而已。
      

  3.   


    那么Select也是这个道理么?我是用程序拼字符串,拼出一条Sql语句,然后传给一个方法返回一个MySqlDataReader。如下:string mySelectSqlStr = 查询Sql语句;
    return ConnectionSqServer.getmysqlread(mySelectSqlStr);如果返回的记录很多,这个返回过程也很慢。而且我的select语句返回的是个多表记录,如:
    “select * from table1 where id<'100' union all  select * from table2 where id<'100' union all  ........”
    这样的查询怎么优化,能让MySqlDataReader返回的快一点?
      

  4.   

    另外你所说的“所以你需要显示地将while循环放到一个Transaction中,这样SQL Server就不会自动产生事务了”,是不是就像二楼的代码那样。
      

  5.   


    意思是,多步插入改为一步插入?如果能够多步insert 也只开一个事务的话,求贴代码
      

  6.   

    1.SqlBulkCopy
    2.封装成一个包事务感觉是提供一种和数据库链接的机制,如,异常可以捕获回滚
      

  7.   

    大数据量操作 sqlbulkcopy
    using(Trsanctionscope事务操作