2013-09-24 31 views
1

嗨我有一個很長的SQL腳本作爲單個事務運行從文件批量導入。SQL只嘗試抓住特定的嚴重程度

運行腳本時,我發現我得到一些信息性消息,一些警告,然後一些錯誤立即停止腳本的運行 - 但它不會回滾事務。

爲了解決這個問題,我使用了一個try-catch塊,如果有任何錯誤,它現在會成功回滾事務;不過,我的信息和警告也會觸發catch塊,並在它完成後停止我的腳本。

是否有一種方法只能跳轉到捕獲嚴重錯誤,對於警告和信息消息,我只是想測試@@錯誤並將其插入字符串,然後將這些全部輸出到用戶的最後。

回答

0

試試這個,我希望它會給你的解決方案

串cnnString = WebConfigurationManager.ConnectionStrings [ 「MyString的」]的ConnectionString。 SqlConnection cnn = new SqlConnection(cnnString); SqlTransaction事務;

cnn.Open(); 
transaction = cnn.BeginTransaction(); 

try 
{ 

    // Command Objects for the transaction 
    SqlCommand cmd1 = new SqlCommand("sproc1", cnn); 
    SqlCommand cmd2 = new SqlCommand("sproc2", cnn); 

    cmd1.CommandType = CommandType.StoredProcedure; 
    cmd2.CommandType = CommandType.StoredProcedure; 

    cmd1.Parameters.Add(new SqlParameter("@Param1", SqlDbType.NVarChar, 50)); 
    cmd1.Parameters["@Param1"].Value = paramValue1; 

    cmd1.Parameters.Add(new SqlParameter("@Param2", SqlDbType.NVarChar, 50)); 
    cmd1.Parameters["@Param2"].Value = paramValue2; 

    cmd2.Parameters.Add(new SqlParameter("@Param3", SqlDbType.NVarChar, 50)); 
    cmd2.Parameters["@Param3"].Value = paramValue3; 

    cmd2.Parameters.Add(new SqlParameter("@Param4", SqlDbType.NVarChar, 50)); 
    cmd2.Parameters["@Param4"].Value = paramValue4; 

cmd2.Parameters.Add(「@ out」,OleDbType.NVarCha); myCommand.Parameters [「@ out」]。Direction = ParameterDirection.Output;

cmd1.ExecuteNonQuery(); 
    cmd2.ExecuteNonQuery(); 

    transaction.Commit(); 
} 

catch (SqlException sqlExc) 
     { 
      foreach (SqlError error in sqlExc.Errors) 
      { 
      string errors = string.Format("{0}: ", error.Message); 
       cmd2.Parameters["@out"].Value) = errors; 

transaction.Rollback();

  } 
     } 

finally 
{ 
    cnn.Close(); 
    cnn.Dispose(); 
}