2017-06-19 29 views
1

フロントエンドが接続する複数のSQLサーバーがあります。一度にどのサーバーがオフラインであるかを確認するテストが必要です。SQL ServerへのVBAテスト接続

以下のコードは、オンラインSQLサーバーでは問題なく動作しますが、オフラインのテストでは30秒以上タイムアウトします。これは定期的に

Function ConTEST() 

Dim conn As ADODB.Connection 
Set conn = New ADODB.Connection 
Dim strConnect As String 

strConnect = "DRIVER={SQL Server};SERVER=SERVER;UID=UID;PWD=PWD;APP=Microsoft® Windows® Operating System;DATABASE=DB_NAME" 

With conn 
.ConnectionString = strConnect 
.CommandTimeout = 5 
.ConnectionTimeout = 5 
.Open 
End With 

End Function 

いただければ幸いです。このタイムアウトの問題を解決する方法上の任意の提案を実行されるチェックがあるとして、これは非常に迅速にタイムアウトする必要があります。

+0

これらのチェックを定期的に行うためにスレッドを生成することは理にかなっていませんか?そうすれば、30秒のタイムアウトは必ずしも悪いことではありません。 – Fletchius

+0

タイムアウトの前に接続がないと、エラーが発生すると思います。おそらく、conn.Stateをチェックする単純なエラーハンドラがそれを行うかもしれません。より詳細なアプローチ:https://support.microsoft.com/en-us/help/167957/info-extracting-error-information-from-ado-in-vb – wazz

+0

応答をありがとう - 私は以前にこのエラーを実験したハンドラ - 残念ながら、エラーが出るまでにはサーバーあたり約30秒かかりますが、時間がかかりすぎます。理想的には、このエラーをスピードアップする方法はありますか? – TGChris

答えて

0

オフラインになっているサーバー上のデータベースの場合は、接続の「マスター」データベースに接続し、「DATABASEPROPERTYEX」関数を実行して確認するデータベースのステータスを取得します。

Dim rs As New ADODB.Recordset 

With conn 
.ConnectionString = strConnect 
.CommandTimeout = 5 
.ConnectionTimeout = 5 
.Open 
Set rs = .Execute("select DATABASEPROPERTYEX('yourdb', 'Status') as db_status") 
Debug.Print rs(0).Value 
.Close 
End With 

サーバー全体がオフラインになっている場合は、コマンドラインからサーバーにpingを実行することができます。

+0

応答のためにありがとう - それはサーバー全体がオフラインになる可能性があります - このサーバーは、同じIPアドレスを持つように見える他のマシンとネットワーク上にありますので、その個々のマシンにpingを行う方法についての提案はありますか? – TGChris

+0

あなたは私が提案したものを試しましたか? pingは、コマンドプロンプトから基本的なping utilitlyを使用しています。私は彼らがマシン全体をオフラインにしているとは思わない。 google for pingを使用すると、多くのメッセージが表示されます。 –

+0

私はpingの方法を試しました。ローカルサーバーのアドレスを使用すると問題なく動作しましたが、グローバルIPアドレスを使用すると応答はありませんでした。私のルーターがpingをブロックしているかどうかは分かりません。私はSQLサーバーのために開かれていたポート番号でグローバルIPアドレスをpingしようとしましたが、どちらも動作しませんでした... – TGChris