失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 多线程访问数据库ADO

多线程访问数据库ADO

时间:2021-07-20 10:22:12

相关推荐

多线程访问数据库ADO

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")\2rename("DataTypeEnum","adoDataTypeEnum") \3rename("FieldAttributeEnum", "adoFielAttributeEnum") rename("EditModeEnum", "adoEditModeEnum") \4rename("LockTypeEnum", "adoLockTypeEnum") rename("RecordStatusEnum", "adoRecordStatusEnum") \5rename("ParameterDirectionEnum", "adoParameterDirectionEnum")

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

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

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

1 void CMThreadDlg::OnBnClickedBtnLoad() 2 { 3//启动一个线程来加载 4if (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 {12CMThreadDlg* pThis = (CMThreadDlg*)param1;13pThis->LoadUsers();14 15return 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; 9pConn.CreateInstance(__uuidof(Connection));//uuid10 11//数据源12CString strDSN = _T("Provider=Microsoft.jet.OLEDB.4.0;Data Source=demo.mdb");13pConn->Open((_bstr_t)strDSN, "", "", -1);//打开到数据库的连接14 15//创建记录集的指针实例16_RecordsetPtr pRs;17pRs.CreateInstance(__uuidof(Recordset));18 19CString strSql = _T("select * from users");//users,SQL20 21//打开记录集22pRs->Open((_bstr_t)strSql, (IDispatch*)pConn, adOpenDynamic, adLockReadOnly, adCmdText);23 24_variant_t var;25_bstr_t str;26CString strValue;27USES_CONVERSION;//带了些CHAR转UNICODE函数,比如下面的A2W28int iIndex = 0;29while (!pRs->GetadoEOF())30{31 var = pRs->GetCollect("ID");32 strValue.Format(_T("%d"), var.intVal);33 34 //把读出来的数据插入list35 m_listUsers.InsertItem(iIndex, strValue);36 37 var = pRs->GetCollect("UName");38 strValue.Format(_T("%s"), A2W((_bstr_t)var.bstrVal)); //A2W 把char 字符串转化为Unicode39 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是其中一种源类型

如果觉得《多线程访问数据库ADO》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。