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是其中一种源类型
posted on 2015-10-19 13:28  俗剑仙·情如梦  阅读(805)  评论(0编辑  收藏  举报