如何处理SQL错误代码数组

时间:2017-02-03 22:53:22

标签: c# ado.net sqlexception

我有一个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错误?

3 个答案:

答案 0 :(得分:0)

我对你的问题感到有些困惑,但我会尝试回答。您必须小心处理异常的方式。如果您要尝试重新连接到数据库,即使第一次引发了异常,您可能希望有一些条件来检查引发了什么类型的异常。通过这种方式,您知道如果它是一个不会反复重复的异常,则只会尝试重新连接。

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
}

答案 1 :(得分:0)

你应该把你的日志记录放在它自己的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
            }
        }
    }
}

答案 2 :(得分:0)

不幸的是,如果您要写入您无法访问的同一个数据库,我恐怕您不能这样做。

我建议您使用类似Log4net的东西,它可以有多个appender(事件日志,数据库,文件等)。此外,log4net运行起来像火和忘记。即使log4net记录错误有任何问题,也不会抛出异常。