【问题标题】:How to Efficently Test Whether an SQL Server Instance is Running in C#如何在 C# 中高效测试 SQL Server 实例是否正在运行
【发布时间】:2012-02-16 14:20:33
【问题描述】:

我有一个基于 SQL Server (2008 R2) 的 (C# WinForms) 应用程序,该应用程序主要在使用本地安装的 SQL Server 2008 R2 的本地计算机上运行。我遇到的一个问题是,如果用户没有运行服务器实例并尝试执行某些命令或执行某些操作,则查询将发送到 SQL Server,并且需要很长时间才能抛出 SqlException 告诉我请求实例未启动。

我已阅读以下question and associated answers,但这些解决方案远非理想。 WMI 似乎太过分了,如果可以避免的话,我不想在我的软件安装包中包含额外的 .dll。

我也遇到了 SqlDataSourceEnumerator 类记录 here

// Retrieve the enumerator instance and then the data.
SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = instance.GetDataSources();

将可用连接转储到DataTable。但是,返回所有可用连接似乎存在固有问题:

"All of the available servers may or may not be listed. The list can vary depending on 
 factors such as timeouts and network traffic. This can cause the list to be different 
 on two consecutive calls." - MSDN.

必须有一套方法来处理这个问题。假设我有以下SqlConnection 字符串:

Data Source=localhost;Initial Catalog=MyDB;Integrated Security=True;Connection Timeout = 0

我可以使用什么作为高效(这很重要)检查所选实例('localhost' [默认实例] 或'SomeInstanceName')是否正在运行?

感谢您的宝贵时间。

【问题讨论】:

  • 如果您只是尝试打开与该实例的连接但它不存在或不可用,您应该能够捕获异常并进行相应处理。
  • 是的,但在某些情况下可能需要好几倍的时间才能回来!干杯。
  • 看看this question 的答案。它询问的是 Oracle,但也适用于 SQL 服务器。
  • 当然,如果服务器没有运行,可能需要几分钟才能恢复。您无法进行更有效的连接尝试,但可以缩短连接超时时间(例如 5 秒)。
  • 我认为您在下面回答了“我可能是错的,但连接超时是否也不能确定它在超时之前等待查询运行多长时间?”用“不,那是命令超时”?我正要写:如果Connection Timeout 设置为零,则抛出SqlException 告诉我没有正在运行的实例所需的时间大约是几分钟。对于十秒的超时,大约是十秒。这里一定有某种关联?

标签: c# winforms sql-server-2008 connection


【解决方案1】:

当服务器和客户端是同一台机器时,我认为您无需担心超时或网络问题。仅尝试连接就可以提高效率,关键部分是在放弃之前让连接尝试尝试多长时间(连接超时)。你可以明显地缩短那个窗口,但是如果你把它弄得太短,那么问题就没有意义了。

【讨论】:

  • 我可能是错的,但连接超时是否也不能确定它在超时之前等待查询运行多长时间?
【解决方案2】:

您可以将连接超时更改为更短的时间,但本质上,它知道服务器不存在的唯一方法是超时。

【讨论】:

    【解决方案3】:

    您使用的任何技术都可能存在完全相同的超时问题。

    【讨论】:

      【解决方案4】:

      如果您知道实例名称,例如“MSSQL$InstanceName”,您可以使用 System.ServiceProcess.ServiceController 类获取机器上所有服务的列表,然后循环查看是否有任何 ServiceName == MSSQL $InstanceName。

      我发现这非常快,而且您可以检查它是否正在运行,如果没有运行则启动它。

      【讨论】:

        【解决方案5】:

        您可以尝试打开一个到标准 SQL 端口的简单 TCP 连接,看看它是否可以连接。 根据您的环境将连接超时设置为某个合理的低值。

        http://support.microsoft.com/kb/287932

        用于 sql serevr 端口号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-06
          • 2016-04-25
          • 1970-01-01
          • 1970-01-01
          • 2012-07-22
          • 2010-09-26
          • 1970-01-01
          相关资源
          最近更新 更多