【问题标题】:C# Test Database connectionC# 测试数据库连接
【发布时间】:2014-04-19 19:04:11
【问题描述】:

使用 C# 和 Oracle.ManagedDataAccess.Client 测试数据库连接的最佳方法是什么?

我应该在每个conn.Open() 之前测试一下服务器是否可以访问,还是应该在第一次运行时进行一次测试?

我的主要问题是:如果数据库服务器离线,我在网页上得到一个异常,这不是与用户交互的最佳方式。

如果无法建立连接,如何显示错误页面?

示例数据访问层方法:

public bool IsEmailAddressExisting(string emailAddr)
{
    using (OracleConnection conn = new OracleConnection(BasicConnection.connectionStringOracle))
    using (OracleCommand command = conn.CreateCommand())
    {
        conn.Open();
        command.CommandText = "SELECT id FROM Users WHERE email=:emailAddr";
        command.Parameters.Add(":emailAddr", OracleDbType.Varchar2).Value = emailAddr;

        var result = command.ExecuteScalar();

        return (result != null);
    }
}

注意:我不想在每个方法的连接上都使用 try-catch。

我发现this 的回答非常有用。

【问题讨论】:

  • 你为什么不想使用try-catch,因为在你的捕获中你可以重定向到另一个页面或显示一条消息
  • 使用 try-catch 来管理控制流是一个糟糕的设计。
  • 如果您使用try-catch 来实际处理异常,例如当数据库关闭时,那么这些 用于control flow
  • 真的很糟糕的设计?他们是为了这个案子。
  • 会有很多 try-catch 块。

标签: c# database error-handling odp.net


【解决方案1】:

使用 C# 和 Oracle.ManagedDataAccess.Client 测试数据库连接的最佳方法是什么?

根本不测试。除非你真的需要这个。您描述的情况似乎不需要连接测试。

我应该在每次 conn.Open() 之前进行测试以查看服务器是否可访问,还是应该在第一次运行时进行一次测试?

不,这将在一个充满try-catch 块的代码中结束。您可以在某些特定情况下使用此功能,但不是一般情况下,也不是针对每种情况。

如果无法建立连接,如何显示错误页面?

最后,这才是你真正需要的。例外并不坏,它就是这样。数据库不可用你还能做什么?好吧,从应用程序的角度来看,您应该记录所有未处理的异常和错误。但是您不需要向用户报告确切的问题。您只能显示用户友好的一般错误消息。

每种网络技术都会有这个。你可以这样说:

很遗憾,此功能目前不可用。已向负责人发送了一封电子邮件。我们正在调查这个问题。请稍后再试。

【讨论】:

  • 我正在使用 C# ASP.NET MVC4,我应该在哪里处理未处理的异常?
  • 看起来有多种方法可以做到这一点,只需检查first few entries。看起来他们中的大多数都是偏好或风格。 This answer 提供了用户友好错误的示例。无论您采用哪种方法,您都不应该发现自己重复try-catch,其他任何方法(可以完成工作)都可以。
【解决方案2】:

注意:我不想在每个方法的连接上都使用 try-catch。

如果您在很多方法中都有数据库连接代码,那么那是您的问题,而不是数据库时不时地离线(尽管您也应该解决这个问题)。

无论如何,您都应该在应用程序的高级点上使用try..catch,或者使用您正在使用的网络或应用程序框架的正确错误处理,这样您就可以显示一个漂亮的“出错了”屏幕将异常转储给最终用户。

您不想在执行查询之前添加“数据库在线”检查,因为在这两个调用之间,数据库可能会离线,或者您可能有无效的输入,这会使查询无论如何都会抛出异常。

【讨论】:

  • 如果我使用的是 ODP.NET 而不是 ORM,我认为这不是真的。我使用了实体框架,它处理得很好,但现在我必须使用 ODP.NET 并在任何地方编写查询。
  • @appl3r 你认为我的回答的哪一部分不是真的?您认为 Entity Framework 在哪些方面比 ODP.NET 处理得更好?当您的查询错误或数据库也关闭时,EF 会引发异常。而且您不必也不想在任何地方编写查询,这些查询属于例如存储库模式,而不是分散在您的代码中。
  • 所以你说我应该写一个完整的层来处理各种数据库查询,插入,更新......等等,带有参数和一切。这需要的不仅仅是整个网站。
  • 你应该从一开始就这样做。您不希望数据库连接和查询代码遍布您的业务逻辑。但这不再重要了,您当前遇到的问题可以通过在靠近应用程序入口点的某个地方使用try-catch 来解决(每个表单,每个网页,每个控制器的操作方法,错误处理程序,只是您正在使用的应用程序框架的共同点)。
  • 而且查询并不分散。我使用没有实体框架的 MVC 模式。所以我有模型、视图模型、控制器、视图和数据访问层
【解决方案3】:

默认情况下,OracleConnection 是一个连接池。如果您将连接字符串属性 validateconnection 设置为 true,它将为您完成这项工作,尽管它会增加往返行程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2017-04-12
    • 2013-05-07
    • 2021-11-15
    相关资源
    最近更新 更多