有没有办法在C#中测试特定的sql异常类型?

Kev*_*vin 4 c# sql-server asp.net

从数据库中删除记录时,偶尔会遇到引用约束异常.

以下是例外细节.当异常与外键约束错误特别相关时,是否可以向用户显示消息?

我可以查看异常错误字符串并测试是否存在单词,但我不确定是否有更好的方法来检查特定的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)
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 14

当异常与外键约束错误特别相关时,是否可以向用户显示消息?

是的,您可以检查NumberSqlException:

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

如注释部分所述,最好检查Errors数组,因为可能存在与单个SQL查询相关的多个错误.

  • 你需要检查整个[`Errors`](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlexception.errors.aspx)数组,因为一个批处理(SQL请求)可以返回多个错误. (4认同)