初学ADO开发,输入书上一个例子。
执行到hr = m_pConnection.CreateInstance (__uuidof (Connection));时总是失败。程序转向语句AfxMessageBox ("createinstance of Connection fail!");
网上搜了半天资料也找不到解决办法,请大家帮助解答。try {
//建立实例
hr = m_pConnection.CreateInstance (__uuidof (Connection)); if (SUCCEEDED (hr)) {
//设置链接串属性为UDL文件
m_pConnection->ConnectionString = "File Name = my_data1.udl";
//设置等待链接打开的时间为20S
m_pConnection->ConnectionTimeout = 20;
//默认值同步
hr = m_pConnection->Open("", "", "", adConnectUnspecified); if (FAILED (hr)) {
AfxMessageBox ("open fail!");
return true;
}
}
else {
AfxMessageBox ("createinstance of Connection fail!");
return true;
}
}

解决方案 »

  1.   

    这里有出错提示也不一定就是这里的问题,还要看看你用ADO的过程对了没有使用ADO访问数据库:
     
              1、导入ADO库文件。          用#import引入ADO库文件 
              #import "c:\program files\common files\system\ado\msado15.dll"no_namespaces rename("EOF" adoEOF")  这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。 
               2、添加类:这个类现对数据库的连接、执行、退出连接等函数据,以便在以后应用。代码如下:#if !defined(AFX_ADOCONN_H__2BC07DB1_94D0_43A9_8C59_B5E14FBD430B__INCLUDED_)
    #define AFX_ADOCONN_H__2BC07DB1_94D0_43A9_8C59_B5E14FBD430B__INCLUDED_//#include "C:\Program Files\Common Files\System\ado\msader15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000class ADOConn  
    {
    public:
     _RecordsetPtr m_pRecordset;//指向CONNECTION对象的指针
     _ConnectionPtr m_pConnection;//返回查询结果
    public:
     void ExitConnect();//关闭记录集与连接
     BOOL ExecuteSQL(_bstr_t bstrSQL);//执行没有返回结果的SQL语句
     _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//执行查询语句可以返回结果
     void OnInitADOConn();//初始化连接数据库
     ADOConn();
     virtual ~ADOConn();};
    具体的函数据如下:请细细地看这些代码,看代码比看注释好上几倍!
    void ADOConn::OnInitADOConn()
    {
     ::CoInitialize(NULL);
    // AfxOleInit(); 
     try
     {
      m_pConnection.CreateInstance(__uuidof(Connection)); //"ADODB.Recordset");//问题就在这了
     _bstr_t strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HrMan;Data Source=BB";
      //Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HrMan;Data Source=BB
      // m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HrMan";
     
     // m_pConnection->Open("","","",adConnectUnspecified);
      
      m_pConnection->Open(strConnect,"","",adModeUnknown);
     }
     catch(_com_error e)
     {
      AfxMessageBox("连接有问题");//
      AfxMessageBox(e.Description());
     }
     }_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
    {
     try
     {
      if(m_pConnection==NULL)
       OnInitADOConn();
      m_pRecordset.CreateInstance(_uuidof(Recordset));
      m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); 
     }
     catch(_com_error e)
     {
      AfxMessageBox("查询有错误");
      AfxMessageBox(e.Description());
     }
     return m_pRecordset;}BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
    {
     try
     {
      if(m_pConnection==NULL)
       OnInitADOConn();
       //OnInitADOConn
      m_pConnection->Execute(bstrSQL,NULL,adCmdText);
      return true;
     }
     catch(_com_error e)
     {
      AfxMessageBox("插入有问题");
      AfxMessageBox(e.Description());
      return false;
     }}void ADOConn::ExitConnect()
    {
     if(m_pRecordset!=NULL)
      m_pRecordset->Close();
     m_pConnection->Close();
     ::CoUninitialize();
    }          3、用2中的函数对数据库操作           (1)定义ADOCONN对象
               (2)执行SQL语句
               (3)关闭连接              关于这一步可以参照以下代码理解,这是一个INSERT语句的执行过程: ADOConn m_AdoConn;
     m_AdoConn.OnInitADOConn();
     _bstr_t vSQL;
     vSQL="INSERT INTO Employees(Dep_Name,Sex,Title,Wage,Dep_id)VALUES('"+m_EmpName+"','"+strSex+"','"+m_Title+"','"+strWage+"',1)";
     m_AdoConn.ExecuteSQL(vSQL);
     m_AdoConn.ExitConnect();有点长,你仔细看了可能会有帮助。