(轉)用API得到局域网中可用SqlServer服务器列表

本文轉自:http://www.pcdog.com/edu/aspdotnet/2006/06/f139082.html

用API得到局域网中可用sqlServer服务器列表

程序实现了用API来得到sqlServer服务器列表的功能,我觉得比用sqlDEMO组件更有意义,代码如下:


/// <summary>

/// 获取网内的数据库服务器名称

/// </summary>

public class sqlLocator

{

     [System.Runtime.InteropServices.DllImport("odbc32.dll")]

     private static extern short sqlAllocHandle(short hType,IntPtr inputHandle,out IntPtr outputHandle);

     [System.Runtime.InteropServices.DllImport("odbc32.dll")]

     private static extern short sqlSetEnvAttr(IntPtr henv,int attribute,IntPtr valuePtr,int strLength);

     [System.Runtime.InteropServices.DllImport("odbc32.dll")]

     private static extern short sqlFreeHandle(short hType,IntPtr handle);

     [System.Runtime.InteropServices.DllImport("odbc32.dll",CharSet= System.Runtime.InteropServices.CharSet.Ansi)]

     private static extern short sqlbrowseConnect(IntPtr hconn,System.Text.StringBuilder inString,

         short inStringLength,System.Text.StringBuilder outString,short outStringLength,

         out short outLengthNeeded);

 

     private const short sql_HANDLE_ENV = 1;

     private const short sql_HANDLE_DBC = 2;

     private const int sql_ATTR_ODBC_VERSION = 200;

     private const int sql_OV_ODBC3 = 3;

     private const short sql_SUCCESS = 0;

 

     private const short sql_NEED_DATA = 99;

     private const short DEFAULT_RESULT_SIZE = 1024;

     private const string sql_DRIVER_STR = "DRIVER=sql SERVER";

 

     private sqlLocator(){}

 

     /// <summary>

     /// 获取网内的数据库服务器名称,是一个字符串数组。

     /// </summary>

     /// <returns></returns>

     public static string[] GetServers()

     {

         string list = string.Empty;

         IntPtr henv = IntPtr.Zero;

         IntPtr hconn = IntPtr.Zero;

         System.Text.StringBuilder inString = new System.Text.StringBuilder(sql_DRIVER_STR);

         System.Text.StringBuilder outString = new System.Text.StringBuilder(DEFAULT_RESULT_SIZE);

         short inStringLength = (short) inString.Length;

         short lenNeeded = 0;

 

         try

         {

              if (sql_SUCCESS == sqlAllocHandle(sql_HANDLE_ENV,henv,out henv))

              {

                   if (sql_SUCCESS == sqlSetEnvAttr(henv,sql_ATTR_ODBC_VERSION,(IntPtr)sql_OV_ODBC3,0))

                   {

                       if (sql_SUCCESS == sqlAllocHandle(sql_HANDLE_DBC,out hconn))

                       {

                            if (sql_NEED_DATA ==  sqlbrowseConnect(hconn,inString,inStringLength,outString,

                                 DEFAULT_RESULT_SIZE,out lenNeeded))

                            {

                                 if (DEFAULT_RESULT_SIZE < lenNeeded)

                                 {

                                     outString.Capacity = lenNeeded;

                                     if (sql_NEED_DATA != sqlbrowseConnect(hconn,

                                          lenNeeded,out lenNeeded))

                                     {

                                          throw new ApplicationException("Unabled to aquire sql Servers from ODBC driver.");

                                     }   

                                 }

                                 list = outString.ToString();

                                 int start = list.IndexOf("{") + 1;

                                 int len = list.IndexOf("}") - start;

                                 if ((start > 0) && (len > 0))

                                 {

                                     list = list.Substring(start,len);

                                 }

                                 else

                                 {

                                     list = string.Empty;

                                 }

                            }                          

                        }

                   }

              }

         }

         catch

         {

              list = string.Empty;

         }

         finally

         {

              if (hconn != IntPtr.Zero)

              {

                   sqlFreeHandle(sql_HANDLE_DBC,hconn);

              }

              if (henv != IntPtr.Zero)

              {

                   sqlFreeHandle(sql_HANDLE_ENV,hconn);

              }

         }

 

         string[] array = null;

 

         if (list.Length > 0)

         {

              array = list.Split(',');

         }

 

         return array;

     }

}

 注:未驗証正确性

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...