使用ADO数据库编程.doc_第1页
使用ADO数据库编程.doc_第2页
使用ADO数据库编程.doc_第3页
使用ADO数据库编程.doc_第4页
使用ADO数据库编程.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用ADO数据库编程ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术。ADO非常简单易用,甚至比ODBC API、DAO、RDO都要容易使用,并不失灵活性。本节将讨论如何使用ADO进行数据库的开发,介绍ADO库定义文件,讨论用Connection对象连接数据库、通过Connection、Command对象执行SQL命令及利用Recordset对象取得结果记录集进行查询、处理,下面分别介绍。1.1 导入ADO的动态链接库用#import指令引入ADO类型库,在使用的文件中加入如下语句#import c:program filescommon filessystemadomsado15.dll no_namespace rename(EOF,adoEOF)这句话的作用是编译的时候系统会为我们生成msado15.tlh,ado15.tli两个头文件来定义ADO库,即加载ADO动态库(msado15.dll)。其中,no_namespace表明不使用命名空间,rename(EOF,adoEOF)表明把ADO中用到的EOF改为adoEOF,防止发生命名冲突。几点说明:q 该代码需要在一行中完成,如果写成两行或者多行,行末要加上“”符号,表示把这几行看成一行。q 读者的编程环境中msado15.dll不一定在这个目录下,请按实际情况修改。q 在编译的时候可能会出现warningC4146警告,对此微软在MSDN中作了说明,并建议不要理会这个警告。1.2 初始化ADO控件环境ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。初始化OLE/COM库环境的代码如下::CoInitialize(NULL); /*初始化OLE/COM库环境*/别忘了最后要释放资源::CoUninitialize();/*释放程式占用的COM 资源*/如果需要界面支持可以通过另外一个函数实现。if(!AfxOleInit()/*初始化OLE/COM库环境*/ printf(OLE初始化出错!);return 0; 每次应用程序启动时,需要通过函数AfxOleInit()或CoInitialize()实现初始化OLE/COM库环境。本书中相关实例是使用CoInitialize()来完成初始化。1.3 ADO库接口ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。下面分别讨论各接口功能描述及使用方法。1_ConnectionPtr接口_ConnectionPtr是一个连接接口,返回一个记录集或一个空指针。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句。初始化COM环境后,创建与数据库的连接最佳方法是声明一个Connection对象指针_ConnectionPtr,并把它用于和Connection对象进行的所以交互中。一旦声明了Connection对象指针,可以通过创建一个Connection对象的实例(调用函数CreateInstance()),并把Connection对象的UUID(接口的ID)作为唯一的参数传给它,从而初始化它。_ConnectionPtr接口执行过程是先创建一个_ConnectionPtr接口实例,接着指向并打开一个ODBC数据源。下面给出使用_ConnectionPtr创建一个基于DSN和非DSN的数据连接的实例。(1)使用_ConnectionPtr基于非DSN数据连接语句。如果没有注册数据源,可直接通过连接字符串实现数据库的连接。分别针对SQL SERVER、ORACLE和Access数据库给出连接字符串的构造实例,读者可直接使用对应的例句。(2)连接SQL SERVER。_ConnectionPtr pCon; /*定义pCon指针*/pCon.CreateInstance(_uuidof(Connection); /*初始化pCon指针*/strConn.=driver=SQL Server; Server=kobe; DATABASE=test; UID=sa; PWD= ;pCon-Open(_bstr_t)strConn, , , adModeUnknown);上述语句中,kobe是服务器名。如果连接本地数据库,可以是“172.0.0.1”或“.”或“localhost”都是可以的。test是数据库名称,SQL SERVER登录的用户名sa和密码为空,这些参数可通过SQL SERVER的企业管理器更改。(3)连接Access。CString strConn;_ConnectionPtr pCon;pCon.CreateInstance(_uuidof(Connection);strConn=driver= Microsoft Access Driver (*.mdb ; DBQ=E:test.mdb;pCon-Open(_bstr_t)strConn, , , adModeUnknown);上述语句中DBQ是Access数据库的完整路径名。例如,“D:DBtest.mdb”注意描述路径需要有两个反斜杠。(4)使用_ConnectionPtr基于DSN数据连接语句。如果已经有注册的数据源“test”可用另外一种方式连接数据库。_ConnectionPtr pCon;pCon.CreateInstance(_uuidof(Connection);pCon-Open(DSN=test;UID=sa;PWD= ,-1);语句中的UID、PWD分别为SQL SERVER登录的用户名sa和密码为空。2_CommandPtr接口_CommandPtr接口返回一个记录集或一个空指针。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,不仅可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。通常使用它创建一个数据连接,然后使用其它对象执行数据输入输出操作。3_RecordsetPtr接口_RecordsetPtr接口是指向ADO的Recordset对象的指针,它对记录集提供了更多的控制功能。例如,记录锁定,游标控制等实现对记录的插入、删除及更新操作。同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。如果需要使用多个记录集,可以与Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程和SQL语句。/*基本流程*/(1)初始化COM库,引入ADO库定义文件(2)用Connection对象连接数据库(3)利用建立好的连接,通过Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。(4)使用完毕后关闭连接释放对象。/操作的详细步骤:/*【1】COM库的初始化*/可以使用AfxOleInit()或:CoInitialize(NULL)来初始化COM库,通常在CWinApp:InitInstance()的函数中完成,请看如下代码:BOOL CADOTest1App:InitInstance() AfxOleInit(); . /*【2】用#import指令引入ADO类*/在stdafx.h中加入如下语句:#import c:program filescommon filessystemadomsado15.dll no_namespace rename(EOF,adoEOF)其作用同#include类似,编译时系统会生成msado15.tlh,ado15.tli两个C+头文件来定义ADO库。/*【3】创建Connection对象并连接数据库*/首先我们需要添加一个指向Connection对象的指针:_ConnectionPtr m_pConnection;BOOL CADOTest1Dlg:OnInitDialog()CDialog:OnInitDialog();tryHRESULT hr = m_pConnection.CreateInstance(ADODB.Connection);/创建Connection对象if(SUCCEEDED(hr)hr = m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb,adModeUnknown);/连接数据库/hr = m_pConnection-Open(driver=SQL Server;Server=.;DATABASE=xxx;UID=sa;PWD=,adModeUnknown);catch (_com_error e) /COM错误取得,当执行COM功能的时候,如果出错,可以捕捉到_com_error的异常CString strComError;strComError.Format(错误编号: %08lxn错误信息: %sn错误源: %sn错误描述: %s,e.Error(), / 错误编号e.ErrorMessage(), / 错误信息(LPCSTR) e.Source(), / 错误源(LPCSTR) e.Description(); / 错误描述:MessageBox(NULL,strComError,错误,MB_ICONEXCLAMATION);常用的数据库连接方法:(1)通过JET数据库引擎对ACCESS2000数据库的连接m_pConnection-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:test.mdb,adModeUnknown);(2)通过DSN数据源对任何支持ODBC的数据库进行连接:m_pConnection-Open(Data Source=adotest;UID=sa;PWD=;,adModeUnknown);/m_pConnection-Open(DSN=test;,0); /连接叫作test的ODBC数据源 (3)不通过DSN对SQL SERVER数据库进行连接: m_pConnection-Open(driver=SQL Server;Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139,adModeUnknown);其中Server是SQL服务器的名称,DATABASE是库的名称/*【4】执行SQL命令并取得结果记录集*/ 为了取得结果记录集,定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;并为其创建Recordset对象的实例: m_pRecordset.CreateInstance(ADODB.Recordset);SQL命令的执行可以采用多种形式,下面我们一进行阐述。/注:VARIANT 数据类型和VC+数据类型之间的转换/定义_variant_t va; CString str;1)带变量的SQL 语句 需要把str转换_variant_tstr.Format(select * from table where xx=%s,m_str).Execute(v_bstr_t(str).2)GetCollect取数据需要把_variant_t转换strstr=(LPCTSTR)(_bstr_t)va/(1)利用Connection对象的Execute方法执行SQL命令Execute方法的原型如下所示:_RecordsetPtr Connection15:Execute (_bstr_t CommandText, VARIANT * RecordsAffected, long Options ) 其中CommandText是命令字串,通常是SQL命令。RecordsAffected是操作完成后所影响的行数, Options表示CommandText中内容的类型,Options可以取如下值之一:adCmdText:表明CommandText是文本命令adCmdTable:表明CommandText是一个表名adCmdProc:表明CommandText是一个存储过程adCmdUnknown:未知Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。 try_variant_t ra;m_pConnection-Execute(CREATE TABLE 学生信息(学号 INTEGER,姓名 TEXT,年龄 INTEGER,生日 DATETIME),&ra,adCmdText);m_pConnection-Execute(INSERT INTO 学生信息(学号,姓名,年龄,生日) VALUES (112105, 程红秀,22,1982-08-16),&ra,adCmdText);/往表格里面添加记录m_pRecordset = m_pConnection-Execute(SELECT COUNT(*) FROM 学生信息,&ra,adCmdText); /执行SQL统计命令得到包含记录条数的记录集_variant_t vCount = m_pRecordset-GetCollect(_variant_t)(long)(0);/取得第一个字段的值放入vCount变量m_pRecordset-Close();CString message;message.Format(共有%d条记录,vCount.lVal);AfxMessageBox(message); catch (_com_error e) .(2)直接用Recordset对象进行查询取得记录集 例如 m_pRecordset-Open(SELECT * FROM 学生信息,_variant_t(IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);Open方法的原型是这样的:HRESULT Recordset15:Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options ) 其中:Source是数据查询字符串ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象) CursorType光标类型,它可以是以下值之一,请看这个枚举结构:enum CursorTypeEnumadOpenUnspecified = -1,/不作特别指定adOpenForwardOnly = 0,/前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用adOpenKeyset = 1,/采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。adOpenDynamic = 2,/动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。adOpenStatic = 3/静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。;LockType锁定类型,它可以是以下值之一,请看如下枚举结构:enum LockTypeEnumadLockUnspecified = -1,/未指定adLockReadOnly = 1,/只读记录集adLockPessimistic = 2,/悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制adLockOptimistic = 3,/乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作adLockBatchOptimistic = 4,/乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。; Options请参考本文中对Connection对象的Execute方法的介绍/*【5】记录集的遍历、更新*/根据我们刚才通过执行SQL命令建立好的 学生信息 表,它包含四个字段:学号,姓名,年龄,生日.以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,更改其年龄,保存到数据库。try_variant_t vUsername,vBirthday,vID,vOld;_RecordsetPtr m_pRecordset;m_pRecordset.CreateInstance(ADODB.Recordset);m_pRecordset-Open(SELECT * FROM 学生信息,_variant_t(IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);while(!m_pRecordset-adoEOF) vID = m_pRecordset-GetCollect(_variant_t(long)0); /取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行vUsername = m_pRecordset-GetCollect(姓名);/取得姓名字段的值vOld = m_pRecordset-GetCollect(年龄);vBirthday = m_pRecordset-GetCollect(生日);TRACE(id:%d,姓名:%s,年龄:%d,生日:%srn,vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday); /在DEBUG方式OUTPUT窗口输出记录集中的记录m_pRecordset-MoveNext(); /移到下一条记录m_pRecordset-MoveFirst(); /移到首条记录m_pRecordset-Delete(adAffectCurrent); /删除当前记录for(int i=0;iAddNew(); /添加新记录m_pRecordset-PutCollect(学号,_variant_t(long)(i+10);m_pRecordset-PutCollect(姓名,_variant_t(王斌年);m_pRecordset-PutCollect(年龄,_variant_t(long)21);m_pRecordset-PutCollect(生日,_variant_t(1930-3-15);m_pRecordset-Move(1,_variant_t(long)adBookmarkFirst); /从第一条记录往下移动一条记录,即移动到第二条记录处m_pRecordset-PutCollect(_variant_t(年龄),_variant_t(long)45); /修改其年龄m_pRecordset-Update(); /保存到库中catch (_com_error e)/*【6】关闭记录集与连接 */记录集或连接都可以用Close方法来关闭 m_pRecordset-Close();/关闭记录集 m_pConnection-Close();/关闭连接 /*【7】补充一些对表操作例子 */执行SQL命令:_variant_t RecordsAffected; CREATE TABLE 创建表 new, new包含四个字段:ID 整形, username 字符串, old 整形, birthday 日期型 m_ptrConnection-Execute(CREATE TA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论