2013-12-21 1 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' компонент для выполнения операций без подвешивания основного потока пользовательского интерфейса, увидеть мой ответ ниже. –

ответ

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

Поле сообщения должно отображаться в потоке пользовательского интерфейса. – usr

+0

Реализованный фоновой рабочий и пользовательский интерфейс больше не висеть. Задача решена. Большое спасибо Судхакару. – Therenho