加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 15:58:10 所属栏目:MsSql教程 来源:网络整理
导读:本文轉自:http://www.pcdog.com/edu/aspdotnet/2006/06/f139082.html 用API得到局域网中可用SqlServer服务器列表 程序实现了用API来得到SqlServer服务器列表的功能,我觉得比用SQLDEMO组件更有意义,代码如下: /// summary /// 获取网内的数据库服务器名称

本文轉自: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;

???? }

}

?注:未驗証正确性

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读