2012-02-29 19 views
0

特定のデータベースサーバーが接続されているかどうかをテストする方法はありますか? ping操作のように。SQL Db接続のテスト

私は別の方法として、SQL接続をテストする方法を知っています。そのアプローチを使用しない理由は、私のアプリは連続してt秒ごとに接続をテストすることです。

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

しかし、DBが起動している場合、これはあなたを教えてくれません:あなたは、サーバーにpingを実行することができます

答えて

0

感謝。接続を開く(おそらく認証などはあなたの唯一の方法です)。なぜあなたはこのように継続してポーリングをしていますか?

+0

私は、データベースが理由です利用できない場合、アプリケーションで実行されるアクションを防ぎたいです。したがって、dbが接続されていない場合、アプリケーションはロックされます。 –

+0

データベースがダウンしている場合には、このサーバに定期的にpingを実行してチェックするのではなく、データベースを停止したときにエラー処理を行うだけではどうですか(これはあまりありません。 – Paddy

1

私がこれをやっている理由はわかりませんが、あなたはめったに答えを受け入れることはできないと考えていますが、ここには入ります。あなたの質問は、多くの問題を引き起こします。だから、私に接続& ....私と

を負担接続は、たくさんのことを意味することができます。はるかに低いレイヤーで@Paddyが指摘するように、PINGはあなたが到達可能なネットワークにOSが接続されているかどうかを教えてくれます。しかし、コンピュータを接続して、SQLを停止したり、オフラインにしたり、誤動作させたりすることができます。 SQLはオンラインでも構いませんが、ファイアウォールは要求元のコンピュータからのアクセスをブロックします。要求しているコンピュータにはアクセス許可がない可能性があります。リストは続く。

SQL Serverへの接続を開く機能がは、接続をテストするための方法であって、ここで

私のポイントは、ということです。

私の場合は、非同期スレッドに小さなADOテストを入れます。テストでは、短いタイムアウトを使用して接続を開こうとします。

症状を解決しますか?

SQL Serverは、高可用性製品として実際に設計され、一般的には考えられています。意味は、あなたのSQLアクセスが(それが一般的なエラーハンドラを超えて)それをテストしたいと思っているので、私はavilabilityの問題を解決することをお勧めします。多くの不運と組み合わされた最も基本的なインストールでさえ、95%以上のアップタイムを許容するはずです。私はこの時点で、あなたを思いとどまらせていない場合は

をテストするために、SQL SMOを使用し

、代替があります。 SQL SMO(SQL DMOの代わり)は、SQLサーバー管理へのプログラムによるアクセスを可能にする一連のオブジェクトです。

  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer.Smo.dll
  • Microsoft.SqlServer.Management.Sdk.Sfc:

    次のコードは、いくつかのオブジェクトへの参照が必要になります。dllが

  • Microsoft.SqlServer.SqlEnum.dll
  • Microsoft.SqlServer.SQLWmiManagmenet.dll
  • Microsoft.SqlServer.WmiEnum.dll

あなたが見て、このgetting started記事を使用することができますどのようにセットアッププロジェクトをします。 SQL Serverに接続するには、WINDOWS権限(SQL認証とは対照的)が必要です。

は今のコードに:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Common; 
using Microsoft.SqlServer.Management.Smo.Wmi; 

namespace SQL_SMO_Test { 
class Program { 

    public const string SQL_SERVICE_BASENAME = "MSSQL"; 

    public static bool SQLServiceIsRunning (string SQLServerName) { 
     string[]   nameComponents; 
     string    ComputerName;  
     string    InstanceName;  
     string    ServiceName;   
     ManagedComputer mc; 
     ServiceCollection serviceList; 

     //split up SQL Name 
     nameComponents = SQLServerName.Split('\\'); 
     ComputerName = nameComponents[0]; 
     InstanceName = nameComponents.Length > 1 ? nameComponents[1] : ""; 
     ServiceName = SQL_SERVICE_BASENAME + 
          ((InstanceName.Length>0) ? "$" + InstanceName : ""); 

     //get WMI Computer object 
     mc   = new ManagedComputer(ComputerName); 
     serviceList = mc.Services; 


     //find any SQL Services & See if it's our instance 
     foreach (Service s in serviceList) { 
      if (s.Type.Equals(ManagedServiceType.SqlServer)) { 
      Console.WriteLine("Service Found --" + s.Name); 
      if ((!ServiceName.Contains('$')) || s.Name == ServiceName) { 
       Console.WriteLine("..Correct Instance found" + s.Name); 
       if (s.ServiceState.Equals(ServiceState.Running)){ 
        Console.WriteLine("....Service is Running"); 
        return true; 
       } 
      } 
      } 
     } //end foreach() 

     Console.WriteLine("service not found, or stopped"); 
     return false; //service not found, or stopped 

    } //end SQLServiceIsRunning 

         /* format: servername\instanceIfAny */ 
    public static bool SQLIsRunning(string SQLServerName) { 
     Server srv; 

     Console.WriteLine("SERVICE RUNNING (" + SQLServerName + ") ?"); 
     Console.WriteLine("------------------------------"); 

     if (! SQLServiceIsRunning(SQLServerName)) { 
     return false; 
     } 
     Console.WriteLine("------------------------------"); 

     srv = new Server(SQLServerName); 
     try { 
      Console.WriteLine("Status: " + srv.Status.ToString()); 
      return true; 
     } catch (Exception ex) { 
      Console.WriteLine("Exception: " + ex.ToString()); 
     } 

     return false; 

    } //end SQLIsRunning() 


    static void Main(string[] args) { 
     bool result = SQLIsRunning("MST-SQL01.mst.com"); 

     Console.WriteLine("-----------"); 
     Console.WriteLine("Press any key to close..."); 
     Console.ReadKey(); 


    } //end main() 
    } 
} 
+0

それは役に立ちそうですが、重い操作ではありませんか?申し訳ありませんが、私はSMOについてもう考えていません。だからもっと言えない。 –

+0

"重くないですか" - あなたの視点によって異なります。それは、すべてのデータベース接続のように、プロセス外、および可能性のあるネットワークコールです。したがって、ナノ秒ではなく、ミリ秒単位で時間を測定します。しかし、接続のタイムアウトを待つよりも速いです。しかし、私は私の主張に立っている - 接続は、DBの可用性をテストする方法です。待機時間を気にしないように、非同期スレッドに接続テストを行います。 – EBarr

関連する問題