在事務中執行批量複製操作SqlBulkCopy,SqlTransaction

 

    Microsoft SQL Server 包含名爲 bcp 的常用命令行應用程序,用於快速將大文件批量複製到 SQL Server 數據庫的表或視圖中。使用 <?XML:NAMESPACE PREFIX = MSHELP />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();
        }

發佈了124 篇原創文章 · 獲贊 7 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章