我有一个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错误?
答案 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记录错误有任何问题,也不会抛出异常。