我想在COM中使用ADO,实现如下:在stdafx.h加入#import语句引入ADO,结果编泽时出错.而同样的#import语句在普通的对话框中能编泽运行,真是奇怪.(我没有用ATL)

解决方案 »

  1.   

    在atl中可以用ado,
    创建名为 NativeData 的 ATL DLL 项目。 
    在“文件”菜单上单击“新建”,然后单击“项目”。 
    将出现“新建项目”对话框。 在“项目类型”窗格中,单击“Visual C++ 项目”,并在“模板”窗格中,单击“ATL 项目”。 
    将项目命名为 NativeData,然后单击“确定”。 
    即会出现“ATL 项目向导”。 单击“完成”以创建默认的 ATL 项目。 
    添加一个名为 DataAccessor 的新类。 
    在“类视图”中,右击 NativeData 项目。 
    在快捷菜单上单击“添加”,然后单击“添加类”。 
    即会出现“添加类”对话框。 单击“ATL 简单对象”并单击“打开”。 
    即会出现“ATL 简单对象向导”。 将对象命名为“DataAccessor”并单击“完成”以便将对象添加到项目中。 
    在 IDataAccessor 上添加名为 InitializeADO 的方法。 
    在“类视图”中,打开 NativeData 项目并右击 IDataAccessor 接口。 
    在快捷菜单上单击“添加”,然后单击“添加方法”。 
    “添加方法向导”出现。 将该方法命名为 InitializeADO,并且不要为该方法指定任何参数。 
    单击“完成”。 
    按如下所示在 DataAccessor.cpp 中实现 InitializeADO: 
    注意   您必须提供一个对 Pubs 数据库的连接字符串,如以下代码注释所述。更简便的方法是:在服务器资源管理器中新建一个连接,然后将“属性”窗口中的连接字符串复制给该连接。此外,如果选择在以下代码中使用 Windows NT 集成安全设置,则不需要用户 ID 和密码(因此可以将声明和定义 bstrUserID 和 bstrPassword 的行移除掉)。
    STDMETHODIMP CDataAccessor::InitializeADO(void)
    {
       USES_CONVERSION;   // Enables OLE2T macro   HRESULT hr = S_OK;   // Variables to contain connection string, 
       // database userid, and password.
       _bstr_t bstrConnectString;
       _bstr_t bstrUserID;   // Remove this line if using Windows NT 
                             // integrated security.
       _bstr_t bstrPassword; // Remove this line if using Windows NT
                             // integrated security.   try
       {
          // Note: In the following lines, provide your own
          // connection string to pubs and user ID as indicated:
          // Initialize variables
          bstrConnectString = L"YOUR CONNECTION STRING";
          bstrUserID = <YOUR USER ID>;
          bstrPassword = <YOUR PASSWORD>;
          // Security note: hard-coding a password is 
          // a security weakness      // Create an instance of ADOConnection:
          hr = m_spADOConnection.CreateInstance(__uuidof(Connection), NULL);      // Open the connection:
          hr = m_spADOConnection->Open(bstrConnectString, bstrUserID, 
               bstrPassword, adOptionUnspecified);      // Create an instance of a recordset:
          hr = m_spADORecordset.CreateInstance(__uuidof(Recordset), NULL);      // Open that recordset to a valid table:
          _bstr_t bstrQuery(L"SELECT * FROM authors");
          _variant_t vQuery(bstrQuery);      // Pass the ADOConnectionPtr to the recordset so that the
          // recordset connects to the appropriate database:
          _variant_t vDispatch((IDispatch*)m_spADOConnection);
          m_spADOConnection->AddRef();      // Open the recordset. Note that when you call
          // GetRecordSet you get a pointer to this recordset:
          hr = m_spADORecordset->Open(vQuery, 
                            vDispatch, 
                            adOpenDynamic, 
                            adLockOptimistic, 
                            adCmdText);   }
       catch(_com_error &err)
       {
          TCHAR szBuf[2056];
          _tcscpy(szBuf, _T(""));
          _tcscat(szBuf, err.ErrorMessage());
           _bstr_t bstrSource(err.Source());
          _bstr_t bstrDesc(err.Description());
          _tcscat(szBuf, (char*)bstrSource);
          _tcscat(szBuf, (char*)bstrDesc);      #ifdef _DEBUG
          OutputDebugString(szBuf);
    #endif // _DEBUG
          return E_FAIL;
       }   return S_OK;
    }
    在 IDataAccessor 上添加名为 GetRecordSet 的方法。 
    在“类视图”中,右击“IDataAccessor”接口。 
    在快捷菜单上单击“添加”,然后单击“添加方法”。 
    “添加方法向导”出现。 将该方法命名为 GetRecordSet,并为该方法指定一个 [out,retval] 参数 IUnknown** NativeRecordSet。 
    单击“完成”。 
    按如下所示在 DataAccessor.cpp 中实现 GetRecordSet: 
    STDMETHODIMP CDataAccessor::GetRecordSet(IUnknown** NativeRecordSet)
    {
       if (NativeRecordSet == NULL)
          return E_INVALIDARG;   // Note that ADO provides the ADORecordsetConstructionPtr:
       ADORecordsetConstructionPtr spConsPtr;
       spConsPtr = m_spADORecordset;   spConsPtr->get_Rowset(NativeRecordSet);   return S_OK;
    }
    在 IDataAccessor 上添加名为 CloseADO 的方法。 
    在“类视图”中,右击“IDataAccessor”接口。 
    在快捷菜单上单击“添加”,然后单击“添加方法”。 
    “添加方法向导”出现。 将该方法命名为 CloseADO,并且不要为该方法指定任何参数。 
    单击“完成”。 
    按如下所示在 DataAccessor.cpp 中实现 CloseADO: 
    STDMETHODIMP CDataAccessor::CloseADO(void)
    {
       // Close the open connection
       m_spADOConnection->Close ();
       return S_OK;
    }
    向 DataAccessor.h 中添加以下代码(用粗体表示): 
    注意   在以下代码中,#import 行中的路径名应该与 msado15.dll 驻留在系统上的路径相匹配。
    // DataAccessor.h : Declaration of the CDataAccessor#pragma once
    #include "resource.h"       // main symbols// The following pathname should match the path
    // where msado15.dll resides on your system:
    #import "C:\program files\common files\system\ado\msado15.dll"         no_namespace rename("EOF", "ADOEOF")
    ...
    在 FinalRelease 声明后添加:    CComPtr<IUnknown> m_pUnkMarshaler;   // Pointers for ADO used in the application:
       _ConnectionPtr m_spADOConnection;
       _RecordsetPtr m_spADORecordset;
    生成项目。在“生成”菜单上,选择“生成解决方案”。 
      

  2.   

    我解决了,COM中可以使用ADO,我以前加入#import语句时出现了重定义的情况,原来是stdafx.h中默认加入了ODBC和DAO的支持,所以出现了冲突.
      

  3.   

    #import ".../.../..../.../.../msado**.dll"