最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下。

  1. 环境
    1. win7 x86系统;

    2. VS2012编译器;

    3. Office2010;

    4. Access2000~Access2003连接串建立数据库连接。

  2. 关键数据库操作代码
    1. BOOL CAccessDatabase::Query(const CString strSQLString, UINT nFieldNumber, vector<vector<_variant_t> >& vecvecVariant)
      {
      _variant_t Variant;
      vector<_variant_t> vecVariant; EnterCriticalSection(&m_cs); _RecordsetPtr pRecordset = NULL;
      HRESULT hr = S_FALSE;
      try
      {
      hr = pRecordset.CreateInstance(_T("ADODB.Recordset"));
      if (SUCCEEDED(hr))
      {
      hr = pRecordset->Open(strSQLString.AllocSysString(), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
      if (SUCCEEDED(hr))
      {
      if (!pRecordset->adoEOF)
      {
      hr = pRecordset->MoveFirst();
      if (SUCCEEDED(hr))
      {
      while (!(pRecordset->adoEOF))
      {
      vecVariant.clear();
      for (UINT i = ; i < nFieldNumber; ++i)
      {
      ZeroMemory(&Variant, sizeof(Variant));
      Variant = pRecordset->GetCollect(_variant_t((long)i));
      vecVariant.push_back(Variant);
      }
      vecvecVariant.push_back(vecVariant); hr = pRecordset->MoveNext();
      }
      }
      else
      {
      m_pLogFile->WriteLog(GetLastError(), _T("移动记录集指针到首部发生错误")); if (pRecordset->GetState() != adStateClosed)
      {
      hr = pRecordset->Close();
      if (FAILED(hr))
      {
      m_pLogFile->WriteLog(GetLastError(), _T("关闭记录集失败"));
      }
      else
      {
      m_pLogFile->WriteLog(GetLastError(), _T("记录集已关闭"));
      }
      } if (pRecordset != NULL)
      {
      pRecordset.Release();
      pRecordset = NULL;
      }
      LeaveCriticalSection(&m_cs);
      return FALSE;
      }
      }
      else
      {
      m_pLogFile->WriteLog(GetLastError(), _T("查询的记录集为空"));
      }
      }
      else
      {
      m_pLogFile->WriteLog(GetLastError(), _T("打开记录集失败")); if (pRecordset != NULL)
      {
      pRecordset.Release();
      pRecordset = NULL;
      }
      LeaveCriticalSection(&m_cs);
      return FALSE;
      }
      }
      else
      {
      m_pLogFile->WriteLog(GetLastError(), _T("初始化记录集失败")); pRecordset = NULL;
      LeaveCriticalSection(&m_cs);
      return FALSE;
      }
      }
      catch (_com_error e)
      {
      m_pLogFile->WriteLog(e.ErrorMessage());
      AfxMessageBox(e.ErrorMessage());
      LeaveCriticalSection(&m_cs);
      return FALSE;
      } if (pRecordset->GetState() != adStateClosed)
      {
      try
      {
      hr = pRecordset->Close();
      if (FAILED(hr))
      {
      m_pLogFile->WriteLog(GetLastError(), _T("关闭记录集失败"));
      }
      else
      {
      m_pLogFile->WriteLog(GetLastError(), _T("记录集已关闭"));
      }
      }
      catch (_com_error err)
      {
      m_pLogFile->WriteLog(err.ErrorMessage());
      AfxMessageBox(err.ErrorMessage());
      }
      } if (pRecordset != NULL)
      {
      pRecordset.Release();
      pRecordset = NULL;
      } LeaveCriticalSection(&m_cs); return TRUE;
      }
  3. 数据库调用代码
    1.     if (!Database.Query(_T("select ZoneName from Zone"), , vecvecZone))
      {
      LogFile.WriteLog(GetLastError(), _T("从数据库中获取客户端名称失败"));
      AfxMessageBox(_T("从数据库中获取客户端名称失败"));
      return;
      }
  4. 错误问题
    1. 程序在Query里面产生了异常。在调用pRecordset->Open(...)的时候产生了异常,异常错误信息是“未指定的错误”;
    2. 将调用的Sql语句放到Access数据库中可以正确执行。
  5. 解决办法
    1. 将数据库的表名"Zone"修改为"MyZone"等其它名称即可。
  6. 总结
    1. 在编程访问Access数据库时表名不能为"Zone"。
  7. 代码上传
    1. 下载连接:http://pan.baidu.com/s/1mgFlOqk

ADO访问Access数据库错误解决心得随笔的更多相关文章

  1. x64 win64编译环境下ADO链接Access数据库的问题解决

    原文链接地址:https://blog.csdn.net/HW140701/article/details/71077579 Win32编译环境下,用ADO数据库连接Access数据库一般都不会报错, ...

  2. ADO访问Oracle数据库,连接异常(Unknown error 0x800a0e7a)

    ADO访问Oracle数据库,连接异常(Unknown error 0x800a0e7a) 代码如下:执行Open过程中出现异常,信息为Unknown error 0x800a0e7a  C++ Co ...

  3. C#.NET ORM 如何访问 Access 数据库 [FreeSql]

    最近很多 .net QQ 群无故被封停,特别是 wpf 群几乎全军覆没.依乐祝的 .net6交流群,晓晨的 .net跨平台交流群,导致很多码友流离失所无家可归,借此机会使用一次召唤术,有需要的请加群: ...

  4. [转载]Unity3D 访问Access数据库

    在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来.写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是在他使用的过 ...

  5. Excel中使用VBA访问Access数据库

    VBA访问Access数据库 1. 通用自动化语言VBA VBA(Visual Basic For Application)是一种通用自动化语言,它可以使Excel中的常用操作自动化,还可以创建自定义 ...

  6. Unity访问Access数据库

    首先,准备工作: 创建一个Access 数据库,命名AccessTest.accdb,添加一些数据用于测试 准备System.Data.dll与System.EnterpriseServices.dl ...

  7. 如何使用.net访问Access数据库 (转)

    前言:今天整理程序,看到之前写的一个Demo,也不知道是从哪里参考的了,写到这里,留作备用吧. 使用.net访问Access数据库:1.BL层:新增一个DataAccess类. Code].Defau ...

  8. php连接Access数据库错误及解决方法

    <?php $connstr="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("data.m ...

  9. MFC通过ADO操作Access数据库

    我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...

