2012-06-25 19 views
4

從數據庫中刪除一條記錄時,偶爾我會碰到參考約束異常。有沒有辦法在C#中測試特定的SQL異常類型?

這裏是例外的細節。當異常特別與外鍵約束錯誤有關時,是否可以向用戶顯示消息?

我可以看看異常錯誤字符串並測試一個單詞的存在,但我不確定是否有更好的方法來檢查特定的SQL錯誤。

感謝 凱文

Message: The DELETE statement conflicted with the REFERENCE constraint "FK_Customers_PaymentTerms". The conflict occurred in database "kd", table "dbo.Customers", column 'CstPtmID'. 
The statement has been terminated. 
Source: .Net SqlClient Data Provider 
TargetSite: Void OnError(System.Data.SqlClient.SqlException, Boolean) 
StackTrace: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
    at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues) 
    at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) 

回答

14

是否有可能顯示一條消息給用戶時,異常 具體涉及到一個外鍵約束的錯誤?

是的,你可以檢查SQLEXCEPTION的Number

try 
{ 
    // do your database query 
} 
catch (SqlException ex) 
{ 
    if (ex.Number == .....) 
    { 
     // Can't remember from the top of my head the exact error code 
     // that is triggered in this situation. Just check it. 
    } 
} 

正如在評論部分解釋,最好是檢查Errors陣列,因爲有可能會涉及到多個錯誤一個SQL查詢。

+4

您需要檢查整個['Errors'](http://msdn.microsoft .com/en-us/library/system.data.sqlclient.sqlexception.errors.aspx)數組,因爲單個批處理(SQL請求)可能返回多個錯誤。 –

+0

@RemusRusanu,謝謝你指出這一點。我已經更新了我的答案以包含這些有價值的信息。 –

+1

以下是錯誤代碼列表http://msdn.microsoft.com/en-us/library/cc645603(SQL.105).aspx –

1

已根據SQLEXCEPTION

catch(SqlException se) 
{ 
    if(se.Number == x) 
    { 
     //Show message 
    } 
} 
1

使用Errors收集顯示錯誤一看:

public static void ShowSqlException(string connectionString) 
{ 
    string queryString = "EXECUTE NonExistantStoredProcedure"; 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     SqlCommand command = new SqlCommand(queryString, connection); 
     try 
     { 
      command.Connection.Open(); 
      command.ExecuteNonQuery(); 
     } 
     catch (SqlException ex) 
     { 
      DisplaySqlErrors(ex); 
     } 
    } 
} 

private static void DisplaySqlErrors(SqlException exception) 
{ 
    for (int i = 0; i < exception.Errors.Count; i++) 
    { 
     Console.WriteLine("Index #" + i + "\n" + 
      "Error: " + exception.Errors[i].ToString() + "\n") + 
      "Number: " + exception.Errors[i].Number.ToString() + "\n"); 
    } 
    Console.ReadLine(); 
} 
相關問題