【问题标题】:How to handle an array of SQL Error codes如何处理一系列 SQL 错误代码
【发布时间】:2017-02-03 22:53:21
【问题描述】:

我有一个 try\catch 块,用于处理打开连接并将数据插入数据库。

catch (SqlException ex)
            {
                string sqlError = null;
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    sqlError += "Error Message " + ex.Errors[i].Message + "\n" + "Stored Procedure " +  ex.Errors[i].Procedure + " \n " + "Line Number " + ex.Errors[i].LineNumber;
                }
                LogTools.WriteLog("Sql Server error " + sqlError);
                Variables.InstallStatusDetail = "Database connection failed";

                if (!sqlError.Contains("connection to SQL Server"))
                {
                    if (Variables.WriteToDatabase) 
                    { HostedDataBase.InsertRunStatusIntoInstallStatus('E', sqlError, null); }
                }
            }

我想将不会干扰连接和记录到数据库的 sqlexceptions 记录到数据库中。当找不到数据库,或者登录没有适当的权限等时会出现问题。引发异常,并尝试登录到数据库,所以当它这样做时,它会调用写入到数据库的函数数据库并尝试再次访问,但再次引发相同的异常,导致尝试写入数据库失败的循环(因为找不到 DSN,或者用户没有适当的权限)。

如何处理会阻止我访问和写入数据库的 sql 错误,同时仍然能够编写不会导致此循环的 sql 错误?

【问题讨论】:

    标签: c# ado.net sqlexception


    【解决方案1】:

    我对你的问题有点困惑,但我会尝试回答。您必须小心处理异常的方式。如果您要尝试重新连接到数据库,即使第一次引发了异常,您可能希望有一些条件来检查引发了哪种异常。这样,您就知道只有当它是一个不会一遍又一遍地重复的异常时才尝试重新连接。

    IE。

        catch (SqlException ex)
                    {
                           Error = ex.ToString()
                           WriteToLog(Error);
                           CheckError();
    
                    }
    
        Void CheckError()
        {
        //conditions based on error output.
        }
    
    void WriteToLog(string Error)
    {
    // write your error output to log
    }
    

    【讨论】:

    • 抱歉这个含糊的问题。我想将所有错误(包括一些 sql 错误)记录到数据库中。问题是当异常是由于程序找不到 dsn,或者它没有权限。代码会再次自行执行,并导致尝试插入无法找到或没有适当权限的内容的循环。我想要一种实用的方法来检查,在我们尝试插入错误之前,sql 错误是否不会干扰写入数据库(如连接错误或权限不正确的用户)。
    • 听起来你最好的方法是创建某种计数器来跟踪连接尝试,并在你达到 5 时打破你的循环。如果它失败了 5 次,它很可能无法正常工作。所以只需创建一个 INT 并在每次连接尝试时递增它。
    • 你的例子有道理,但是CheckError方法中有没有办法判断sql错误是连接错误还是权限错误?或者可能阻碍数据库访问的未知错误的完整列表?显然,如果无法访问数据库,则不应尝试插入任何内容
    • 是的,有:stackoverflow.com/questions/24041062/… tl;dr:它很复杂。
    【解决方案2】:

    您应该将您的日志记录放在它自己的 try..catch 块中,如下所示:

    catch (SqlException ex)
    {
        string sqlError = null;
        for (int i = 0; i < ex.Errors.Count; i++)
        {
            sqlError += "Error Message " + ex.Errors[i].Message + "\n" + "Stored Procedure " +  ex.Errors[i].Procedure + " \n " + "Line Number " + ex.Errors[i].LineNumber;
        }
        LogTools.WriteLog("Sql Server error " + sqlError);
        Variables.InstallStatusDetail = "Database connection failed";
    
        if (!sqlError.Contains("connection to SQL Server"))
        {
            if (Variables.WriteToDatabase) 
            { 
                try {
                    //I am assuming this is where you are trying to write the error back into the database
                    HostedDataBase.InsertRunStatusIntoInstallStatus('E', sqlError, null); 
                } catch {
                    //ignore errors here
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      不幸的是,如果您正在写入您无权访问的同一个数据库,恐怕您无法做到这一点。

      我建议你使用像 Log4net 这样可以有多个附加程序(事件日志、数据库、文件等)的东西。此外,log4net 的运行方式类似于火灾和忘记。即使 log4net 在记录错误时有任何问题,它也不会抛出异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多