2012-02-29 84 views
0

有什麼方法可以測試特定數據庫服務器是否連接?像ping操作一樣。測試SQL Db連接

我知道一些替代方式 - 測試SQL連接打開。不使用這種方法的原因是我的應用程序在每t秒連續測試連接。

感謝

回答

0

您可以ping服務器:

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

但這不會告訴你,如果DB是向上。打開一個連接(認證等可能是你唯一的方法)。你爲什麼不斷地以這種方式進行投票?

+0

我想阻止行動應用程序正在執行,如果數據庫不可用,這就是爲什麼。所以如果數據庫沒有連接,應用程序將被鎖定。 – 2012-02-29 14:19:34

+0

爲什麼不直接爲數據庫關閉時的情況提供一些錯誤處理(我希望這種情況應該不常見),而不是使用資源不斷ping這臺服務器來檢查? – Paddy 2012-02-29 15:52:48

1

不知道爲什麼我這樣做,考慮到你很少接受答案,但是這裏就是了。你的問題帶來了很多問題,其中許多意味着什麼。所以忍耐一下....

連接&我

連接可能意味着很多東西。 @Paddy指出,在更低層,PING會告訴您操作系統是否連接到您可以訪問的網絡。但是可以連接一臺計算機,SQL可以停止,脫機或發生故障。 SQL可能處於聯機狀態,但防火牆阻止請求計算機的訪問。請求的計算機可能缺少權限。名單繼續。

我在這裏的一點是:

打開到SQL Server的連接的能力是方法來測試連接。

如果是我,我會把一個小的ADO測試放在一個異步線程。測試會嘗試使用短暫超時打開連接。

解決症狀還是問題?

SQL Server確實被設計成一個高可用性產品,並且通常被設想爲高可用性產品。意思是說,如果你的SQL訪問量非常大,你想測試它(除了一般的錯誤處理程序),我會建議你解決可擴展性問題。即使是最基本的安裝加上大量的厄運,也應該允許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文章,看看如何設置一個項目。請注意,您需要WINDOWS權限(而不是SQL身份驗證)才能連接到有問題的SQL Server。

現在到代碼:

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沒有更多的想法。所以不能多說。 – 2012-03-01 07:00:24

+0

「不是很重」 - 取決於你的觀點。這是和過程中,可能網絡調用,像所有的數據庫連接。所以你會以毫秒爲單位來測量時間,而不是納秒。但它比等待連接超時更快。但是,我支持我的說法 - 連接是測試數據庫可用性的方法。把你的連接測試放在一個異步線程上,這樣你就不會在乎等待時間。 – EBarr 2012-03-01 12:31:26