我在.NET中有一个应用程序。它更新SQL Server数据库 抛出异常。我怎么知道完全发生了什么?
例如,了解它是外键违规是没有问题的。但哪个外键是。
解释性文本(exception.Message)对我来说已经足够了,因为它拥有(半)自由文本。但是计算机不应该将自己降低到人类的喋喋不休。
特别是因为错误消息可能在SQL Server版本之间以及绝对安装的语言之间发生变化。 “......外键异常FK_Cust ......”或“......främmandenyckelundantag FK_Cust ......”
有一个数字(来自COM鼎盛时期的遗骸?)映射到某类错误但我没有找到以计算机可理解的方式失败的外键,索引或约束。
答案 0 :(得分:4)
您查看SqlException.Errors集合。集合中的每个SqlError都有一个Number。该号码将是您的完全错误。
答案 1 :(得分:0)
只需将引发的SQL异常传递给我编写的此函数,您也可以运行查询以查看SQL错误代码
select * from sys.sysmessages
public string getSQLExceptionMessage(SqlException ex)
{
string message = " Default SQL Exception. ";
switch (ex.Number)
{
case 4060:
message = "Invalid Database.Check Database Name";
break;
case 18456:
message = "Login Failed.Check Database Credentials";
break;
case 547:
message = "Foreign Key violation.Check Database Schema";
break;
case 10054:
message = "Connection To Database Refused";
break;
case 214:
message = ex.Message.ToString(); ;
break;
case 20:
message = ex.Message.ToString(); ;
break;
case 229:
message = "Permission Denied On Object. Contact DBA";
break;
case 230:
message = "Permission denied On A Column. Check permissions";
break;
case 235:
message = "Cannot Convert A Char Value To Money. The Char Value Has Incorrect Syntax.";
break;
case 236:
message = "The Conversion From Char Data Type To Money Resulted In A Money Overflow Error.";
break;
case 241:
message = "Conversion Failed When Converting Datetime From Character String.";
break;
case 262:
message = "Permission Denied In Database.";
break;
case 297:
message = "User Does Not Have Permissions To Perform This Action";
break;
case 313:
message = ex.Message.ToString();
break;
case 8144:
message = ex.Message.ToString();//"To Many Arguments Supplied For Procedure/Function ";
break;
case 8146:
message = ex.Message.ToString();//"Procedure Has No Parameters And Arguments Were Supplied ";
break;
case 10004:
message = "One Or More Invalid Arguments ";
break;
case 18452:
message = "Login Failed For User. User Not Associated With A Trusted SQL Server Connection";
break;
case 21670:
message = "Connection To Server Failed.";
break;
case 2812:
message = "Could Not Find Stored Procedure. Check Name Of Stored Procedure";
break;
case 14043:
message = ex.Message.ToString();//Null Parameter Passed To Procedure
break;
case 15003:
message = ex.Message.ToString();//Role Specific SP
break;
case 16903:
message = ex.Message.ToString();//Incorrect Number Of Parameters
break;
case 16914:
message = ex.Message.ToString();//To Many Parameters
break;
case 18751:
message = ex.Message.ToString();//Wrong Number Of Parameters
break;
case 20587:
message = ex.Message.ToString();//Invalid Value For Procedure
break;
case 20624:
message = ex.Message.ToString();//User Not In Database
break;
case 21234:
message = ex.Message.ToString();//Cannot Insert as Table Has Identity Column
break;
case 21343:
message = ex.Message.ToString();//Cannot Find Stored Procedure
break;
default:
message = ex.Message.ToString() + Environment.NewLine + "SQL ERROR CODE : " + ex.Number + Environment.NewLine + "Run Query For SysMessages To Check Error Details";
break;
}
return message;
}