C# 如何处理数据库异常/问题?
在我的一个c#应用程序中,我编写了如下sql连接代码C# 如何处理数据库异常/问题?,c#,.net,sql-server,C#,.net,Sql Server,在我的一个c#应用程序中,我编写了如下sql连接代码 try { myConnection = new SqlConnection(m_resourceDB.GetResourceString(nSiteID, ApplicationID.XClaim,(short)nResID ) ); myConnection.open(); } 我想处理sqlserver的未知问题,比如数据库关闭、超时 为此,我想引入For循环3次,循环之间有3分钟的睡眠时间,若有任何问题,那个么我
try
{
myConnection = new SqlConnection(m_resourceDB.GetResourceString(nSiteID, ApplicationID.XClaim,(short)nResID ) );
myConnection.open();
}
我想处理sqlserver的未知问题,比如数据库关闭、超时
为此,我想引入For循环3次,循环之间有3分钟的睡眠时间,若有任何问题,那个么我将退出循环
我不知道我的想法对不对?我想要一些关于这方面的专家建议?有什么例子吗?我想简单地说:与连接等通信的代码不应该进行睡眠/重试,除非该代码已经是异步的。如果顶级调用代码希望捕获异常并设置计时器(而不是睡眠)并重试,则可以-但您希望避免的是以下情况:
var data = dal.GetInfo();
突然花了3分钟。如果它是一个异步/回调,可能会侥幸逃脱,并且清楚地宣传了该方法可能需要几分钟才能执行。但即使这样,也感觉像是在拉伸。如果你对应用程序逻辑感兴趣,为什么不在第一时间捕获异常,告诉用户,让用户在将来某个时候再次单击按钮?如果你运行的是一个没有用户界面的服务,那么无论如何,继续循环,直到事情开始工作,但至少要在您执行操作时将错误记录到事件日志中,以便服务器管理员能够找出出现错误的时间和原因 对于客户端应用程序,我不建议您让用户等待9分钟,然后再告诉他们事情不正常。尝试连接,评估错误情况,并让用户知道哪里出了问题,以便他们可以进一步采取行动 如果您使用的是SqlException类,则可以检查Exception类并根据该类判断出问题,例如:
switch (sqlEx.Class)
{
case 20:
//server not found
case 11:
//database not found
所有类上都有SQL Server消息,这是测试不同条件的问题。您可以捕获SqlException
- SqlException.Class
- 获取从SQL Server的.NET Framework数据提供程序返回的错误的严重级别
- SqlException.Errors
- 获取一个或多个SqlError对象的集合,这些对象提供有关.NET Framework数据提供程序为SQL Server生成的异常的详细信息
SqlCommand cmd = new SqlCommand(); cmd.Connection = new SqlConnection("CONNECTION_STRING"); cmd.CommandText = "SELECT * FROM ...."; // cmd.CommandType = System.Data.CommandType.Text; try { cmd.Connection.Open(); try { SqlDataReader reader = cmd.ExecuteReader(); // .... } finally { cmd.Connection.Close(); } } catch (SqlException ex) { // ex.Class contains the ErrorCode, depends on your dataprovider foreach (SqlError error in ex.Errors) { // error.LineNumber // error.Message } }
- 获取一个或多个SqlError对象的集合,这些对象提供有关.NET Framework数据提供程序为SQL Server生成的异常的详细信息
using( sqlcon = new SqlConnection(constr))
{}
使用Try/Catch语句捕获异常:
try
{
con.Open();
try
{
//Execute Queries
// ....
}
catch
{
// command related or other exception
}
finally
{
con.Close();
}
}
catch
{
// connection error
}
要防止此类异常,请检查以下各项:
您可以在SqlCommand上将CommandTimeout设置为某个值:
objCmd.CommandTimeout = 600
最好的方法是将其放入try-catch语句中,并以更好的格式显示错误,如果失败1次,尝试继续3次将不会改变任何内容,直到您再次dc并发送请求,在单独的单独打包中作为新请求 试试这个
try
{
Executing code.
}
catch (Exception err)
{
Display["ErrorMsg"] = err.Message.ToString() + "|" + err.GetBaseException() + "|" + Request.Url.ToString();
}
祝你好运。所以。。。在循环、睡眠等方面,你尝试了什么,在哪里卡住了?注意:应该使用
using
进行连接。感谢您指出“using”,我将更改它。接下来,我想确认使用sleep循环是否是一种正确的方法,或者是否有其他处理此类问题的最佳方法。在我的案例中,这是后台任务。处理文件夹中的一些文件。在处理文件的过程中,它准备c#对象,然后调用数据库来存储soem数据。若此时数据库关闭,它将文件存储在另一个目录中以供重试。但在这个要求中,我想在存储到另一个文件夹之前重新检查数据库3次。为什么数据库总是关闭?这种情况是否频繁发生,足以保证额外的工作以确保重试逻辑正常工作?如果不重试,这是一个主要问题吗?可能是网络问题,这种情况并不经常发生,我们是否可以在一定程度上增加超时,以确保数据库现在已启动。