ADO(ActiveX Data Object的简称)是Microsoft为最新和最强大的数据访问范例OLE DB而设计的,是一个便于使用的应用程序层接口。ADO通过OLE DB提供访问和操作数据库服务器中的数据。ADO不仅可以访问关系型数据库,还可以访问非关系型数据库。同时由于OLE DB是基于COM接口的技术,使用这种技术可以直接对数据库的驱动程序进行访问,从而大大提供了访问速度。与众多的数据库编程接口比较,ADO具有易于使用、速度快、内存支出少和磁盘遗迹小等优点。 但由于Microsoft并没有提供有关ADO的类,更不幸的是微软所提供的ADO文档几乎没有关于Visual C++的内容,这使得Visual C++程序开发人员要想利用ADO访问数据库相对比较麻烦。然而这又是每个Visual C++程序员不可回避的问题。解决这个问题的比较可行的办法就是自己编写这个类。本文将介绍如何具体编写自己的ADO类。 (1) 在使用ADO前必须使用#import引入ADO库文件,其中ADO库文件的路径视实际情况而定,同时为了避免常数冲突,通常将常数EOF改名为adoEOF。
#import "c:/program files/commonfiles/system/ado/msado15.dll" no_namespace rename ("EOF","adoEOF") |
(2) 在使用ADO之前还必须初始化OLE库。Visual C++ .net已经在CWinApp::InitInstance()中对OLE库进行了初始化。但是如果使用的Visual C++ 6.0,则必须初始化OLE库。
if (!AfxOleInit()) { AfxMessageBox(“初始化OLE库失败”); } |
(3) ADO库包含三个智能指针:_ConnectionPtr、_CommandPtr和_RecordsetPtr。_ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句。_CommandPtr返回一个记录集,它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。_RecordsetPtr是一个记录集对象,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。创建Connection对象和Recordset对象方法如下:
_ConnectionPtr m_pConnection; // 连接接口 _RecordsetPtr m_pRecordset; // 记录集指针 HRESULT hr; hr = m_pConnection.CreateInstance("ADODB.Connection"); if (!SUCCEEDED(hr)) { AfxMessageBox("创建Connection对象失败"); } hr = m_pRecordset.CreateInstance("ADODB.Recordset"); if (!SUCCEEDED(hr)) { AfxMessageBox("创建Recordset对象失败"); } |
(4) 连接不同数据库。参数sConnection为连接属性设置标准。它随数据源类型的不同而变化。以下是其常见值: 1. 访问ODBC数据: "Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassword;" 2. 访问ACCESS 97数据库: "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=databaseName;User ID=userName;Password=userPassword;" 3. 访问ACCESS 2000数据库: "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;" 4. 访问MS SQL数据库: "Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;" 5. 访问ORACLE数据库: "Provider=MSDAORA.1;Data Source=serverName;User ID=userName;Password=userPassword;"
inline BOOL ConnectDB(CString sConnection) { try { m_pConnection->Open(_bstr_t(sConnection), "", "", adModeUnknown); } catch (_com_error e) { AfxMessageBox("连接数据库失败,错误信息:%s", e.ErrorMessage()); return FALSE; } return TRUE; } |
(5) 查询:
BOOL Query(CString SqlCommand) { try { m_pRecordset->Open((_bstr_t) SqlCommand, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); } catch (_com_error* e) { AfxMessageBox(e->ErrorMessage()); return FALSE; } return TRUE; } |
(6) 修改记录: _variant_t vNULL; CString SqlCommand = "UPDATE TableName SET …[ WHERE…]"; m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText); (7) 添加记录: _variant_t vNULL; CString SqlCommand = "INSERT INTO TableName (…) VALUES (…)[ WHERE…]"; m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText); (8) 删除记录: _variant_t vNULL; CString SqlCommand = "DELETE FROM TableName WHERE …"; m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText); (9) 统计。参数SqlCommand的形式如下: 1. 统计纪录数:SELECT COUNT(*) FROM TableName[ WHERE…] 2. 统计字段总和:SELECT SUM FieldName FROM TableName[ WHERE…] 3. 统计字段平均值:SELECT AVG FieldName FROM TableName[ WHERE…] 4. 统计字段最大值:SELECT MAX FieldName FROM TableName[ WHERE…] 5. 统计字段最小值:SELECT MIN FieldName FROM TableName[ WHERE…]
inline _variant_t Statistics(CString SqlCommand) { _variant_t vNULL; _RecordsetPtr pRecordset; pRecordset = m_pConnection->Execute((_bstr_t) SqlCommand, &vNULL, adCmdText); _variant_t vCount = pRecordset->GetCollect((_variant_t) (long) 0); pRecordset->Close(); Recordset.Release(); return vCount; } |
|