【问题标题】:Detect a DB Connection error using Linq?使用 Linq 检测数据库连接错误?
【发布时间】:2009-06-05 21:45:08
【问题描述】:

是否可以在使用 Linq 获得应用程序“传输级错误”之前检测到连接错误?

假设我有一个名为 SQLServer1 的 SQL 服务器,我正在运行一个应用程序,该应用程序使用 LinQ 连接到该服务器以获取一些信息。

我决定将服务器名称更改为 SQLServer2。 下次我的应用程序运行时,我会收到如下错误:

从服务器接收结果时发生传输级错误。(提供者:TCP Provider,错误:0 - 指定的网络名称不再可用。)

因为 LinQ 不知道发生了变化!

如何在运行时捕捉到这个? 是否可以扩展 DataContext 类以在获取数据之前以某种方式检查连接?

谢谢!

【问题讨论】:

  • 我认为这是 LinqToSQL 而不是 Linq。

标签: linq connection datacontext connection-pooling


【解决方案1】:

这是我扩展课程的方式。我使用单例模式来调用数据上下文,这导致每个页面请求都会实例化一个数据上下文对象,而不管调用单例的次数如何。在每个请求第一次调用单例时,我运行 DataContext.DatabaseExists(),如果它为 false,我会优雅地处理错误。现在,每当我的任何代码尝试对数据上下文执行任何操作时,它都会向我的用户提示“抱歉,数据库已关闭”消息。

ASP.NET C# 代码:

namespace dal
{
    public partial class DataModelDataContext
    {
        public static DataModelDataContext DataContext
        {
              get
              {
                  if (System.Web.HttpContext.Current.Items["ModelDataContext"] == null)
                  {
                      DataModelDataContext datacontext = new DataModelDataContext();
                      //Once per page request, of the datacontext is requested, check to see if the database connection is valid.
                      if (!datacontext.DatabaseExists())
                      {
                           System.Web.HttpContext.Current.Response.Redirect("DatabaseIsDown.html");
                      }
                      System.Web.HttpContext.Current.Items["ModelDataContext"] = datacontext;

                  }
                  return (DataModelDataContext)System.Web.HttpContext.Current.Items["ModelDataContext"];
              }
        }
    }
}

【讨论】:

    【解决方案2】:
    try
    {
       // run linq query here
    }
    catch (Exception e)
    {
       // take appropriate action to handle the error like updating the connection string, etc.
    }
    

    【讨论】:

    • 感谢您的回答。但更准确地说,我正在寻找一种通过扩展 DataContext 类来进行此验证的方法。如何才能做到这一点?我有什么办法可以操纵连接池并发现我的连接不正常?再次感谢。
    • 您也许可以使用 DbConnection 属性。如果您只想快速检查,您可以关闭并重新打开 try-catch 块内的 DbConnection,然后如果出现错误,您可以将 DbConnection 上的连接字符串设置为新值并尝试打开它再次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多