C# 如何处理数据库异常/问题?

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分钟的睡眠时间,若有任何问题,那个么我

在我的一个c#应用程序中,我编写了如下sql连接代码

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
          }
      }  
      

这实际上取决于您希望应用程序如何运行

如果您的数据库访问与UI在同一线程上处理,那么当您尝试连接到数据库时,它将变得无响应

连接超时的默认时间段已经相当长了,因此在for循环中运行它3次会使这一时间段增加三倍,并让用户感到沮丧

在我看来,除非您特别试图向用户隐藏连接问题,否则最好报告连接尝试失败并询问用户是否希望重试。然后计算在通知用户无法继续或将应用程序置于“停止服务”状态之前允许重新连接尝试的次数

我想处理sqlserver的未知问题,如数据库关闭、超时。

尝试使用语句来捕获与连接相关的问题来包围连接操作

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次。为什么数据库总是关闭?这种情况是否频繁发生,足以保证额外的工作以确保重试逻辑正常工作?如果不重试,这是一个主要问题吗?可能是网络问题,这种情况并不经常发生,我们是否可以在一定程度上增加超时,以确保数据库现在已启动。