ADO(ActiveX Data Objects)是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLEDB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只关心到数据库的连接。

ADO操作数据库的三大智能指针:(ODBC没有ADO效率高)

_ConnectionPtr//对数据库连接

_CmmandPtr//执行sql语句

_RecordsetPtr//可以获取表的记录集、游标

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

对控件添加成员变量快捷方式:CTRL+鼠标双击

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

1、首先在工程stdafx.h添加引用

1 #import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")\
2     rename("DataTypeEnum","adoDataTypeEnum") \
3     rename("FieldAttributeEnum", "adoFielAttributeEnum") rename("EditModeEnum", "adoEditModeEnum") \
4     rename("LockTypeEnum", "adoLockTypeEnum") rename("RecordStatusEnum", "adoRecordStatusEnum") \
5     rename("ParameterDirectionEnum", "adoParameterDirectionEnum")

以上代码中的 “\“ 只是表示换行,没别的意思,rename那是因为有些宏可能和别的地方会有重名,所以重新命名。

2、创建读取数据库数据用的线程。

1 HANDLE m_hThread;//线程句柄,句柄定义完要在cpp文件的构造函数内初始化。
2 static UINT ThreadProc(void* param1, void* param2);//线程函数

 1 void CMThreadDlg::OnBnClickedBtnLoad()
 2 {
 3     //启动一个线程来加载
 4     if (m_hThread == NULL)
 5     {//线程是否已运行
 6         m_hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CMThreadDlg::ThreadProc, this, 0, NULL);
 7     }
 8 }
 9
10 UINT CMThreadDlg::ThreadProc(void* param1, void* param2)
11 {
12     CMThreadDlg* pThis = (CMThreadDlg*)param1;
13     pThis->LoadUsers();
14
15     return 0;
16 }

static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa,//线程内核对象的安全属性,一般传入NULL表示使用默认设置。DWORD dwStackSize,//线程栈空间大小,传入0表示默认(1MB)。LPTHREAD_START_ROUTINE pfnThreadProc,//新线程函数地址,多个线程可以使用同一函数地址。void* pvParam,//传给线程函数的参数DWORD dwCreationFlags,//参数指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,自到调用ResumeThread()DWORD* pdwThreadId //返回线程的ID号,传入NULL表示不需要返回该线程ID号。
) throw( );
//创建成功返回新线程句柄,失败返回NULL。

3、读取数据库和显示数据

 1 void CMThreadDlg::LoadUsers()
 2 {
 3     //加载用户数据
 4
 5     ::CoInitialize(NULL);//每个操作数据库的线程都要加这个啊,初始化COM组建,不用线程的话mfc主线程自己已经有做了初始化,
 6
 7     //创建到数据库的连接
 8     _ConnectionPtr  pConn;
 9     pConn.CreateInstance(__uuidof(Connection));//uuid
10
11     //数据源
12     CString strDSN = _T("Provider=Microsoft.jet.OLEDB.4.0;Data Source=demo.mdb");
13     pConn->Open((_bstr_t)strDSN, "", "", -1);//打开到数据库的连接
14
15     //创建记录集的指针实例
16     _RecordsetPtr pRs;
17     pRs.CreateInstance(__uuidof(Recordset));
18
19     CString strSql = _T("select * from users");//users,SQL
20
21     //打开记录集
22     pRs->Open((_bstr_t)strSql, (IDispatch*)pConn, adOpenDynamic, adLockReadOnly, adCmdText);
23
24     _variant_t var;
25     _bstr_t str;
26     CString strValue;
27     USES_CONVERSION;//带了些CHAR转UNICODE函数,比如下面的A2W
28     int iIndex = 0;
29     while (!pRs->GetadoEOF())
30     {
31         var = pRs->GetCollect("ID");
32         strValue.Format(_T("%d"), var.intVal);
33
34         //把读出来的数据插入list
35         m_listUsers.InsertItem(iIndex, strValue);
36
37         var = pRs->GetCollect("UName");
38         strValue.Format(_T("%s"), A2W((_bstr_t)var.bstrVal)); //A2W 把char 字符串转化为Unicode
39         m_listUsers.SetItemText(iIndex, 1, strValue);
40
41         var = pRs->GetCollect("Tel");
42         strValue.Format(_T("%s"), A2W((_bstr_t)var.bstrVal));
43         m_listUsers.SetItemText(iIndex, 2, strValue);
44
45         var = pRs->GetCollect("Address");
46         strValue.Format(_T("%s"), A2W((_bstr_t)var.bstrVal));
47         m_listUsers.SetItemText(iIndex, 3, strValue);
48
49         //把记录集往下移一条
50         pRs->MoveNext();
51         iIndex++;
52     }
53
54     ::CoUninitialize();
55 }

