Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理SQL错误代码数组_C#_Ado.net_Sqlexception - Fatal编程技术网

C# 如何处理SQL错误代码数组

C# 如何处理SQL错误代码数组,c#,ado.net,sqlexception,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

我有一个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); }
                }
            }
catch(SqlException-ex)
{
字符串sqlError=null;
对于(int i=0;i
我想将sqlexceptions记录到数据库中,这样就不会干扰到数据库的连接和日志记录。当找不到数据库,或登录名没有适当的权限等时,就会出现问题。引发异常,并尝试登录到数据库,因此当它这样做时,会调用写入数据库的函数并再次尝试访问,但再次引发相同的异常,导致写入数据库尝试失败的循环(可能是因为找不到DSN,或者用户没有适当的权限)


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

我对您的问题有点困惑,但我将尝试回答。您必须小心处理异常。如果即使在第一次引发异常时仍要尝试重新连接到数据库,则可能需要一些条件来检查引发的异常类型。通过这种方式,您知道只有在异常情况下才会尝试重新连接,而异常情况不会反复出现


您应该将日志记录放在自己的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
            }
        }
    }
}
catch(SqlException-ex)
{
字符串sqlError=null;
对于(int i=0;i
不幸的是,如果您正在写入您无权访问的同一个数据库,恐怕您无法这样做


我建议您使用类似Log4net的东西,它可以有多个appender(事件日志、数据库、文件等)。此外,log4net的操作类似于一场火灾和遗忘。即使log4net在记录错误时遇到任何问题,它也不会抛出异常。

对于这个模糊的问题,我深表歉意。我想将所有错误(包括一些sql错误)记录到数据库中。问题在于,异常是由于程序找不到dsn或没有权限造成的。代码再次执行自身,并导致尝试插入到找不到或没有适当权限的内容的循环。我需要一种实用的方法来检查,在我们尝试插入错误之前,sql错误是否不会干扰对数据库的写入(例如连接错误或用户权限不正确)听起来你最好的方法是创建一个计数器来跟踪连接尝试,如果你达到5,就中断你的循环。如果它失败了5次,那么它很可能就不起作用了。因此,只需创建一个INT并在每次连接尝试时递增它。您的示例是有意义的,但是CheckError方法中是否有一种方法可以判断sql错误是错误的连接还是错误的权限?或者一系列可能妨碍数据库访问的未知错误?显然,如果无法访问数据库,则不应尝试插入任何内容是:tl;医生:很复杂。
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
            }
        }
    }
}