2013-12-21 73 views
0

我正在使用SqlBulkCopy將幾個表複製到數據庫。但是,除了一個包含6000 ++行數據的表格外,大多數表格都已成功複製到數據庫。當我運行該功能時,它只是簡單地掛在那裏而沒有響應。SqlBulkCopy操作掛起並沒有響應

下面是我的代碼:

using (SqlConnection destinationConnection = Login.GetConnection()) 
{ 
    destinationConnection.Open(); 
    using (SqlTransaction transaction = destinationConnection.BeginTransaction(IsolationLevel.ReadCommited)) 
    { 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection, SqlBulkCopyOptions.KeepIdentity, transaction)) 
     { 
      bulkCopy.DestinationTableName = "dbo." + tableName; 
      try 
      { 
       bulkCopy.WriteToServer(dt); 
       transaction.Commit(); 
       bulkCopySuccess = true; 
      } 
      catch (Exception ex) 
      { 
       transaction.Rollback(); 
       MessageBox.Show(ex.Message, ex.GetType().ToString()); 
       bulkCopySuccess = false; 
      } 
     } 
    } 
} 

什麼是可能出現的問題?我的代碼有問題嗎?

+0

,如果你正在運行在它掛起主線程上面的代碼,所以你可以使用'BackgroundWorker'組件不掛主UI線程執行操作,見我的回答如下。 –

回答

1

問題:如果您從主線程運行BulkCopy代碼,它將等待/未響應,直到整個操作完成。

因此,如果用戶想對UI執行一些操作,它將完全無響應並掛起。

解決方案:您可以使用BackgroundWorker組件在背景上執行操作而不掛上UI

試試這個:

private void button1_Click(object sender, EventArgs e) 
    { 
     BackgroundWorker backgroundWorker = new BackgroundWorker(); 
     backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork); 
     backgroundWorker.RunWorkerAsync(); 
    } 

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     DoBulkCopy(); 
    } 

    private void DoBulkCopy() 
    { 
    using (SqlConnection destinationConnection = Login.GetConnection()) 
    { 
     destinationConnection.Open(); 
     using (SqlTransaction transaction = destinationConnection.BeginTransaction(IsolationLevel.ReadCommited)) 
     { 
      using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection, SqlBulkCopyOptions.KeepIdentity, transaction)) 
      { 
      bulkCopy.DestinationTableName = "dbo." + tableName;        
      try 
      { 
       bulkCopy.WriteToServer(dt); 
       transaction.Commit(); 
       bulkCopySuccess = true; 
      } 
      catch (Exception ex) 
      { 
       transaction.Rollback(); 
       MessageBox.Show(ex.Message, ex.GetType().ToString()); 
       bulkCopySuccess = false; 
      } 
      } 
     } 
     } 
} 
+0

消息框應顯示在UI線程上。 – usr

+0

已實施Backgroundworker,用戶界面不再掛起。問題解決了。非常感謝Sudhakar。 – Therenho