2012-11-02 68 views
0

我是SQL新手,在我的項目中,我試圖從DataBase表中填充DataSet,然後在DataSet中插入新行。做完這些之後,我再次使用DataSet數據填充數據庫表。在填寫之前,我正在清除或刪除數據庫表數據。嗯,我用下面的代碼來實現這一點:當代碼執行不正確時回滾更改

Database Table --> myTable 
DataSet --> ds 

OnButtonClick

string strQuery = "delete from [dbo].[myTable]" 
    SqlConnection conn = new SqlConnection(strConn); 
    SqlCommand cmd = new SqlCommand(strQuery, conn); 
    SqlCommand command; 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    using (cmd) 
    { 
     using (conn) 
     { 
     conn.Open(); 
     cmd.ExecuteNonQuery();     //deleting database table data 
     foreach (DataRow dr in ds.Tables[0].Rows) //Inserting new data into the Database table 
     { 
      command = new SqlCommand(InsertQuery, conn); 
      command.ExecuteNonQuery(); 
     } 
     conn.Close(); 
     } 
    } 

上面的代碼工作正常,但是當存在command任何異常的SqlCommand則刪除數據庫表完全沒有填充DataSet。任何修改此代碼的建議?請幫忙。

UPDATE:

  string strQuery = "delete from [dbo].[myTable]"; 
      using (SqlCommand cmd = new SqlCommand(strQuery, conn)) 
      { 
       using (SqlCommand cmdReset = new SqlCommand("DBCC CHECKIDENT('myTable', RESEED, 0)", conn)) 
       { 
        SqlDataAdapter da = new SqlDataAdapter(cmd); 
        conn.Open(); 
        SqlTransaction sqlTransaction = conn.BeginTransaction(); 
        cmd.Transaction = sqlTransaction; 
        try 
        { 
         cmd.ExecuteNonQuery();     //deleting database table data 
         cmdReset.ExecuteNonQuery();    //Resetting Identity of first column 
         foreach (DataRow dr in ds.Tables[0].Rows) //Inserting new data into the Database table 
         { 
          command = new SqlCommand(query.createDoctorRow(InsertQuery, conn); 
          command.ExecuteNonQuery(); 
         } 
         sqlTransaction.Commit(); 
         conn.Close(); 
        } 
        catch (Exception e) 
        { 
         sqlTransaction.Rollback(); 
     /*ERROR*/  throw; 
        } 
       } 
      } 

ERROR - >「的ExecuteNonQuery要求命令有一個交易時分配給該命令的連接是處於掛起本地事務的事務屬性。命令尚未初始化。「

+5

請考慮一個更具描述性的標題給你的問題。它應該是你的問題的簡要總結。 =) –

+0

雅我在想,但仍然困惑着要保持什麼。抱歉。 –

+0

我不知道該怎麼做。我是SQL新手。請不要說任何SQL我想盡可能使用c#做這個事情 –

回答

4

使用事務來運行SQL

string strQuery = "delete from [dbo].[myTable]"; 

using (SqlConnection conn = new SqlConnection(strConn)) 
{ 
    using (cmd = new SqlCommand(strQuery, conn)) 
    { 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    conn.Open(); 
    SqlTransaction sqlTransaction = conn.BeginTransaction(); 
    cmd.Transaction = sqlTransaction; 
    try 
    { 
     cmd.ExecuteNonQuery();     //deleting database table data 
     foreach (DataRow dr in ds.Tables[0].Rows) //Inserting new data into the Database table 
     { 
      command = new SqlCommand(InsertQuery, conn); 
      command.ExecuteNonQuery(); 
     } 
     sqlTransaction.Commit(); 
     conn.Close(); 
    } 
    catch(Exception e) 
    { 
     sqlTransaction.Rollback(); 
     throw; 
    } 
    } 

}

交易形成全有或全無的情況。事務中的所有內容都可以正常工作並承諾到數據庫,否則整個事件都會被取消,就好像事情沒有發生一樣。

+0

我不知道該怎麼做。我是SQL新手。請不要說我想盡可能使用c#做任何SQL事情 –

+0

@Mr_Green對不起,花了我一點時間寫代碼! –

+3

這是C#。如果你打算使用SQL,你需要學習「SQL事物」。 –

3

這個example有一個很好的方法來在事務範圍內包裝sql命令。基本上,如果在任何行插入期間拋出異常,刪除查詢也會失敗。

在果殼你包裏面

using (TransactionScope scope = new TransactionScope()) 
     { 
      using (SqlConnection connection1 = new SqlConnection(connectString1)) 
      { 
       //enter your code here 
      } 
     } 

一切你也不必按行做一個插入行,你可以使用SqlBulkCopy更有效地做到這一點。

using (SqlConnection connection =new SqlConnection(connectionString)) 
{ 
     connection.Open(); 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) 
     {        
        bulkCopy.DestinationTableName = table.TableName; 
        bulkCopy.WriteToServer(table); 
     } 
    }