65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SQL DMO 枚举 SQL Server

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (3投票s)

2001年12月5日

2分钟阅读

viewsIcon

93160

downloadIcon

3463

获取您可以连接的 SQL Server 列表。

Sample Image - serverenum.gif

引言

SQL Server 分布式管理对象 (SQL-DMO) 是一个基于 COM 的对象库,它公开了访问 SQL Server 中任何对象的接口。 任何支持 COM 对象(如 VB 或 C++)的编程语言都可以使用这些接口。

SQL-DMO 对象模型允许访问 SQL Server 中的对象,因此您可以将管理功能构建到代码中。 在本文中,我将介绍如何使用 SQL-DMO 枚举数据库服务器。

SQL DMO 要求

SQL-DMO 使用 Microsoft® SQL Server ODBC 驱动程序来连接和与 SQL Server 实例通信。

如果您安装了 SQL SERVER 企业管理器,那么您应该已经安装了 SQL DMO。 如果没有,以下文章 向您展示如何安装这些对象。

ADO 要求

MDAC v2.1 或更高版本(可以从 microsoft 获取) 这包含了连接到数据库或数据源所需的 OLE DB 驱动程序。

使用 SQL DMO

使用以下 import 语句来访问 SQL DMO,这应该在您的 stdafx.h 文件中完成。

#import "c:\mssql7\binn\resources\1033\sqldmo.rll" no_namespace

使用 ADO

为了使用 ADO Com 对象,您需要导入以下类型库,这应该在您的 stdafx.h 文件中完成。 请注意,ADO 命名空间已重命名,这是必须的,否则您会发现 ADO 和 SQL DMO 之间的对象名称冲突。

#import "C:\Program Files\Common Files\System\ado\msado15.dll" rename_namespace("ADONS") rename("EOF", "adoEOF") 

请注意,您可能需要将这些 dll 的完整路径添加到您的项目中,或者您可以通过 Visual C++ 环境,通过工具 -> 选项 -> 目录 -> 包含文件来添加路径。

加载 COM 和 OLE 库

您必须做的第一件事之一是初始化 COM OLE 库,以便使用 SQL DMO COM 对象,通常可以通过 ::CoInitialize(NULL)::CoUninitialize() 来完成。 如果您使用 MFC,那么您可以简单地调用

AfxOleInit()

在您的 App 类的 ::InitInstance 函数中。

从 SQL DMO 枚举 SQL SERVER

以下代码显示了用于枚举 SQL SERVER 的 SQL DMO 对象。 基本上创建 Application 对象,然后使用 ListAvailableSQLServers 方法获取 SQL SERVER 的列表。

// set up the Server Combo Box
try
{
    _SQLServerPtr spSQLServer;
     
    HRESULT hr2 = spSQLServer.CreateInstance(__uuidof(SQLServer));
    if (FAILED(hr2))
     _com_issue_error(hr2);   

     if (SUCCEEDED(hr2))
     {
        try
        {
           // Get the Application Ptr
           long lServerCount(0);
           _ApplicationPtr pApplication = spSQLServer->GetApplication();
           if (pApplication) {
                NameListPtr pServerNameList = pApplication->ListAvailableSQLServers();
                if (pServerNameList)
                { 
                    HRESULT  hr= pServerNameList->get_Count(&lServerCount);  BSTRbstrServerName;
                    m_ctlComboBox.ResetContent(); 
                    _variant_t  vIndex(long(0));
                    for (long  i=0;  i <  lServerCount; i++)
                    {
                        vIndex.lVal = i;
                        hr = pServerNameList->raw_Item(vIndex, &bstrServerName);
                        _bstr_t bstrValue(bstrServerName);  
                        CString sValue((LPCSTR)bstrValue);
                        if (!sValue.IsEmpty())
                                m_ctlComboBox.AddString(sValue);
                    }
                       
                    // We know that the server list will not show up on Win 9x machines
                    // therefore check manually to see if SQL Server exist
                    if (m_ctlComboBox.GetCount() == 0)
                    {
                        HKEY hKey = NULL;
                        if (RegOpenKey(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\MSSQLServer"), 
                                       &hKey) == ERROR_SUCCESS)
                        {
                            m_ctlComboBox.AddString(_T("(local)"));                                
                            RegCloseKey(hKey);
                        }                            
                    }
                }
            }
            pApplication = NULL;
                
            spSQLServer.Release();
        }
        catch (_com_error e)
        {
            AfxMessageBox(ReportError(e));
            spSQLServer.Release();     //    Free the interface.
        }
    }
    else
    {
        AfxMessageBox("\nUnable to create the SQLServer object.");
    }
 }
 catch (_com_error e)
 {
     AfxMessageBox(ReportError(e));
 }

注意 - 如果您在 Win 9x 机器上安装了 SQL SERVER,那么服务器名称将不会出现在列表中。 为了解决这个问题,对注册表进行测试,看看是否已在该机器上安装了 SQL SERVER,如果已安装,则将(本地)服务器添加到列表中。

结论

我只使用了 SQL DMO 可以公开的一小部分可用功能。 枚举 SQL SERVER 示例展示了使用 SQL DMO 是多么容易。 有关 SQL DMO 的更多信息,请参阅 MSDN。

© . All rights reserved.