2009-09-16 70 views
1

我有一個c#.net程序,我需要先使用sql連接將數據插入到表中,然後使用ADO.net調整同一組數據。我不確定如何確保在執行ado.net更改之前通過sql連接插入完成。我在嘗試下面的代碼時遇到併發衝突。我猜想這是一個競賽狀況問題。C#.net併發問題 - SQL連接然後ADO.net更改

我在UpdateAll語句的點越來越併發衝突錯誤,我似乎無法繞過它

感謝您的幫助。

下面是一個代碼示例,其中SQL和ado.net的變化大大簡化了。

try 
    { 

    String deleteQuery = "DELETE FROM dbo.TABLENAME"; 

    String reportQuery = @" 

    INSERT INTO TABLENAME 
    (
    COLUMN1, 
    COLUMN2, 
    COLUMN3 
) 

    SELECT 
    COLUMN1, 
    COLUMN2, 
    COLUMN3 
    FROM OTHERTABLES 

    "; 



      SqlConnection ReportConnect = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 
      SqlCommand cmd = new SqlCommand(); 

      cmd.CommandType = CommandType.Text; 
      cmd.Connection = ReportConnect; 
      cmd.CommandTimeout = Convert.ToInt32(Properties.Settings.Default.ReportTimeout.ToString()); 


      ReportConnect.Open(); 

      cmd.CommandText = deleteQuery; 

      cmd.ExecuteNonQuery(); 

      cmd.CommandText = reportQuery; 

      cmd.ExecuteNonQuery(); 

      ReportConnect.Close(); 

      ReportConnect.Close(); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 

     } 



     try 
     { 
      foreach (DataRow dr in DataSet.TABLENAME) 
      { 
      dr[0] = whatever; 
      dr[0] = 100; 
      dr[0] = 42.42; 
      } 
     } 
     catch (Exception ax) 
     { 
      MessageBox.Show(ax.Message); 
     } 
     finally 
     { 
      this.tableAdapterManager.UpdateAll(this.DataSet); 
     } 
+0

是否this.DataSet包含表「TABLENAME」中的相同值? – 2009-09-16 05:09:05

+0

是的。我這樣做是因爲我需要對無法使用sql執行的數據集進行復雜的財務計算。我使用第一部分的結果作爲種子來執行第二部分中的caclulations,然後將它們放在完全相同的表格中。 – 2009-09-16 06:06:31

回答

2

這裏的問題是,「tableAdapterManager」似乎是在數據更改(使用sqlcommand)之前創建和打開的。如果使用嚮導創建SqlDataAdapter,默認情況下併發模式是樂觀的(因此update和delete語句會檢測數據庫是否已更改...),並且會因爲您公開的異常而失敗。

您可以在嚮導窗口中「生成SQL語句」中解決此問題,單擊「高級選項」並取消選中「使用樂觀併發」選項。

此外,您可以從form.designes.cs文件中更改此項,查找SqlDataAdapter的UpdateCommand並確保在創建SqlParameter時DataRowVersion設置爲「Default」或使用其他構造函數。

0

從理論上講,ExecuteNonQuery不會完成,直到SQL運行,使您的問題沒有意義。如果你故意不同步執行,這將是一個不同的問題,但你不是。 當然,您應該仍然知道由多個併發用戶引起的問題。

+0

我在UpdateAll語句的位置收到併發衝突錯誤,我似乎無法解決這個問題。 – 2009-09-16 04:55:00