vc6.0 ADO访问数据库

原创 2013年12月05日 20:09:20

最近做一个蛋疼的项目会用到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上运行,问题解决;

 

VC++ ado连接数据库(可以在VC6.0使用,以access数据库为实例)(1)

很多新手对数据库连接迷茫了,怎么我写的就
  • bojie5744
  • bojie5744
  • 2014年06月11日 16:50
  • 1574

vc6.0下c++连接mysql数据库

一   vc6.0连接mysql数据库 (1)打开VC6.0 工具栏Tools菜单下的Options选项,在Directories的标签页中右边的“Show directories for:”下拉列...
  • lyf08600231
  • lyf08600231
  • 2013年03月11日 21:14
  • 1775

VC用ADO访问数据库

VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法,很经典,也很实用,很值得一看。  正文  一、ADO概述  ADO是Microsoft为最新和最强大的数据访问...
  • worldy
  • worldy
  • 2013年09月21日 11:18
  • 4529

VC++6.0_中用_ADO_访问_Access_数据库

  • 2014年05月24日 22:34
  • 52KB
  • 下载

VC6.0中使用ADO操作Access数据库

这个版本比原先发的要更加全面一些,以下的代码均经过验证。准备:(1)、引入ADO类#import "c:/program files/common files/system/ado/msado15.d...
  • cheliu
  • cheliu
  • 2011年05月24日 17:16
  • 460

VC++6.0 中用 ADO 存取 Access 数据库的一点总结

事情是这样的,我的女朋友想要对日常生活的开销做个记录,以便控制花钱的尺度。看她每日用笔头记录,然后和我抢电脑用,曰:要用附件中的计算器统计结果,每每如此 ,不胜其烦,就给她做了一个个人家庭记帐系统,一...
  • ccx_john
  • ccx_john
  • 2013年09月23日 13:49
  • 770

VC++6.0 使用ADO动态链接SQL Server 2005数据库

ADO(ActiveX Data Objiects)是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层,ADO是建立在OLE DB底层技术之上的搞基编程接口。...
  • xushengliang12
  • xushengliang12
  • 2017年05月13日 18:18
  • 121

VC6.0利用ado组件 向oracle数据库插入图片

oracle 数据库中用Bolb保存图片 一、数据库表设置 1、创建表 create table epoliceadmin.ep_image(image_id number(10) not nu...
  • jijiyuyisheng
  • jijiyuyisheng
  • 2012年08月16日 15:28
  • 607

VC6.0 利用ADO连接Sqlserver2005数据库方法

VC6.0 利用ADO连接Sqlserver2005数据库方法创建一个基于对话框的工程。 1.在stdafx.h中添加ADO的引用//步骤1 添加ado dll的引用 #import "C:\Pro...
  • vcpro126
  • vcpro126
  • 2012年12月04日 22:06
  • 1178

VC++6.0使用ADO开发ACCESS数据库静态库脱机2.0.rar

  • 2015年12月16日 16:23
  • 15.48MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc6.0 ADO访问数据库
举报原因:
原因补充:

(最多只允许输入30个字)