一ADO简介 ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口是建立在OLE DB之上的高层数据库访问技术请不必为此担心即使你对OLE DBCOM不了解也能轻松对付ADO因为它非常简单易用甚至比你以往所接触的ODBC APIDAORDO都要容易使用并不失灵活性本文将详细地介绍在VC下如何使用ADO来进行数据库应用程序开发并给出示例代码 本文示例代码 二基本流程 万事开头难任何一种新技术对于初学者来说最重要的还是入门掌握其要点让我们来看看ADO数据库开发的基本流程吧! ()初始化COM库引入ADO库定义文件 ()用Connection对象连接数据库 ()利用建立好的连接通过ConnectionCommand对象执行SQL命令或利用Recordset对象取得结果记录集进行查询处理 ()使用完毕后关闭连接释放对象 准备工作: 为了大家都能测试本文提供的例子我们采用Access数据库您也可以直接在我们提供的示例代码中找到这个testmdb 下面我们将详细介绍上述步骤并给出相关代码 【】COM库的初始化 我们可以使用AfxOleInit()来初始化COM库这项工作通常在CWinApp::InitInstance()的重载函数中完成请看如下代码: BOOL CADOTestApp::InitInstance() { AfxOleInit();
【】用#import指令引入ADO类型库 我们在stdafxh中加入如下语句(stdafxh这个文件哪里可以找到?你可以在FileView中的Header Files里找到) #import c:\program files\common files\system\ado\msadodll no_namespace rename(EOFadoEOF) 这一语句有何作用呢?其最终作用同我们熟悉的#include类似编译的时候系统会为我们生成msadotlhadotli两个C++头文件来定义ADO库 几点说明: () 您的环境中msadodll不一定在这个目录下请按实际情况修改 () 在编译的时候肯能会出现如下警告对此微软在MSDN中作了说明并建议我们不要理会这个警告 msadotlh() : warning C: unary minus operator applied to unsigned type result still unsigned 【】创建Connection对象并连接数据库 首先我们需要添加一个指向Connection对象的指针: _ConnectionPtr m_pConnection; 下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉 BOOL CADOTestDlg::OnInitDialog() { CDialog::OnInitDialog(); HRESULT hr; try { hr = m_pConnectionCreateInstance(ADODBConnection);///创建Connection对象 if(SUCCEEDED(hr)) { hr = m_pConnection>Open(Provider=MicrosoftJetOLEDB;Data Source=testmdbadModeUnknown);///连接数据库 ///上面一句中连接字串中的Provider是针对ACCESS环境的对于ACCESS需要改为:Provider=MicrosoftJetOLEDB;} } catch(_com_error e)///捕捉异常 { CString errormessage; errormessageFormat(连接数据库失败!\r\n错误信息:%seErrorMessage()); AfxMessageBox(errormessage);///显示错误信息 } 在这段代码中我们是通过Connection对象的Open方法来进行连接数据库的下面是该方法的原型 HRESULT Connection::Open ( _bstr_t ConnectionString _bstr_t UserID _bstr_t Password long Options ) ConnectionString为连接字串UserID是用户名 Password是登陆密码Options是连接选项用于指定Connection对象对数据的更新许可权 Options可以是如下几个常量: adModeUnknown:缺省当前的许可权未设置 adModeRead:只读 adModeWrite:只写 adModeReadWrite:可以读写 adModeShareDenyRead:阻止其它Connection对象以读权限打开连接 adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接 adModeShareExclusive:阻止其它Connection对象打开连接 adModeShareDenyNone:允许其它程序或对象以任何权限建立连接 我们给出一些常用的连接方式供大家参考: ()通过JET数据库引擎对ACCESS数据库的连接 m_pConnection>Open(Provider=MicrosoftJetOLEDB;Data Source=C:\\testmdbadModeUnknown); ()通过DSN数据源对任何支持ODBC的数据库进行连接: m_pConnection>Open(Data Source=adotest;UID=sa;PWD=;adModeUnknown); ()不通过DSN对SQL SERVER数据库进行连接 m_pConnection>Open(driver={SQL Server};Server=;DATABASE=vckbase;UID=sa;PWD=adModeUnknown); 其中Server是SQL服务器的名称DATABASE是库的名称 Connection对象除Open方法外还有许多方法我们先介绍Connection对象中两个有用的属性ConnectionTimeOut与State ConnectionTimeOut用来设置连接的超时时间需要在Open之前调用例如: m_pConnection>ConnectionTimeout = ;///设置超时时间为秒 m_pConnection>Open(Data Source=adotest;adModeUnknown); State属性指明当前Connection对象的状态表示关闭表示已经打开我们可以通过读取这个属性来作相应的处理例如: if(m_pConnection>State) m_pConnection>Close(); ///如果已经打开了连接则关闭它 【】执行SQL命令并取得结果记录集 为了取得结果记录集我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset; 并为其创建Recordset对象的实例: m_pRecordsetCreateInstance(ADODBRecordset); SQL命令的执行可以采用多种形式下面我们一进行阐述 ()利用Connection对象的Execute方法执行SQL命令 Execute方法的原型如下所示: _RecordsetPtr Connection::Execute ( _bstr_t CommandText VARIANT * RecordsAffected long Options ) 其中CommandText是命令字串通常是SQL命令参数RecordsAffected是操作完成后所影响的行数 参数Options表示CommandText中内容的类型Options可以取如下值之一 adCmdText:表明CommandText是文本命令 adCmdTable:表明CommandText是一个表名 adCmdProc:表明CommandText是一个存储过程 adCmdUnknown:未知 Execute执行完后返回一个指向记录集的指针下面我们给出具体代码并作说明 _variant_t RecordsAffected; ///执行SQL命令CREATE TABLE创建表格usersusers包含四个字段:整形ID字符串username整形old日期型birthday m_pConnection>Execute(CREATE TABLE users(ID INTEGERusername TEXTold INTEGERbirthday DATETIME)&RecordsAffectedadCmdText); ///往表格里面添加记录 m_pConnection>Execute(INSERT INTO users(IDusernameoldbirthday) VALUES ( Washington//)&RecordsAffectedadCmdText); ///将所有记录old字段的值加一 m_pConnection>Execute(UPDATE users SET old = old+&RecordsAffectedadCmdText); ///执行SQL统计命令得到包含记录条数的记录集 m_pRecordset =m_pConnection>Execute(SELECT COUNT(*) FROM users&RecordsAffectedadCmdText); _variant_t vIndex = (long); _variant_t vCount = m_pRecordset>GetCollect(vIndex);///取得第一个字段的值放入vCount变量 m_pRecordset>Close();///关闭记录集 CString message; messageFormat(共有%d条记录vCountlVal); AfxMessageBox(message);///显示当前记录条数 ()利用Command对象来执行SQL命令 _CommandPtr m_pCommand; m_pCommandCreateInstance(ADODBCommand); _variant_t vNULL; vNULLvt = VT_ERROR; vNULLscode = DISP_E_PARAMNOTFOUND;///定义为无参数 m_pCommand>ActiveConnection = m_pConnection;///非常关键的一句将建立的连接赋值给它 m_pCommand>CommandText = SELECT * FROM users;///命令字串 m_pRecordset = m_pCommand>Execute(&vNULL&vNULLadCmdText);///执行命令取得记录集 在这段代码中我们只是用Command对象来执行了SELECT查询语句Command对象在进行存储过程的调用中能真正体现它的作用下次我们将详细介绍 ()直接用Recordset对象进行查询取得记录集 例如 m_pRecordset>Open(SELECT * FROM users_variant_t((IDispatch *)m_pConnectiontrue)adOpenStaticadLockOptimisticadCmdText); Open方法的原型是这样的: HRESULT Recordset::Open ( const _variant_t & Source const _variant_t & ActiveConnection enum CursorTypeEnum CursorType enum LockTypeEnum LockType long Options ) 其中 ①Source是数据查询字符串 ②ActiveConnection是已经建立好的 |