用API得到局域网中可用SqlServer服务器列表
? 无意中找到了以前的一个C#程序,觉得好用发到这里以便和大家共享一下,其实这个代码我是抄别人过来的,原作者不详,觉得写的好就和大家共享一下了程序实现了用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; ???? } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |