2013-04-16 40 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),我認爲它應該在'Version'字段中。我知道這樣一個事實,即我有兩份本地運行的副本用於測試。

還有什麼我可以做得到更好的結果嗎?

編輯:IAN-PC是我的電腦的名字。我的計算機上有兩個運行的SQL Server實例,IANSQLEXP(SQL Server 2008 Express R2)和SQLEXPRESS(SQL Server Express 2012)。在SQL Server配置管理器中,還有兩個未運行的代理程序和一個未運行的SQL Server瀏覽器。

+1

您的表格具有'Version'作爲列。如果服務器是集羣的,它將不會返回一個版本。 – 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} = {「Failed to連接到服務器IAN-PC。「}'。我覺得集羣是這裏的問題。 – ijb109

+0

您需要檢查您是否可以訪問服務器。檢查我的編輯。 – Romoku

+0

我收到一個空的活動服務器列表。我不確定這裏發生了什麼,但它似乎將計算機名稱作爲服務器,也許這就是羣集。無論如何,我覺得這種方法是行不通的:( – ijb109

相關問題