随机推荐

  1. ibatis插入数据后返回自增长的主键

    insert into testTable ( activity_id,activity_title values ( #{activityId,jdbcType=INTEGER}, #{activi ...

  2. Java多线程之join

    1.join方法只有在继承了Thread类的线程中才有. 2.线程必须要start() 后再join才能起作用. 将另外一个线程join到当前线程,则需要等到join进来的线程执行完才会继续执行当前线 ...

  3. [ActionScript 3.0] AS3 拖拽混动效果之一

    package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; impor ...

  4. aria-expanded,aria-hidden到底做什么用?

    aria-expanded表示展开状态.默认为undefined, 表示当前展开状态未知.其它可选值:true表示元素是展开的:false表示元素不是展开的. aria-hidden字符串.可选值为t ...

  5. jQuery的jsonp跨域是这么回事.

    实现跨域请求的有iframe,img,script中的src属性.那么jquery是如何解决跨域请求的呢? 一:项目jsonp2中有个app.js文件,代码如下: function app(json) ...

  6. flask-sqlalchemy分表解决方案

    转自:http://ju.outofmemory.cn/entry/61448 关键词: flask-sqlalchemy, sqlalchemy, 分表,分库 大型系统.海量数据肯定涉及到分库分表这 ...

  7. ASP.Net软件工程师基础(四)

    1.接口 (1)接口是一种规范.协议,定义了一组具有各种功能的方法(属性.索引器本质是方法). (2)接口存在的意义:多态.多态的意义:程序可扩展性. (3)接口解决了类的多继承的问题. (4)接口解 ...

  8. 玩转JS插件系列

    说明:本系列文章只是通过学习JS插件源码来巩固自己的JS知识,不涉及任何商业目的,如有侵犯版权请尽快告知 一.UI 背景 对话框和灯箱 筛选及排序 反馈 弹出层 悬停 布局 图表 加载 圆边 滚动 标 ...

  9. html——SVG

    SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 SVG 图像在放大或改变尺寸的情况下其图形 ...

  10. Cocos2dx3.0过渡篇 各种遍历与范围for语句的使用【转】

    1.CCArray的遍历看到这里,有些人又按耐不住的要举起西瓜刀了:你不是说3.0beta后已经没有CCArray这货了吗?现在又拿出来作甚?其实我也很无辜,CCArray确实是没了,但在某个不为人知 ...