2012-02-29 4 views
0

특정 데이터베이스 서버가 연결되어 있는지 여부를 테스트 할 수있는 방법이 있습니까? 핑 동작처럼.SQL Db 연결 테스트

다른 방법으로는 SQL 연결 열기를 테스트합니다. 그 접근법을 사용하지 않는 이유는 내 앱이 매 초마다 연결을 테스트한다는 것입니다.

감사

답변

0

당신은 서버를 ping 할 수

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

그러나 DB가있는 경우이 당신을 말하지 않을 것이다. 연결을 여는 것 (아마도 인증하는 방법이 유일한 방법 일 것입니다). 왜 계속 이런 식으로 폴링하는거야?

+0

나는 응용 프로그램에서 수행되는 행동을 방지 할 수 있습니다. 그래서 DB가 연결되어 있지 않으면 앱이 잠길 것입니다. –

+0

왜 데이터베이스를 다운시킬 때 오류 처리를 제공하지 않는가? (자주 사용하지 않아야한다.) 리소스를 사용하여 지속적으로이 서버를 검사하여 확인한다. – Paddy

1

내가 왜이 일을하는지 잘 모르겠다. 대답을 거의 받아들이지 않는다고 생각하지만, 여기에 있습니다. 귀하의 질문에 많은 쟁점이 제기됩니다. 그래서 & 내게

연결이 많은 것을 의미 할 수

연결 .... 나와 함께 곰. 훨씬 낮은 계층에서 @Paddy가 가리키는 것처럼 PING은 OS가 연결할 수있는 네트워크에 연결되어 있는지 알려줍니다. 그러나 컴퓨터를 연결하고 SQL을 중지하거나, 오프라인으로 만들거나, 오작동시킬 수 있습니다. SQL은 온라인 일 수 있지만 방화벽은 요청한 컴퓨터에서 액세스를 차단합니다. 요청하는 컴퓨터에 사용 권한이 없을 수 있습니다. 목록은 계속됩니다.

SQL Server에 대한 연결을 열 수있는 기능이이 연결을 테스트 할 수있는 방법입니다 : 여기

내 요점은 것입니다.

나라면 나는 비동기 스레드에 작은 ADO 테스트를 넣을 것이다. 이 테스트는 짧은 시간 제한을 사용하여 연결을 열려고 시도합니다.

증상 또는 문제점을 해결하려면?

SQL Server는 실제로 고 가용성 제품으로 설계되었으며 일반적으로 고 가용성 제품으로 고안되었습니다. 의미, 만약 당신의 SQL 액세스가 너무 많이 (일반적인 오류 처리기를 넘어) 그것을 테스트하려는 availability 문제를 해결하는 것이 좋습니다 나가고있다. 가장 기본적인 설치와 불운이 섞인 경우에도 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