如何在C#中枚举网络中的可用数据库服务(SQLSewrver或Oracle或MyS
发布时间:2020-12-15 08:23:29 所属栏目:百科 来源:网络整理
导读:如何使用C#枚举网络中的可用数据库服务(SQL Server或Oracle或 MySQL或PostgreSQL等)? 我还需要找到他们的端口号和服务实例名称. 例如: class Server{ #region DLL Inports [DllImport("odbc32.dll")] private static extern short SQLAllocHandle(short hT
如何使用C#枚举网络中的可用数据库服务(SQL Server或Oracle或
MySQL或PostgreSQL等)?
我还需要找到他们的端口号和服务实例名称. 例如: class Server { #region DLL Inports [DllImport("odbc32.dll")] private static extern short SQLAllocHandle(short hType,IntPtr inputHandle,out IntPtr outputHandle); [DllImport("odbc32.dll")] private static extern short SQLSetEnvAttr(IntPtr henv,int attribute,IntPtr valuePtr,int strLength); [DllImport("odbc32.dll")] private static extern short SQLFreeHandle(short hType,IntPtr handle); [DllImport("odbc32.dll",CharSet = CharSet.Ansi)] private static extern short SQLBrowseConnect(IntPtr hconn,StringBuilder inString,short inStringLength,StringBuilder outString,short outStringLength,out short outLengthNeeded); #endregion #region Constants 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"; #endregion #region static string[] GetServers() public static string[] GetNames() { string[] retval = null; string txt = string.Empty; IntPtr henv = IntPtr.Zero; IntPtr hconn = IntPtr.Zero; StringBuilder inString = new StringBuilder(SQL_DRIVER_STR); StringBuilder outString = new 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."); } } txt = outString.ToString(); int start = txt.IndexOf("{") + 1; int len = txt.IndexOf("}") - start; if ((start > 0) && (len > 0)) { txt = txt.Substring(start,len); } else { txt = string.Empty; } } } } } } catch (Exception ex) { //Throw away any error if we are not in debug mode //#if (DEBUG) //MessageBox.Show(ex.Message,"Acquire SQL Servier List Error"); //#endif txt = string.Empty; throw ex; } finally { if (hconn != IntPtr.Zero) { SQLFreeHandle(SQL_HANDLE_DBC,hconn); } if (henv != IntPtr.Zero) { SQLFreeHandle(SQL_HANDLE_ENV,hconn); } } if (txt.Length > 0) { retval = txt.Split(",".ToCharArray()); } return retval; } #endregion } 此代码仅适用于SqlServers和WindowsXP. 它不适用于其他DBMS服务器和Win7. 我需要一个规范的解决方案. 解决方法
您也可以使用
SqlDataSourceEnumerator类.请记住,这是MS SQL Server特定的……
var results = SqlDataSourceEnumerator.Instance.GetDataSources(); foreach (var row in results.Rows) { Console.WriteLine("{0}{1}",row["ServerName"],row["InstanceName"]); } 有关其他信息,请参阅此link (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |