如何有效地测试SQL Server实例是否在C#中运行

本文关键字:是否 运行 实例 Server 有效地 测试 SQL | 更新日期: 2023-09-27 18:24:55

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

我已经阅读了以下问题和相关答案,但这些解决方案远非理想。WMI似乎太过分了,如果可以避免的话,我不想在我的软件安装包中包含额外的.dlls。

我还遇到了这里记录的SqlDataSourceEnumerator

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

其将可用连接转储到CCD_ 3中。然而,返回所有可用连接似乎存在固有问题:

"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")是否正在运行?

谢谢你抽出时间。

如何有效地测试SQL Server实例是否在C#中运行

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

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

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

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

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

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

参见

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

用于sql-serevr端口号。