2011-11-27 120 views
4

我需要從表中刪除一些記錄,然後插入一些記錄到同一個表。這個刪除和插入過程應該在事務中。刪除不能在與SQL批量插入事務處理

下面是我做的。

using (SqlConnection sqlConn = new SqlConnection(connectionString)) 
     { 
      sqlConn.Open(); 
      using (SqlTransaction sqlTran = sqlConn.BeginTransaction()) 
      { 
       string deleteQuery = "delete from dbo.MyTable where Col1 =" + colValue; 
       SqlCommand sqlComm = new SqlCommand(deleteQuery, sqlConn,sqlTran); 
       sqlComm.ExecuteNonQuery(); 
       using (SqlBulkCopy sqlcopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.Default, sqlTran)) 
       { 
        sqlcopy.BatchSize = 10; 
        sqlcopy.DestinationTableName = "MyTable"; 
        try 
        { 
         sqlcopy.WriteToServer(dsDataSet.Tables[0]); 
         sqlTran.Commit(); 
        } 
        catch (Exception ex) 
        { 
         sqlTran.Rollback(); 
        } 
       } 
      } 
     } 

但是,我想作爲刪除操作沒有得到執行前插入,我得到重複的關鍵錯誤。有人能幫忙嗎?

回答

6

我試過你的示例代碼,它似乎適用於我。我在其中一列創建了一個PK來確保重複的插入操作會引發錯誤。然後我運行代碼兩次 - 第一次通過它放入一些虛擬數據(沒有錯誤拋出),第二次通過它嘗試刪除數據,然後重新插入相同的事務。從你的問題來看,我希望能在第二次獲得例外,但它的工作。不確定是否重要,但我正在運行SQL Server 2008 R2 SP1。

下面是我使用的完整測試代碼,它可能會幫助您識別您的問題。

首先SQL創建示例表:

CREATE TABLE [dbo].[MyTable](
    [Col1] [nvarchar](20) NOT NULL, 
    [Col2] [nvarchar](20) NULL, 
    [Col3] [nvarchar](30) NULL, 
    CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
    (
     [Col1] ASC 
    ) 
) 

和C#:在您的問題

public static void Main() 
{ 
    DataTable t = new DataTable(); 
    t.Columns.Add(new DataColumn("Col1")); 
    t.Columns.Add(new DataColumn("Col2")); 
    t.Columns.Add(new DataColumn("Col3")); 
    for (int i = 0; i < 5; i++) 
    { 
     var r1 = t.NewRow(); 
     r1["Col1"] = "1" + i.ToString(); 
     r1["Col2"] = "2" + i.ToString(); 
     r1["Col3"] = "3" + i.ToString(); 
     t.Rows.Add(r1); 
    } 
    t.AcceptChanges(); 
    var connectionString = new SqlConnectionStringBuilder(); 
    connectionString.DataSource = "localhost"; 
    connectionString.InitialCatalog = "testdb"; 
    connectionString.IntegratedSecurity = true; 

    using (SqlConnection sqlConn = new SqlConnection(connectionString.ToString())) 
    { 
     sqlConn.Open(); 
     using (SqlTransaction sqlTran = sqlConn.BeginTransaction()) 
     { 
      string deleteQuery = "delete from MyTable"; // just delete them all 
      SqlCommand sqlComm = new SqlCommand(deleteQuery, sqlConn, sqlTran); 
      sqlComm.ExecuteNonQuery(); 
      using (SqlBulkCopy sqlcopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.Default, sqlTran)) 
      { 
       sqlcopy.BatchSize = 10; 
       sqlcopy.DestinationTableName = "MyTable"; 
       try 
       { 
        sqlcopy.WriteToServer(t); 
        sqlTran.Commit(); 
       } 
       catch (Exception ex) 
       { 
        sqlTran.Rollback(); 
       } 
      } 
     } 
    } 

} 

更新 順便說一句,你沒有得到一個錯誤,因爲2011/11/23被評爲數學表達式('/'是除法),結果爲0,然後隱式地將其轉換爲1900/01/01的日期時間。嘗試運行查詢「select CONVERT(datetime,11/23/2011)」,你會明白我的意思。

+0

對不起..我在我的刪除查詢中犯了一個錯誤..這是一個日期列,我錯過了單引號。而不是下面的「刪除dbo.MyTable哪裏日期= '11/23/2011'」,我剛剛給它作爲「刪除dbo.MyTable哪裏日期= 2011年11月23日」。但我想知道爲什麼我沒有得到這個錯誤。非常感謝你的詳細分析。 – Muthukumar

+0

太好了,感謝發佈結果。 – JohnD

+1

關於爲什麼11/23/2011沒有給出錯誤的更新答案。 – JohnD