【发布时间】: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