C#测试数据库连接

C#测试数据库连接,c#,database,error-handling,odp.net,C#,Database,Error Handling,Odp.net,使用C#和Oracle.ManagedDataAccess.Client测试数据库连接的最佳方法是什么 我应该在每次conn.Open()之前进行测试,以查看服务器是否可访问,还是在第一次运行时进行一次测试 我的主要问题是:如果数据库服务器脱机,我会在网页上出现异常,这不是与用户交互的最佳方式 如果无法建立连接,如何显示错误页面 数据访问层方法示例: public bool IsEmailAddressExisting(string emailAddr) { using (OracleC

使用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放在每个方法的连接上

我发现这个答案非常有用。

注意:我不想把try-catch放在每个方法的连接上

如果您在许多方法中都有数据库连接代码,那么这就是您的问题,而不是数据库时不时脱机(尽管您也应该得到修复)

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

您不希望在执行查询之前添加“database online”(数据库联机)检查,因为在这两个调用之间,数据库可能会脱机,或者您可能有无效输入,这使得查询无论如何都会引发异常

注意:我不想把try-catch放在每个方法的连接上

如果您在许多方法中都有数据库连接代码,那么这就是您的问题,而不是数据库时不时脱机(尽管您也应该得到修复)

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

您不希望在执行查询之前添加“database online”(数据库联机)检查,因为在这两个调用之间,数据库可能会脱机,或者您可能有无效输入,这使得查询无论如何都会引发异常

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

为什么不使用
try-catch
,因为在catch中,您可以重定向到另一个页面或显示消息使用try-catch来管理控制流是一个糟糕的设计。如果您使用
try-catch
来实际处理异常,例如当数据库关闭时,那么这些都不是用来做什么的。真的是糟糕的设计吗?它们就是针对这种情况的。会有很多try-catch块。为什么不使用
try-catch
,因为在catch中,您可以重定向到另一个页面或显示消息使用try-catch来管理控制流是一种糟糕的设计。如果您使用
try-catch
来实际处理异常,比如当数据库关闭时,它们就不被使用了。真的是糟糕的设计吗?他们就是为了这个案例而来的。会有很多人尝试catch block。如果我使用的是ODP.NET而不是ORM,我认为这不是真的。我使用了实体框架,它处理得很好,但现在我必须使用ODP.NET并在任何地方编写查询。@appl3r what p