如何从SQL Server中找出_exact_错误

时间:2011-03-23 20:57:29

标签: .net sql-server exception

我在.NET中有一个应用程序。它更新SQL Server数据库 抛出异常。我怎么知道完全发生了什么?

例如,了解它是外键违规是没有问题的。但哪个外键是。


解释性文本(exception.Message)对我来说已经足够了,因为它拥有(半)自由文本。但是计算机不应该将自己降低到人类的喋喋不休。

特别是因为错误消息可能在SQL Server版本之间以及绝对安装的语言之间发生变化。 “......外键异常FK_Cust ......”或“......främmandenyckelundantag FK_Cust ......”

有一个数字(来自COM鼎盛时期的遗骸?)映射到某类错误但我没有找到以计算机可理解的方式失败的外键,索引或约束。

2 个答案:

答案 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;
    }