2012-02-16 7 views
0

SQL Server 2008 R2のローカルインストールを使用してローカルマシン上で主に実行されるSQL Server(2008 R2)ベースの(C#WinForms)アプリケーションがあります。私が持っている問題の1つは、ユーザーがサーバーインスタンスを実行しておらず、いくつかのコマンドを実行しようとしたり、いくつかの操作を実行しようとすると、クエリがSQL Serverに送信され、要求されたインスタンスを教えてくれる年です。始まっていない。SQL ServerインスタンスがCで実行されているかどうかを効率的にテストする方法

私は以下を読んでいますquestion and associated answersしかし、これらのソリューションは理想とはかけ離れています。 WMIは非常に過剰に殺されているようで、ソフトウェアのインストールパッケージに余分な.dllファイルを含める必要がないようにしたい場合は避けてください。私もSqlDataSourceEnumeratorクラスaccrossに来ている

DataTableに利用可能な接続をダンプhere

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

を記録しました。しかし、すべての利用可能な接続を返すに固有の問題があるようです:

"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. 

は、この問題に対処するための設定方法がなければなりません。私は(これは非常に重要である)選択されたインスタンス(「localhost」の[既定のインスタンス]または「SomeInstanceName」)か否かのチェック効率的として使用することができるもの

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

:私は、次のSqlConnectionの文字列を持っていると言いますが走っています?

お時間をいただきありがとうございます。

+0

そのインスタンスへの接続を開こうとすると、インスタンスが存在しないか利用できない場合は、例外をキャプチャしてそれに応じて処理できるはずです。 – mreyeros

+0

はい、それはいくつかの状況で戻って来るためにサーバーの時間を取ることができます!乾杯。 – MoonKnight

+0

[この質問](http://stackoverflow.com/questions/9287439/some-tricky-quickway-to-validate-oracle-db-connection/9288048#9288048)への回答を見てください。 Oracleについて質問していますが、SQLサーバーにも適用されます。 –

答えて

1

接続のタイムアウトを短くすることはできますが、基本的にサーバーが存在しないことを知る唯一の方法はタイムアウトです。

1

使用している技術は、タイムアウトの問題とまったく同じです。

2

サーバとクライアントが同じマシンの場合、タイムアウトやネットワークの問題について心配する必要はありません。接続しようとすると効率的です。重要な部分は、あきらめる前に接続試行を試行できる時間(接続タイムアウト)です。明らかにそのウィンドウを短くすることはできますが、短すぎると問題が本当に意味をなさないことになります。

+0

私は間違っている可能性がありますが、タイムアウトする前にクエリが実行されるのを待っている時間も接続タイムアウトによって決まりませんか? –

+0

いいえ、それはコマンドタイムアウトです。 –

+0

OK、わかりませんでした。私は今あなたの答えをアップアップします;-) –

0

標準のSQLポートへの単純なTCP接続を開いて、それが固執するかどうか試してみることができます。 接続タイムアウトは、ご使用の環境に応じて適度に低い値に設定してください。

は、SQL serevrポート番号の

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

を参照してください。

0

「MSSQL $ InstanceName」などのインスタンス名が分かっている場合は、System.ServiceProcess.ServiceControllerクラスを使用して、マシン上のすべてのサービスの一覧を取得し、ループしてServiceName == MSSQL $ InstanceName。

これは非常に高速で、実行中かどうかを確認して実行中でない場合は起動することができます。

関連する問題