用MFC连接Oracle9i数据库编程时,出现Connection对象创建失败,请确认是否初始化了COM环境错误!
我想可能是因为代码没有组织好。但自己查不出问题来,劳请各位帮忙看一下!
1.利用AppWizard新建立了一个自己的CTab类,在CTab类里对数据库进行连接和相关的插入,查询,删除等操作.在CTab类的.h文件里定义了CAdoConnection m_adoConnection;(注释:CAdoConnection 是别人写好的一个现成的ADO库,我直接引用就可以了,新类里已经包含了该库的头文件)
2.然后在系统自动生成的CTestApp.cpp的InitInstance里,利用AfxOleInit();对COM进行初始化。
3.编译没有错误,运行的时候出现COM环境没有初始化的错误.
4.如果我把CAdoConnection m_adoConnection;挪到CTestApp.cpp的InitInstance里,就没有错误,也就是AfxOleInit();
初始化完之后,紧接着就定义CAdoConnection m_adoConnection;
5.我把CAdoConnection m_adoConnection;挪到CMainFrame.h里定义也出现同样的错误;
CTestApp.cpp中代码:
BOOL CInfoAlterApp::InitInstance()
{
AfxEnableControlContainer();
AfxOleInit();
        ......
        return TRUE;
}
CTab.h种代码:#include "ado.h"
#include "CTestApp.h"
......
public:
        CAdoConnection m_adoConnection;
CAdoRecordSet m_adoRecordSet;
        BOOL ConnectToDataBase(CString m_dbname,CString m_dbsrc,CString m_dbpwd);
        ......CTab.cpp中代码:BOOL CTab::ConnectToDataBase(CString m_dbname,CString m_dbsrc,CString m_dbpwd)
{
BOOL bConnect = FALSE;
if(!m_adoConnection.ConnectOracle(m_dbname,m_dbsrc,m_dbpwd,-1))
return FALSE;
m_adoRecordSet.SetAdoConnection(&m_adoConnection);
return FALSE;
}问题:为什么在我自己定义的CTab.h类里定义CAdoConnection m_adoConnection;会出错?该如何解决?
新接触MFC,问题比较简单.望各位不要扔砖,谢谢!

解决方案 »

  1.   

    你在调用COM之前要CoInitialize或者OleInitialize
    MFC里面可以调AfxOleInit
      

  2.   

    用CoInitialize取代AfxOleInit对COM进行初始化试试。。
      

  3.   

    在使用COM对象前先调用CoInitialize(NULL);
      

  4.   

    如果你实在无法解决就adoConnection放在CTestApp中,其他地方用的时候用TheApp调用
      

  5.   

    另外把CAdoConnection m_adoConnection;放在APP的public部分也同样报错;不知为何?
    苦恼
      

  6.   

    另外把CAdoConnection m_adoConnection;放在APP的public部分也同样报错;不知为何?
    苦恼
      

  7.   

    1.有没有引入ADO库文件 
    2.
    if(!AfxOleInit())//这就是初始化COM库
    {
    AfxMessageBox(“OLE初始化出错!”);
    return FALSE;

    3.
    连接使用_ConnectionPtr接口
      

  8.   

    可能存在全局变量或者静态变量,这些变量的构造函数中执行了COM调用,但此时AfxOleInit还没有执行。设断点查看一下所有类构造函数的执行顺序,看看有没有在AfxOleInit调用之前执行的。
      

  9.   

    谢谢各位,如楼上所说,我CAdoConnetion m_pAdoconnetion;之前还没有对COM初始化;顺序搞乱了;但还是不明白,程序在启动的时候先执行的应该是APP里的InitInstance(),我在这个函数里CoInitialize(NULL);
    我的CAdoConnetion m_pAdoconnetion;是在InitInstance()之后,为什么还是提示没有初始化呢?
    CAdoConnetion m_pAdoconnetion;定义这个对象的确是在初始化之后才可以;
      

  10.   

    作为全局变量也可以,但是不要在构造函数里执行COM调用。
    尝试把com调用放入其它函数里,在AfxOleInit之后再调用。
      

  11.   

    我调用COM的时候不是在构造函数里,我是在自定义类的public部分声明COM对象时调用的;
    初始化COM函数CoInitialize(NULL); 是写在APP的InitInstance()里;
    按程序的执行顺序应该是APP的InitInstance()->初始化自定义类->在自定义类中调用COM
    ,按以上顺序写代码,就会出错;
    虽然问题解决了,但还没搞清除原因,郁闷......