C# 如何处理SQL错误代码数组
我有一个try\catch块,用于打开连接并将数据插入数据库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
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
}
}
}
}