vc6.0 ADO访问数据库

来源:互联网 发布:python snmp 编辑:程序博客网 时间:2024/05/18 15:53

最近做一个蛋疼的项目会用到ACCESS数据并从中读取数据,由于之前没搞过VC的项目,经过几番磕磕碰碰总算搞好了,遂将解决流程记录下来:

首先吐槽下微软在版本兼容性方面的缺陷,搞得我是蛋疼得不得了啊,若非高人相助现在已可能经吐血身亡了

废话少说上代码:

以下代码环境:win7 32位+VC6.0

目标环境:       XP 32位 无VC

添加头文件:

#import "C:\program files\common files\system\ado\msado15.dll" rename_namespace("ADONameSpace") rename("EOF","adoEOF")

 

实现代码:

BOOL CTest2::fnGetTestResult(E_FAILTYPE &eGetResultError)
{
 CString csFilePath ;
 CString csErrorInfo;
 CString csInfo;
 BOOL    bIsFind = FALSE;
 if (" "==m_csTestReortFile)
 {
  return FALSE;
 }
 ADONameSpace::_ConnectionPtr pConnection;
 ADONameSpace::_CommandPtr    pCommand;
 ADONameSpace::_RecordsetPtr pRecordset;

 ::CoInitialize(NULL);           //初始化COM环境
 HRESULT hr;
 try
 {
  //hr=pConnection.CreateInstance(__uuidof(ADONameSpace::Connection));  //这两句CreateInstance我试过都可以
  hr=pConnection.CreateInstance("ADODB.Connection");

if(FAILED(hr))
  {

        _com_error e(hr);
       AfxMessageBox(e.ErrorMessage()); //打印出错信息
       return false;
   }

   csErrorInfo.Format("创建数据库连接实例成功\r\n");
   OutputText(1,csErrorInfo,RGB(1,0,0));
   //m_pConnection->ConnectionString="File Name=LinkDatabase.udl";
   pConnection->ConnectionTimeout=5;//等待连接的时间为5s
   hr=pConnection->Open((_bstr_t)("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+m_csTestReortFile),"","",ADONameSpace::adConnectUnspecified);//m_csTestReortFile是要打开的数据库文件绝对目录

        if(FAILED(hr))
       {
            csErrorInfo.Format("打开文件 \"%s\"  失败\r\n",csFilePath);
            OutputText(1,csErrorInfo,RGB(255,0,0));
            return false;
       }
  }
  hr = pRecordset.CreateInstance(__uuidof(ADONameSpace::Recordset));
  pRecordset->Open("SELECT * FROM CaseTable",pConnection.GetInterfacePtr (),ADONameSpace::adOpenDynamic,  \

ADONameSpace::adLockOptimistic,ADONameSpace::adCmdText);//CaseTable是ACCESS数据库中的一个表格
  while(VARIANT_FALSE == pRecordset->adoEOF)
  {
   CString csResult;
   CString csCaseName;
   _variant_t vFieldValue;
   vFieldValue = pRecordset->GetCollect("LastResult");//获取LastResult列对应的值
   csResult = (char*)_bstr_t(vFieldValue);
   vFieldValue = pRecordset->GetCollect("CaseName");
   csCaseName = (char*)_bstr_t(vFieldValue);
   if (csCaseName == m_csTestUnitText)
   {
    bIsFind = TRUE;
    if ("RPT_BLOCK" == csResult)
    {
     eGetResultError = GET_RESULT_BLOCK;
     break;
    }
    else if ("RPT_NG" == csResult )
    { 
     eGetResultError = GET_RESULT_NG;
     break;
    }
    else if ("RPT_OK" == csResult )
    { 
     eGetResultError = GET_RESULT_OK;
     break;
    }
   }
   pRecordset->MoveNext();                           //移到CaseTable中的下一行
  }
  if (FALSE == bIsFind)
  {
   eGetResultError = GET_RESULT_NOTFIND;
  }
   
 }
 catch(_com_error e)
 {
  eGetResultError = GET_RESULT_OTHER;
  return FALSE;
 }
 return TRUE;
}

代码在win7 32位+VC6.0中运行毫无问题,但是拿到XP上就出问题了

hr=pConnection.CreateInstance("ADODB.Connection");词句出错提示不支持此接口;

开始怀疑是xp上的msado15.dll文件损坏,在网上找了点方法验证了下:

1.在C:\Program Files\Common Files\System\ado下找到msado15.dll

在命令行输入命令: regsvr32 C:\Program Files\Common Files\System\ado\msado15.dll  (注意命令行里面不支持空格,所以最好还是按下面方法进行)
回车后,注册该ado模块(如果注册失败,可以将当前路径先到
C:\Program Files\Common Files\System\ado目录再进行注册)
   运用后能正常。
2.如果上述方式已然不行,那说本台电脑的这个文件可能有问题,
可以去找一台没有问题的电脑,把这个文件拷贝过来,
然后操作1的步骤即可解决!

经过上面步骤验证msado15.dll没有问题,后来又查看win7上的该文件大小比XP上的翻了倍,所以开始怀疑是版本不匹配,

用OLE View->Type Libraries 查看Microsoft ActiveX Data Objects *.* Library 版本从2.0到6.1的都有,

 

我头文件里恰好是引用的"C:\program files\common files\system\ado\msado15.dll" 这个文件,所以我引用的是6.1版本,同样的方法在xp上查看只有2.8版本,再到WIN7下查看2.8版本

 

再将我的头文件改为

#import "C:\program files\common files\system\ado\msado28.tlb" rename_namespace("ADONameSpace") rename("EOF","adoEOF")

再次编译到XP上运行,问题解决;