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是其中一种源类型