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

本文关键字:数据库 异常 问题 处理 何处理 | 更新日期: 2023-09-27 18:16:16

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

try 
{ 
   myConnection = new SqlConnection(m_resourceDB.GetResourceString(nSiteID,  ApplicationID.XClaim,(short)nResID ) ); 
   myConnection.open();
}

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

对于这个,我想引入3次For循环,循环之间有3分钟的睡眠,如果有问题,我将退出循环

我不知道我的想法是对还是错?我需要专家的建议吗?例子吗?

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

我会简单地说:与连接等对话的代码不应该正在进行睡眠/重试,除非该代码已经是异步的。如果顶层的调用代码想要捕获一个异常并设置一个计时器(不是睡眠)并重试,那么很好-但是您要避免的是这样的事情:

var data = dal.GetInfo();

突然花了3分钟。如果是一个异步/回调,那么可能会对进行处理,并且明确地通知该方法可能需要几分钟才能执行。但即使这样,感觉也有点牵强。如果您关注应用程序逻辑,为什么不第一次捕获异常,告诉用户,并让用户在将来的某个时候再次单击该按钮呢?

如果你正在运行一个没有用户界面的服务,那么无论如何,保持循环直到事情开始工作,但至少记录错误到EventLog,当你在它,这样服务器管理员可以弄清楚什么时候和为什么会出错。

对于客户端应用程序,我不建议你让用户等待9分钟才告诉他们事情没有正常工作。尝试连接,评估错误条件,并让用户知道哪里出了问题,以便他们可以采取进一步措施。

如果你正在使用SqlException类,你可以检查异常类,并决定基于什么是错误的,例如:

switch (sqlEx.Class)
            {
                case 20:
                    //server not found
                case 11:
                    //database not found

所有的类都有SQL Server消息,这是一个测试不同条件的问题。

这取决于你希望你的应用程序如何表现。

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

连接超时的默认时间已经很长了,所以在for循环中运行3次会使这个时间增加三倍,这会让你的用户感到沮丧。

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

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

尝试用using语句包围连接操作,以捕获与连接相关的问题。

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
        }

要防止这种类型的异常,请检查以下内容:

处理超时SqlExceptions

您可以将CommandTimeout设置为SqlCommand上的某个值:

objCmd.CommandTimeout = 600

可以捕获SqlException。

  • SqlException.Class

    • 获取从SQL Server的。net Framework数据提供程序返回的错误的严重级别。
  • SqlException异常。错误

    • 获取一个或多个SqlError对象的集合,这些对象提供有关. net框架数据提供程序为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
          }
      }  
      

最好的方法是把它放在try catch语句中,并以更好的格式显示错误,如果它失败了1次,尝试继续3次将不会改变任何东西,除非你再次发送请求,在一个单独的单独包装作为一个新的请求。

use try this.

try
{
       Executing code.
}
        catch (Exception err)
        {
            Display["ErrorMsg"] = err.Message.ToString() + "|" + err.GetBaseException() + "|" + Request.Url.ToString();
        }

好运。