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

如何在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

(编辑:李大同)

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

    推荐文章
      热点阅读