您的位置:首页 > 数据库

vc6.0 ADO访问数据库

2013-12-05 20:09 417 查看
最近做一个蛋疼的项目会用到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上运行,问题解决;

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: