• ADO  (ActiveX Data Objects)
  • ADO有三个智能指针:_ConnectionPtr连接对象 、_RecordsetPtr记录集对象、_CommandPtr命令对象
  • 先创建SQL记录集,从记录集中提取数据;
  • step1:引入ADO类(在 StdAfx.h   中加入)
1 /*忽略ADO的警告*/
2 #pragma warning(disable: 4146)
3 #pragma warning(disable: 4244)
4
5 /*ADO需要导入的库*/
6 #import "C:\Program Files\Common Files\SYSTEM\ADO\msado15.dll" no_namespace rename("EOF","adoEOF")  //有些数据库可能安装在D盘,路径要自己修改

  • step2:初始化COM组件
  1. 在MFC中可以用AfxOleInit();
  2. 非MFC环境中用:
    CoInitialize(NULL);
    CoUnInitialize();
1 CTestAdoApp theApp;//创建COM组件,退出COM组件2 /////
3 //CTestAdoApp initialization
4
5 BOOL CTestAdoApp::InitInstance()6 {7 AfxEnableControlContainer();8     CoInitialize(NULL); //第二步 单线程方式创建COM组件
9 。。。10 }11 ...12 intCTestAdoApp::ExitInstance()13 {14     //TODO: Add your specialized code here and/or call the base class
15     CoUninitialize();//最后一步 ADO COM 释放
16     returnCWinApp::ExitInstance();17 }/
   if ( !AfxOleInit() ) {AfxMessageBox( " OLE fail! ");return false;}/

  • step3:初始化数据库连接
1     //
2     m_pConn.CreateInstance("ADODB.Connection");3     if(m_pConn==NULL)//CoInitialize£¨NULL£©Î´³õʼ»¯
4 {5         TRACE("初始化连接对象失败\n");6         returnFALSE;7 }8     HRESULT res=-1;9     //
10 CString m_strInEdit;11
12     GetPrivateProfileString("SQLLINK","ServerPZ","",m_strInEdit.GetBuffer(MAX_PATH),MAX_PATH,".\\config.ini");13 m_strInEdit.ReleaseBuffer();14     if (!m_strInEdit.IsEmpty())15 {16         int iLen =m_strInEdit.GetLength();17
18         for(int i=0;i<iLen;i++)19 {20             m_strInEdit.SetAt(i,m_strInEdit[i]-1);21 }22 m_strInEdit.MakeReverse();23 }24     //
25     try
26 {27 CString Sqlstr;28         //TRACE(m_strInEdit);
29         Sqlstr =m_strInEdit;30         res = m_pConn->Open((_bstr_t)Sqlstr,"","",0);//´ò¿ª
31         if(res==S_OK)//0
32 {33             TRACE("打开数据库成功!");34 }35         else
36 {37             TRACE("打开数据库失败!");38             returnFALSE;39 }40 }41     catch(_com_error e)42 {43 CString errormessage;44         errormessage.Format("错误信息:%s",e.ErrorMessage());45 AfxMessageBox(errormessage);46         ShellExecute(NULL,"open",".\\sqlLink.exe","config.ini",NULL,SW_SHOW);47         returnFALSE;48     }

  • 另附: ADO Recordset 对象中的updateBatch函数的使用方法

  1.设置 pRecord->CursorLocation = adUseClient;

  2.open方法中设置lockType 为adLockBatchOptimistic  

1 _RecordsetPtr pRecord;2     pRecord.CreateInstance("ADODB.Recordset");3
4     pRecord->CursorLocation =adUseClient;5
6 CString strSQL  ;7     strSQL.Append("SELECT * fROM emp");8
9     try
10 {11         pRecord->Open(_bstr_t(strSQL),pConnection.GetInterfacePtr(),adOpenStatic,adLockBatchOptimistic,adCmdText);12
13 CString strValue;14         while(!pRecord->AdoEOF)15 {16             strValue.Format("Test_%d",pRecord->AbsolutePosition);17             pRecord->PutCollect("name",_variant_t(strValue));18             pRecord->MoveNext();19 }20
21         pRecord->UpdateBatch(adAffectAll);22         pRecord->Close();23 }24     catch(_com_error &e)25 {26 OutputDebugString(e.Description());27     }  

----------------------------------------------------------------------------------------------------------------------------------------------------------------

用DirectShow到了枚举设备,放在程序开始出,没有任何输出结果,查代码发现用的:

HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum,  (void **) &p->pICreateDevEnum);
 返回值居然错误,才恍然大悟,原来是没有初始化COM组件。

加上:

CoInitializeEx(NULL,COINIT_MULTITHREADED|COINIT_SPEED_OVER_MEMORY);

一切正常:)

顺便查了下:

CoInitialize、CoInitializeEx都是windows的API,主要是告诉windows以什么方式为程序创建COM对象,原因是 程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。
      有哪些方式呢?单线程和多线程。
      CoInitialize 指明以单线程方式创建。
      CoInitializeEx可以指定COINIT_MULTITHREADED以多线程方式创建。
      创 建单线程方式的COM服务器时不用考虑串行化问题,多线程COM服务器就要考虑。
      在使用中,使用CoInitialize创建可使对 象直接与线程连接,得到最高的性能。创建多线程对象可以直接接收所有线程的调用,不必像单线程那样需要消息排队,但却需要COM创建线程间汇集代理,这样 访问效率不高。

注:新的应用程序应该调用CoInitializeEx而不是CoInitialize,一般是在 Dll 中使用 COM 才会需要使用的。

OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()区别

CoInitialize CoInitializeEx 是用来初始化COM运行环境的。
OleInitialize是初始化Ole的运行环境,Ole是在Com的基础上作的扩展,是ActiveX运行的基础,OleInitialize肯定会调用CoInitialize。

CoInitialize、CoInitializeEx都是windows的API,主要是告诉windows以什么方式为程序创建COM对象,原因是程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。
CoInitialize指明以单线程方式创建。
CoInitializeEx可以指定COINIT_MULTITHREADED以多线程方式创建。
创建单线程方式的COM服务器时不用考虑串行化问题,多线程COM服务器就要考虑。
CoInitialize并不装载com库,这个函数只是用来初始化当前线程使用什么样的套间。当使用这个函数以后,线程就和一个套间建立了对应关系。
线程的套间模式决定了该线程如何调用com对象,是否需要列集等
套间是com中用来解决并发调用冲突的很有效的办法
Before calling any COM functions, a thread needs to call CoInitialize to load the COM infrastructure (and to enter an apartment). Once a thread calls CoInitialize, the thread is free to call COM APIs.
CoInitializeEx provides the same functionality as CoInitialize and also provides a parameter to explicitly specify the thread's concurrency model. The current implementation of CoInitialize calls CoInitializeEx and specifies the concurrency model as single-thread apartment. Applications developed today should call CoInitializeEx rather than CoInitialize.
注:新的应用程序应该调用CoInitializeEx而不是CoInitialize,否则就会有必要在之后每个调用Com的线程中调用CoInitialize来初始化出每个线程自己的套间。

 
AfxOleInit实际上调用了OleInitialize,虽然它在内部也调用了CoInitializeEx,但它只能处理单线程,这是AfxOleInit和CoInitialize主要区别:   
OleInitialize   calls   CoInitializeEx   internally   to   initialize   the   COM   library   on   the   current   apartment.   Because   OLE   operations   are   not   thread-safe,  OleInitialize   specifies   the   concurrency   model   as   single-thread   apartment.     
Once   the   concurrency   model   for   an   apartment   is   set,   it   cannot   be  changed.   A   call   to   OleInitialize   on   an   apartment   that   was   previously  initialized   as   multithreaded   will   fail   and   return   RPC_E_CHANGED_MODE.

 
应用:
1. CoInitialize 仅仅初始化Com,支持多线程。也就是说如果多线程调用Com接口,必须在每个线程中都调用CoInitialize。
2. OleInitialize 初始化Com(其实也是调用CoInitializeEx),支持多线程。比CoInitialize多了一下内容:
A) Clipboard
B) Drag and drop
C) Object linking and embedding (OLE)
D) In-place activation
如果不需要这些,用CoInitialize就可以。
3. AfxOleInit是MFC对OleInitialize的封装。貌似不支持多线程,也就是说只能在主进程调用该函数,如果线程需要使用Com必须调用上面的两个来实现初始化。而且MSDN明确标明AfxOleInit不能在MFC的DLL中调用,否则也会造成初始化失败。
4.OleInitialize和OleUninitialize( )成对使用;CoInitialize和CoUninitialize成对使用;CoInitializeEx和CoUninitialize成对使用;AfxOleInit()由MFC自动释放。
 
VC++使用ADO访问ACCESS时,出现_RecordsetPtr Open卡或者_ConnectionPtr Excute卡或者_CommandPtr Excute一直卡住等莫名其妙的情况时,而语法又没有错误时,请确定初始化COM函数。
MFC程序建议使用AfxOleInit()。

转载于:https://www.cnblogs.com/it-duit/p/5828585.html

ADO ( 问数据库数据 的编程 接口)相关推荐

  1. 金仓数据库 KingbaseES 客户端编程接口指南 - JDBC(11. JDBC 示例说明)

    11. JDBC 示例说明 在所提供的用例中,使用的数据库信息为,用户名:system; 密码:manager; 数据库名:test; 端口号:54321 数据源示例 连接池示例 Statement ...

  2. 金仓数据库KingbaseES客户端编程接口指南-DCI(3. DCI 工程配置)

    3. DCI 工程配置¶ Windows 平台工程搭建(vs2008) Linux平台工程搭建 服务的配置方法与参数说明 多主机地址配置 3.1. Windows 平台工程搭建(VS2008) 3.2 ...

  3. 金仓数据库KingbaseES客户端编程接口指南-ODBC(6. KingbaseES ODBC 的扩展属性)

    6. KingbaseES ODBC 的扩展属性 KingbaseES ODBC 数据源的高级选项 Linux环境下SQLDriverConnect()连接串中KingbaseES ODBC的扩展连接 ...

  4. 金仓数据库 KingbaseES 客户端编程接口指南 - ODBC 驱动使用

    7. KingabseES ODBC 驱动使用 Windows 中 ODBC 驱动使用步骤(VS2013) Linux 下调用 ODBC 驱动步骤 7.1. Windows 中 ODBC 驱动使用步骤 ...

  5. vb mysql ado_VB中的ADO数据对象编程详解

    ADO是ActiveX Data Objects 的缩写,是一项新的数据库的存取技术 那天听到一位同学说他的女朋友是学新闻的可也学会了数据库,可学计算机的自己却还是不会,总觉得有点汗颜.在各网站的论坛 ...

  6. Windows数据库编程接口简介

    数据库是计算机中一种专门管理数据资源的系统,目前几乎所有软件都需要与数据库打交道(包括操作系统,比如Windows上的注册表其实也是一种数据库),有些软件更是以数据库为核心因此掌握数据库系统的使用方法 ...

  7. 在Visual C++中用ADO进行数据库编程(上)

    在Visual C++中用ADO进行数据库编程(上)         1. 生成应用程序框架并初始化OLE/COM库环境 创建一个标准的MFC AppWizard(exe)应用程序,然后在使用ADO数 ...

  8. 数据库访问抽象层系列-1(介绍数据库编程接口及数据库访问抽象层概念)

    摘要 本人最近完成了一个封装数据库访问抽象层的项目.我们开发的数据库访问抽象层作为分布式集群基础平台的一个组件.可以支持不同数据库编程接口(OCI.mysql.ODBC.pgsql)等.本系列博客主要 ...

  9. 利用 Node.js 实现 SAP Hana 数据库编程接口

    为什么80%的码农都做不了架构师?>>>    自 SAP HANA SP 11 之后,可以使用 Node.js 作为 Hana 的编程接口.SAP 将 Application se ...

  10. 在Visual C++中用ADO进行数据库编程(中)

    在Visual C++中用ADO进行数据库编程(中)         4.执行SQL命令并取得结果记录集 为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr ...

最新文章

  1. Hibernate修改命名策略
  2. 在Eclipse中使用OpenCV Java
  3. Android 控件
  4. 安全云盘项目(二):2.1 基于libevent的C++线程池
  5. python中的scipy基础知识_Python机器学习(五十二)SciPy 基础功能
  6. c#的内存管理(托管及未托管对象管理)
  7. python传奇自动打怪脚本_GOM引擎内挂自动挂机打怪脚本实例
  8. 3小时GIS入门教程(二)GIS数据格式、坐标系
  9. 混合效应模型和广义线性模型计算R方的函数sem.model.fits
  10. easyexcel表头和内容居中
  11. 测试之道——阿里巴巴八年测试专家倾情奉献
  12. QGraphicsItem基本图元的添加以及闪烁图元和移动图元的添加
  13. XML 测试用例分类Variants参数
  14. 基于Origin的一种SCI论文中多图合并的简单方法----核心合并图表
  15. Flash 与数学:星形线
  16. TI AM5728 DSP+ARM多核通信开发例程
  17. 偏移变色lisp_渐进式 多重偏移,见图片效果 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - 偏移 - Powered by Discuz!...
  18. SSH + Lucene + 分页 + 排序 + 高亮 模拟简略新闻网站搜索引擎
  19. workbench应力应变曲线_ANSYS WorkBench 结构分析中的几种材料模型与对应的分析类型...
  20. A canvas fillText and strokeText example

热门文章

  1. FisherYates费雪耶兹随机置乱算法
  2. 4.3 调度核心组件
  3. SQL Server中删除重复数据
  4. [php基础]Mysql日期函数:日期时间格式转换函数详解
  5. 生活随笔:你会狗眼看人低吗?
  6. Portlet开发指南第三章
  7. GridView的DataKeyNames属性(转)
  8. python机器学习实战(四)
  9. Java练习 SDUT-2561_九九乘法表
  10. 2017-12-28 Linux学习笔记