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
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/223307
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!