_variant_t和_bstr_t这两个类分别封装并管理VARIANT和BSTR这两种数据类型,
VARIANT和BSTR这两种类型是COM中使用的数据类型。
为了C++中的变量应用到ADO编程中,只能进行数据类型的转换。
通过_variant_t和_bstr_t这两个类,就可以方便的把C++类型变量转换成COM中的变量了
ADO是基于COM接口x实现的。因此它的使用对于正在进行的 COM编程的程序员而言更简单
COM是使用其特定的数据类型,_bstr_t是其中一种源类型

转载于:https://www.cnblogs.com/djetcgw/p/4891646.html

多线程访问数据库ADO相关推荐

  1. qt多线程适用mysql_qt 多线程访问数据库问题

    Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的 假设有如下 ...

  2. mysql 多线程_数据库选型之MySQL(多线程并发)

    本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于高频中心库task部分占用机器较多,为节省成本,调研数据库或缓存.在 ...

  3. 基于C API的MySQL数据库多线程访问方法

    说明:如何生成线程式客户端 客户端库总是线程安全的.最大的问题在于从套接字读取的net.c中的子程序并不是中断安全的.或许你可能希望用自己的告警中断对服务器的长时间读取,以此来解决问题.如果为SIGP ...

  4. sqlite数据库的多线程访问问题

    关于sqlite数据库的多线程访问问题,下面的链接提供了一个详细的说明: http://kagii.com/post/6828016869/android-sqlite-locking

  5. VC用ADO访问数据库全攻略  作者 相生昌

    VC用ADO访问数据库全攻略 作者 相生昌 <script language=VBScript> document.title="VC用ADO访问数据库全攻略 "&am ...

  6. 使用ADO或ADO控件访问数据库

    目录: 1.数据库的基础知识以及创建Access数据库 2.数据库的接口 3.使用ADO或ADO控件访问数据库 上篇文章,为大家讲解了数据库的接口,大家对ADO也有了较为基础的了解,这篇文章主要解决大 ...

  7. python sqlite3 多线程_在python中多线程访问sqlite3数据库

    Python标准库中有sqlite3模块,可见对此数据库的认可.不过,此模块在使用时也有限制,同一个数据库连接,不能在不同线程中共享. import threading import sqlite3 ...

  8. VC用ADO访问数据库全攻略

    一.ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口.ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据 ...

  9. 一致的数据访问技术ADO/OLE DB

    Microsoft新近推出的UDA(Universal Data Access,一致数据访 问技术)为关系型或非关系型数据访问提供了一致的访问接口,为企业 级Intranet应用多层软件结构提供了数据 ...

  10. 关于安卓通过webservice访问数据库问题

    ============问题描述============ 访问数据库时,手机能增删数据库的数据就是显示不了数据库的里的数据不知道是哪里的问题,用的HTTP 这是我webservice中的产看所有信息的 ...

最新文章

  1. 使用 .NET 框架轻松开发完美的 Web 窗体控件
  2. 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)
  3. 库的标准实现和私有实现的选择
  4. SAP CRM里Interaction Object是个什么东东
  5. 软件测试笔试Linux题,linux基础面试题
  6. java server 参数_java serversocket参数详解
  7. 大数据分析的意义在哪
  8. java搜索引擎: lucene学习笔记 3
  9. linux系统下已分好区的磁盘如何删除,linux下如何删除磁盘分区
  10. 微信公众号数据2019_年度大榜!2019全国县级媒体公众号百强数据看过来
  11. 点滴生活感悟(更新至29)
  12. ABAP Cross-client 和 Client-specific 的区别
  13. XUPT新生赛题目回顾(2)
  14. 区块链、NFT 与元宇宙中的稀缺性技术
  15. 习题6-5巡逻机器人 UVa 1600 bfs
  16. 动态网站基本上都是有后台的,静态的网站就是纯HTML的网站的,这样的网站是没有后台的
  17. python中print横向打印
  18. stm32学习笔记-中断系统
  19. [转帖]谨以此文献给才毕业一两年的朋友 (选自同事信件)
  20. 页面上.woff加载不出来解决办法

热门文章

  1. Nodejs gRPC client 使用typescript
  2. 游戏服务器之生成Dump文件
  3. DBCP与C3P0连接池组件
  4. nexus和maven
  5. pythonmkdir语法错误_转--python使用mkdir函数出现错误WindowsError:[Error3]
  6. and or not 优先级_我的家乡|我的侠客公测成就奖励大全 成就解锁优先级排名
  7. Go语言:基础数据类型
  8. Gerserver:发布shp文件
  9. Java使用apache commons连接ftp修改ftp文件名失败原因
  10. SpringBoot 统一异常处理最佳实践 -- 拓展篇