2009-07-15 60 views
5

Ai có thể giải thích cho tôi những gì tôi sai tôi đang làm trong đoạn mã sau:Làm thế nào để liệt kê các phiên bản SQL Server có sẵn bằng SMO trong C#?

DataTable dt=SmoApplication.EnumAvailableSqlServer(true); 
Server sr = new Server("Test"); 

foreach(DataBase db in sr.DataBases) 
{ 
    Console.WriteLine(db["name"]); 
} 

Nó cung cấp cho một ngoại lệ trong sr.Databases mà không thể được kết nối.

+0

Tại sao bạn liệt kê máy chủ SQL, và sau đó vẫn instantiating chỉ là một "thử nghiệm"? –

+0

Có thể tường lửa của bạn (hoặc thứ gì đó khác) chặn phát sóng của osql mà cố gắng tìm các phiên bản có sẵn không? –

Trả lời

8

Hãy nhìn vào các liên kết sau đây họ có thể hữu ích:

Hoặc bạn có thể thay đổi mã của bạn như thế này:

DataTable dt = SmoApplication.EnumAvailableSqlServers(false); 
if (dt.Rows.Count > 0) 
{ 
    foreach (DataRow dr in dt.Rows) 
    { 
     Console.WriteLine(dr["Name"]); 
    } 
} 

Hy vọng điều này sẽ giải quyết được vấn đề của bạn.

+0

Câu hỏi nói rằng anh/cô ấy cần phải tìm các tên cá thể. Nhưng mã mà anh ta/cô ta đưa ra là tìm kiếm cơ sở dữ liệu trong một cá thể SQLServer cụ thể. –

6

Bạn có Máy chủ SQL với tên dụ Kiểm tra không? Nếu không, đó là vấn đề của bạn.

Dường như bạn đang cố gắng liệt kê tất cả các phiên bản SQL Server cục bộ. Nếu vậy, mã này sẽ làm việc:

DataTable dt = SmoApplication.EnumAvailableSqlServers(true); 

foreach (DataRow dr in dt.Rows) 
{ 
    Console.WriteLine(dr["Name"]); 
    Console.WriteLine(" " + dr["Server"]); 
    Console.WriteLine(" " + dr["Instance"]); 
    Console.WriteLine(" " + dr["Version"]); 
    Console.WriteLine(" " + dr["IsLocal"]); 
} 
2

Chỉ trong trường hợp các câu hỏi có tiêu đề sai ví dụ: ông muốn tìm ra cơ sở dữ liệu trong trường hợp đặc biệt:

using System; 
using Microsoft.SqlServer.Management.Smo; 
using System.Data; 
using System.Windows.Forms; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Server sr = new Server("MACHINE_NAME\\INSTANCE_NAME"); 

      try 
      { 
       foreach (Database db in sr.Databases) 
       { 
        Console.WriteLine(db.Name); 
       } 
       Console.Read(); 
      } 
      catch (Exception Ex) 
      { 
       MessageBox.Show(Ex.ToString()); 
      } 
     } 
    } 
} 

khác Lucas Aardvark Câu trả lời là thích hợp nhất.

+0

Bạn không cần cuộc gọi đến SmoApplication.EnumAvailableSqlServers vì giá trị trả về không được sử dụng. – adrianbanks

+0

Yup. Cảm ơn đã chỉ ra điều đó. –

0
using Microsoft.Win32; 

     RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server"); 
     String[] instances = (String[])rk.GetValue("InstalledInstances"); 
     if (instances.Length > 0) 
     { 
      foreach (String element in instances) 
      { 
       Console.WriteLine(element); // element is your server name     
      } 
     } 
+1

điều này sẽ chỉ trả về các máy chủ 32 bit nếu được biên dịch dưới dạng ứng dụng 32 bit và tương tự cho 64bit – Azerothian

Các vấn đề liên quan