2010-03-05 67 views
4

我有一個安裝程序,用戶在連接字符串中輸入數據源(即DataSource =「machinename \ instance」)。從Server Instance如何確定服務依賴關係?

使用C#提供的計算機名\實例的字符串,我需要知道,如果服務名稱爲MSSQLSERVER或MSSQL $ SQLEXPRESS

在一個特定的機器,我們具有SQL Server 2005(全)和SQL Express 2008的安裝。

我需要知道這一點的原因是在我們的wix安裝程序中,要安裝的主要應用程序依賴於SQL服務器,所以我們需要安裝它的正確依賴關係。 依賴關係可能在服務MSSQLSERVER或MSSQL $ SQLEXPRESS上,我可以在計算機上安裝這兩個服務。

JD

+0

什麼不對的答案則:http://stackoverflow.com/questions/2381055/check-if-sql-server-any-version-is-installed – 2010-03-05 16:49:48

+1

回答得好,不過,讓我只是機器名稱,並且我無法確定依賴項是否應該位於MSSQLSERVER或MSSQL $ SQLEXPRESS上? – 2010-03-05 17:02:45

回答

4

SQL Server服務被命名爲要麼MSSQLSERVER(默認實例)或MSSQL $ INSTANCENAME(命名實例)。你能確定它是否是一個命名實例無論是從連接字符串(如果是在形式host\instance的是命名實例,如果是host然後是默認實例),但事實是,這是不可靠的,因爲:

  • 連接字符串可以使用SQL客戶端別名
  • 連接字符串可以連接到一個命名實例偵聽默認端口
  • 連接字符串可以連接到一個明確的端口,而不是指定實例名稱

因此,一個更可靠的方法是連接並索要實例名稱:

SELECT SERVERPROPERTY('InstanceName'); 

如果返回爲NULL,服務名稱將是MSSQLSERVER,否則是MSSQL $ ......你甚至可以把這個直接進入查詢:

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

@Remus:非常感謝。這真是讓人大開眼界。現在已經明白,如果用戶選擇遠程主機,我是否必須創建遠程依賴項?如果我這樣做了(如果可能的話),如果服務器將來換出到另一臺機器,或者如果它是本地服務器,然後升級(sql 2005到2008),這會是一件壞事。現在,鑑於我們的應用程序是一個自定義的Web服務器,是否真的需要依賴於SQL服務器?如果頁面沒有顯示,那麼用戶將不得不檢查SQL服務器是否正在運行。請讓我知道你的想法是什麼。 – 2010-03-06 08:31:42

+0

服務依賴關係順序對服務控制管理器追蹤服務啓動和關閉順序非常重要。在兩個本地服務之間,聲明這個依賴關係是有意義的。在本地和遠程服務之間,絕對不是。傳統的IIS/ASP Web應用程序不會聲明這種依賴關係,這主要是因爲Web API和數據庫之間的鏈接的*波動性:SQL Server的位置可能會因簡單的web.config更改而導致移動記事本,並會留下聲明的假依賴關係。 – 2010-03-06 16:14:22

+0

非常感謝。在這種情況下,我將刪除我們擁有的依賴項。 – 2010-03-08 09:22:27

0

您是否看到兩者的重大危害?

可以使用得到的運行服務的列表:

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

@Spencer:可以說用戶決定不需要sql server 2005,那麼sql服務將不會被刪除,除非首先刪除相關的應用程序。 – 2010-03-05 16:59:42

+0

啊好點。我會留下我的回答,以防其他人有相同的問題/想法。 – 2010-03-05 22:28:07

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 2014-04-14 13:25:49