如何在C#中枚举网络中的可用数据库服务(SQLSewrver或Oracle或MySQL或PostgreSQL等)?

use*_*312 6 c#

如何使用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, henv, 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, inString, inStringLength, outString,
                                    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
}
Run Code Online (Sandbox Code Playgroud)

此代码仅适用于SqlServers和WindowsXP.

它不适用于其他DBMS服务器和Win7.

我需要一个规范的解决方案.

Dav*_*son 1

资源: http://msdn.microsoft.com/en-us/library/ms162169.aspx http://www.microsoft.com/downloads/details.aspx?FamilyId=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C&displaylang=en

您可能想研究一下 SMO。这要求每个客户端都安装 Sql 管理对象和 CLR 类型。下面是我的一个工作应用程序中的代码片段,它就是执行此操作的。

private void OnClicked_RefreshDataSources(object sender, EventArgs e) {
        Cursor = Cursors.WaitCursor;

        DataTable dt = SmoApplication.EnumAvailableSqlServers(false);
        uxDataSource.Items.Clear();

        foreach (DataRow row in dt.Rows) {
            uxDataSource.Items.Add(row["Name"]);
        }

        if (dt.Rows.Count > 0) {
            uxDataSource.SelectedIndex = 0;
        }

        Cursor = Cursors.Default;
    }

    private void OnSelectedIndexChanged_PopulateDatabases(object sender, EventArgs e) {
        ConnectionString.DataSource = uxDataSource.SelectedItem.ToString();

        Server server = new Server(uxDataSource.SelectedItem.ToString());
        server.ConnectionContext.LoginSecure = false;
        server.ConnectionContext.Login = Program.DesktopService.AccountName;

        uxInitialCatalog.Items.Clear();

        try {
            foreach (Database db in server.Databases) {
                uxInitialCatalog.Items.Add(db.Name);
            }

            if (server.Databases.Count > 0) {
                uxInitialCatalog.SelectedIndex = 0;
            }
        }
        catch {
            MessageBox.Show("You do not have access to this server.", "Sql Connection", MessageBoxButtons.OK, 
                MessageBoxIcon.Warning);
            uxInitialCatalog.Items.Clear();
        }
    }
Run Code Online (Sandbox Code Playgroud)