zoukankan      html  css  js  c++  java
  • 在事务中执行批量复制操作

        Microsoft SQL Server 包含名为 bcp 的常用命令行应用程序,用于快速将大文件批量复制到 SQL Server 数据库的表或视图中。使用 SqlBulkCopy 类可以编写提供类似功能的托管代码解决方案。还可以通过其他方式将数据加载到 SQL Server 表中(例如 INSERT 语句),但是 SqlBulkCopy 提供的性能要明显优于这些方式。

        SqlBulkCopy 类只能用于向 SQL Server 表中写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可以加载到 DataTable 实例或使用 IDataReader 实例读取即可。

    使用 SqlBulkCopy 类可以执行下列操作:

    • 单次批量复制操作

    • 多次批量复制操作

    • 事务中的批量复制操作

    示例1: 单次批量复制操作

        private void sqlBulkCopy()
            
    {
                
    //建立连接信息
                SqlConnectionStringBuilder sqlcsb = new SqlConnectionStringBuilder();
                
    //sqlcsb.DataSource = "SQLProduction";
                
    //sqlcsb.InitialCatalog = "Sales";
                
    //sqlcsb.IntegratedSecurity = true;
                sqlcsb.ConnectionString = @"data source=myDBServer;user id=sa;initial catalog=myDB;password=";

                SqlConnection SqlConn 
    = new SqlConnection(sqlcsb.ConnectionString);
                
    //建立获取数据命令
                
    //SqlCommand cmd = new SqlCommand("SELECT * FROM SG4262010100007", cnn);
                
    //SqlConn.Open();
                
    //SqlDataReader dataReader = cmd.ExecuteReader();


                
    string dbFile = @"C:\20071214.mdb";
                OleDbConnectionStringBuilder oleConStr 
    = new OleDbConnectionStringBuilder();
                oleConStr.ConnectionString 
    = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbFile +
                                  
    ";User Id=admin;Password=;";
                OleDbConnection OleConn 
    = new OleDbConnection(oleConStr.ConnectionString);
                OleDbCommand cmd 
    = new OleDbCommand("select * from SG4262010100007 ", OleConn);
                OleConn.Open();
                System.Data.OleDb.OleDbDataReader dataReader 
    = cmd.ExecuteReader();
                SqlConn.Open();
                SqlTransaction transaction 
    = SqlConn.BeginTransaction(); ;
                
    // 创建一个 SqlBulkCopy 对象.
                SqlBulkCopy bulkCopy = new SqlBulkCopy(SqlConn, SqlBulkCopyOptions.KeepIdentity, transaction);
                bulkCopy.BatchSize 
    = 10;
                bulkCopy.BulkCopyTimeout 
    = 500000000;
                bulkCopy.SqlRowsCopied 
    += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied);
                bulkCopy.NotifyAfter 
    = 10;

                
    //复制数据至目标对象
                bulkCopy.DestinationTableName = "SG4262010100007";
                
    try
                
    {
                    bulkCopy.WriteToServer(dataReader);
                    transaction.Commit();

                }

                
    catch (Exception err)
                
    {
                    transaction.Rollback();

                    
    throw new Exception(err.ToString());
                }

                
    // 关闭所有的对象
                bulkCopy.Close();
                dataReader.Close();
                OleConn.Close();
                SqlConn.Close();
            }


            
    void sbc_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
            
    {
                showMsg(
    "已完成行数:" + e.RowsCopied.ToString());
            }


            
    private delegate void showMsgDelegate(string msg);
            
    private void showMsgDel(string msg)
            
    {
                
    this.myRichTextBox1.AppendText(msg + System.Environment.NewLine);
            }

            
    private void showMsg(string msg)
            
    {
                
    this.BeginInvoke(new showMsgDelegate(showMsgDel), new object[] { msg });
            }

    2. 我们可以有选择性的从目标数据选取数据大批量复制至目标对象指定的字段中.

         private void HasSelSqlBulkCopy()
            
    {
                
    //建立连接信息
                SqlConnectionStringBuilder sqlcsb = new SqlConnectionStringBuilder();
                
    //sqlcsb.DataSource = "SQLProduction";
                
    //sqlcsb.InitialCatalog = "Sales";
                
    //sqlcsb.IntegratedSecurity = true;
                sqlcsb.ConnectionString = @"data source=myDBServer;user id=sa;initial catalog=myDB;password=";
                SqlConnection SqlConn 
    = new SqlConnection(sqlcsb.ConnectionString);
                
    //建立获取数据命令
                
    //SqlCommand cmd = new SqlCommand("SELECT * FROM SG4262010100007", cnn);
                
    //SqlConn.Open();
                
    //SqlDataReader dataReader = cmd.ExecuteReader();


                
    string dbFile = @"C:\20071214.mdb";
                OleDbConnectionStringBuilder oleConStr 
    = new OleDbConnectionStringBuilder();
                oleConStr.ConnectionString 
    = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbFile +
                                  
    ";User Id=admin;Password=;";
                OleDbConnection OleConn 
    = new OleDbConnection(oleConStr.ConnectionString);
                OleDbCommand cmd 
    = new OleDbCommand("select DATETIME,INFOTAG,MSGTEXT  from SG4262010100007 ", OleConn);
                OleConn.Open();
                System.Data.OleDb.OleDbDataReader dataReader 
    = cmd.ExecuteReader();
                SqlConn.Open();
                SqlTransaction transaction 
    = SqlConn.BeginTransaction(); ;
                
    // 创建一个 SqlBulkCopy 对象.
                SqlBulkCopy bulkCopy = new SqlBulkCopy(SqlConn, SqlBulkCopyOptions.KeepIdentity, transaction);
                bulkCopy.BatchSize 
    = 10;
                bulkCopy.BulkCopyTimeout 
    = 500000000;
                bulkCopy.SqlRowsCopied 
    += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied);
                bulkCopy.NotifyAfter 
    = 10;

                
    //复制数据至目标对象
                bulkCopy.DestinationTableName = "testtb";
                bulkCopy.ColumnMappings.Clear();

                
    //设置源对象与目标对象的字段对应关系
                SqlBulkCopyColumnMapping column1 =
                              
    new SqlBulkCopyColumnMapping(
                              
    "DATETIME""date");
                bulkCopy.ColumnMappings.Add(column1);
                SqlBulkCopyColumnMapping column2 
    =
                    
    new SqlBulkCopyColumnMapping(
                    
    "INFOTAG""flag");
                bulkCopy.ColumnMappings.Add(column2);
                SqlBulkCopyColumnMapping
                    column3 
    =
                    
    new SqlBulkCopyColumnMapping(
                    
    "MSGTEXT""myValue");
                bulkCopy.ColumnMappings.Add(column3);



                
    try
                
    {
                    bulkCopy.WriteToServer(dataReader);
                    transaction.Commit();

                }

                
    catch (Exception err)
                
    {
                    transaction.Rollback();

                    
    throw new Exception(err.ToString());
                }

                
    // 关闭所有的对象
                bulkCopy.Close();
                dataReader.Close();
                OleConn.Close();
                SqlConn.Close();
            }

  • 相关阅读:
    网站常见的报错
    数据库的备份与还原
    纵向tab标签切换效果
    CSS3动画 transition 过渡,宽度由中间向两边发生过渡
    移入切换图片路径;移出再切回去
    动态修改手机号
    json基本介绍及使用
    py 封装 操作json 的方法
    通过htmltestrunner模块美化报告
    记:运行测试case遇到的问题!
  • 原文地址:https://www.cnblogs.com/furenjun/p/sqlbulkcopy.html
Copyright © 2011-2022 走看看