2013-04-16 3 views
0

내 컴퓨터에 설치된 SQL Server의 모든 인스턴스를 반환해야하는 코드 조각이 있습니다. 다음과 같이 표시됩니다.내 메서드가 유효한 SQL Server 인스턴스를 반환하지 않는 이유는 무엇입니까?

DataTable dtLocalServers = SmoApplication.EnumAvailableSqlServers(true); 

foreach (DataRow dServer in dtLocalServers.Rows) 
{ 
    Console.WriteLine(dServer.ToString()); 
} 

작동하며 컴파일하고 실행합니다. 결과 데이터 테이블은 그다지 유용하지 않습니다.

Name | Server | Instance | IsClustered | Version | IsLocal 
IAN-PC | IAN-PC |    | True  |   | True 

결과가 반환되지만 서버에 대한 정보가 전혀 나오지 않는 것이 문제입니다. 특히 '버전'필드에 있어야한다고 가정하는 버전 (SQL Server 2008 Express R2 또는 SQL Server Express 2012)을 얻으려고합니다. 이 테스트를 위해 로컬에서 실행되는 두 개의 복사본이 있다는 사실을 알고 있습니다.

더 나은 결과를 얻으려는 다른 방법이 있습니까?

EDIT : IAN-PC는 내 컴퓨터의 이름입니다. 내 컴퓨터에는 SQL Server의 두 인스턴스 인 IANSQLEXP (SQL Server 2008 Express R2)와 SQLEXPRESS (SQL Server Express 2012)가 있습니다. SQL Server 구성 관리자에는 실행 중이 지 않은 에이전트와 실행되고 있지 않은 SQL Server 브라우저가 있습니다.

+1

테이블의 버전은 '버전'입니다. 서버가 클러스터 된 경우 버전을 반환하지 않습니다. – Romoku

+0

그 부분을 이해합니다. 서버를 점검 할 다른 방법이 있습니까? 우리는 클라이언트의 컴퓨터에 서비스를 배치하려고합니다. 따라서 클러스터가 클러스터되어 있는지 여부를 제어 할 수 없으며 설치되는 내용을 확인하려고합니다. 그건 바보 같은 질문 일 수도 있습니다. SQL Server의 작동 방식에 익숙하지 않습니다. – ijb109

+0

클러스터 된 인스턴스가 명명 된 인스턴스입니까? –

답변

0

여기서 문제는 컴퓨터에서 SQL Server Browser가 비활성화 된 것입니다. 응답을 찾은 게시물은 here입니다. 도움이되는 MSDN의 또 다른 유용한 링크는 here. 도움을 주셔서 감사합니다!

0

서버를 열거하고 List<Server>으로 설정할 수 있습니다.

var servers = 
    SmoApplication 
     .EnumAvailableSqlServers() 
     .AsEnumerable() 
     .Select(s => new Server(s[0].ToString())) //Server name is first column 
     .ToList(); 

당신은 서버 버전을 얻을 ServerVersion 속성을 사용할 수 있습니다.

var unavailableServers= new List<Server>(); 
var activeServers = new List<Server>(); 
var tasks = new List<Task>(); 

foreach(var server in servers) 
{ 
    var task = 
     Task.Run(() => 
      { 
       try 
       { 

        server.ConnectionContext.Connect(); 
        server.ConnectionContext.Disconnect(); 
        activeServers.Add(server); 
       } 
       catch(ConnectionFailureException) 
       { 
        unavailableServers.Add(server); 
       } 
      }); 

    tasks.Add(task); 
} 

Task.WaitAll(tasks.ToArray()); 
+0

내가 그렇게 할 때 이전과 같은 결과를 얻었고 (서버 형식), 버전을 얻으려고하면 아래쪽으로 내려서'base {System.SystemException} = { "실패했습니다. 서버 IAN-PC에 연결하십시오. "}'. 클러스터링이 문제라고 생각합니다. – ijb109

+0

서버에 액세스 할 수 있는지 여부를 확인해야합니다. 내 편집을 확인하십시오. – Romoku

+0

비어있는 활성 서버 목록이 나타납니다. 나는 여기서 무슨 일이 일어나고 있는지 잘 모르겠다. 그러나 컴퓨터 이름이 서버가되어있는 것처럼 보인다. 아마 클러스터 일 것이다. 어쨌든, 나는이 접근법이 작동하지 않는 것 같은 느낌이 든다. ( – ijb109

관련 문제