2010-03-05 6 views
4

사용자가 연결 문자열 (예 : DataSource = "machinename \ instance")에 데이터 소스를 입력하는 설치 프로그램이 있습니다. 서비스 이름은 우리가 SQL 서버 2005 (전체) 및 SQL Express를 2008 설치되어 하나의 특정 시스템에서 MSSQLSERVER 또는 MSSQL $ SQLEXPRESSServer Instance에서 서비스 종속성은 어떻게 결정합니까?

경우

컴퓨터 이름의 \ 인스턴스 문자열 주어진 C# .NET을 사용하여, 나는 알 필요가 없다.

우리가 알고 있어야하는 이유는 우리의 wix 설치 프로그램에 있습니다. 설치 될 주 응용 프로그램은 SQL 서버에 대한 종속성이 있으므로 설치하기위한 올바른 종속성이 필요합니다. 종속성은 MSSQLSERVER 또는 MSSQL $ SQLEXPRESS 서비스에있을 수 있으며 이러한 서비스가 모두 컴퓨터에 설치되어있을 수 있습니다.

jd

+0

: http://stackoverflow.com/questions/2381055/check-if-sql-server-any-version-is-installed –

+1

좋은 대답,하지만 그 제공 나 그냥 컴퓨터 이름과 그에서 종속성 MSSQLSERVER 또는 MSSQL $ SQLEXPRESS에 있어야하는지 여부를 확인할 수 없습니다? –

답변

4

SQL Server 서비스는 MSSQLSERVER (기본 인스턴스) 또는 MSSQL $ INSTANCENAME (명명 된 인스턴스) 중 하나와 같은 이름이 지정됩니다. 당신은 그 인스턴스가 연결 문자열 (만약 host\instance 인 경우 이름이 지정된 인스턴스 인 경우 host이 기본 인스턴스 임)을 확인할 수 있지만 진실은 신뢰할 수 없다는 것입니다.

  • 연결 문자열은
  • 연결 문자열은 명시 적으로 포트에 연결할 수있는 연결 문자열은 기본 포트에서 수신 명명 된 인스턴스에 연결할 수있는 SQL 클라이언트 별칭
  • 을 사용하고 인스턴스 이름
를 지정하지 않을 수 있습니다

그래서 더 신뢰할 수있는 방법은 연결하고 인스턴스 이름을 요청하는 것입니다 그렇지 않으면 MSSQL $입니다,

SELECT SERVERPROPERTY('InstanceName'); 

복귀가 NULL 인 경우

는 서비스 이름은 MSSQLSERVER 것입니다 ... 당신은 바로이 점을 넣을 수 있습니다 쿼리 :

SELECT COALESCE('MSSQL$'+cast(SERVERPROPERTY('InstanceName') as sysname), 'MSSQLSERVER'); 
+0

@ 남편 : 정말 고마워요. 그것은 정말 눈이 뜨거웠습니다. 이제는 사용자가 원격 호스트를 선택하면 원격 종속성을 만들어야합니까?만약 내가 (가능하다면) 서버를 다른 컴퓨터로 스왑 아웃해야하거나 로컬 서버이고 업그레이드 된 경우 (SQL 2005에서 2008) 업그레이드가 좋지 않다면 좋지 않을까요? 이제 우리 애플리케이션이 사용자 정의 웹 서버라는 사실을 고려할 때 SQL 서버에 대한 의존성이 정말로 필요합니까? 페이지가 표시되지 않으면 SQL Server가 실행되고 있는지 확인해야합니다. 당신의 생각이 무엇인지 알려주세요. –

+0

서비스 종속성 순서는 서비스 제어 관리자가 서비스 시작 및 종료 순서를 추적하는 데 중요합니다. 두 로컬 서비스간에이 종속성을 선언하는 것이 좋습니다. 로컬 서비스와 원격 서비스 사이에서는 절대적으로 그렇지 않습니다. 전통적인 IIS/ASP 웹 애플리케이션은 웹 애프터와 데이터베이스 사이의 링크의 변동성 때문에 주로 의존성을 선언하지 않습니다. SQL 서버의 위치는 간단한 web.config 변경으로 인해 이동할 수 있습니다. 메모장에서 위조 된 의존성을 남겨 둡니다. –

+0

정말 고마워요. 나는이 경우에 우리가 가지고있는 의존성을 제거 할 것이다. –

0

두 가지 모두에 중대한 피해가 있습니까?

다음을 사용하여 실행중인 서비스의 목록을 얻을 수 있습니다 :

using System.ServiceProcess; 
// ... 
ServiceController[] sc = ServiceController.GetServices(); 
+0

@Spencer : 예, 사용자가 SQL Server 2005를 원하지 않는다고 판단하면 종속 응용 프로그램이 먼저 제거되지 않으면 sql 서비스가 제거되지 않습니다. –

+0

아 좋은 지적입니다. 다른 사람이 같은 질문이나 아이디어를 가지고있는 경우에 대비하여 내 답변을 남겨 둘 것입니다. –

2

당신은 현재의 시스템에서 모든 서비스의 목록을 얻을 수있는 ServiceController.GetServices 방법을 사용할 수 있습니다. 그런 다음 각각의 ServiceName 속성을 사용하여 찾고있는 각 서비스가 설치되어 있는지 여부를 확인할 수 있습니다. 예를 들어 :

다음이 답변을 잘못 무엇
ServiceController[] services = ServiceController.GetServices(); 

if (services.Any(x => x.ServiceName == "MSSQL$SQLEXPRESS")) 
{ 
    this.serviceInstaller1.ServicesDependedOn = new string[] { "MSSQL$SQLEXPRESS" };  
} 
else if (services.Any(x => x.ServiceName == "MSSQLSERVER")) 
{ 
    this.serviceInstaller1.ServicesDependedOn = new string[] { "MSSQLSERVER" }; 
} 
+0

@StevanDoggart 편집을 완료 해 주셔서 감사합니다. – dennis

관련 문제