《ADO数据库编程.docx》由会员分享,可在线阅读,更多相关《ADO数据库编程.docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ADO数据库编程(1) Connection对象(链接)Connection对象代表应用程序与数据源的一个连接,ADO的Connection对象封装了OLE DB的数据源对象(Data Source)和会话对象(Session)。Connection对象是ADO的基本对象之一,它独立于所有其他的对象。在访问数据库时。首先建立一个Connection对象,通过它建立到数据库的连接(2) Command(命令)对象Command对象代表一个命令,可以通过该对象的方针对数据源有关操作,比如查询,修改等。Command(命令)对象封装了OLE DB的命令对象(Command)。利用该对象可以执行不同种
2、类的命令,可以使用Command对象执行查询并返回Recordset对象中的记录,也可以执行不返回记录集的命令,还可以执行存储过程等。(3) Recordset(记录集)对象Recordset对象封装了OLE DB 的行集对象(Rowset)。Recordset对象代表一个表的记录集或者查询命令执行的结果,在记录集中,总是有一个当前的记录。记录集是ADO噶unlishujude基本对象,所有的Recordset对象都按照行列方式的表状结构进行管理,每一行对应一个记录(Record),每一列对应一个域(Field)。(4) Field(域)对象每个Field对象对应于Recordset对象中的一
3、列。Recordset对象中包含了一个用于处理记录集中各列的域对象集合(Fields)。在记录集返回的每一列中,这个域的集合中都有一个相应的域对象与此列相应,每个域对象中封装了记录集对象的一列。使用Field对象的集合,方法和属性可以获得字段名,字段数据以及字段的其他基本特征。域对象只能在记录集对象访问,不能独立存在。2 数据类型转换 ADO是基于COM的技术,COM中使用的数据类型和C+中是不同的。在用ADO编程时,就需要考虑其数据类型和C+数据类型之间的转换的问题。本节首先介绍COM中VARIANT。BSTR数据类型,这些是在ADO编程中较常用到的。(1) VARIANT是一个结构化的数据
4、类型,包含了一个成员函数及其数据类型的表示。Variant可以表示相当多的数据类型,甚至另一个VARIANT,BSTR,Boolean,IUnknown指针,货币,日期等。(2) BSTR也是一个结构化的数据类型,包括了串本身及串的长度。COM提供了方法进行串的控件分配,操作和释放(3) _variant_t 类封装并管理VARIANT这一数据类型,_bstr_t类封装并管理BSTR这一数据类型。使用者(4) 使用这两个封装类,就可以方便地把C+类型的变量装换成COM中的变量。(5) 在Visual C+中,使用ADO编程时,大部分方法(函数)的参数类型都是_variant_t 或_bstr_
5、t类型,使用C+类型时,可以强制类型转换成这两种类型3 SQL命令的使用 在ADO中程序中,有多种方式使用SQL语句。在Connection对象,Command对象和Recordset对象中都可以使用SQL命令。比较常用的方式是在Command对象中使用或直接在Recordset对象中使用。下面分别举例说明,假设有数据库的一个学生表Student,要查询所有学生的记录,使用Command对象执行该操作的程序代码如下/声明Command对象的指针变量_CommandPtr pCommand;/实例化该变量pCommand.CreateInstance(_uuidof(Command);/假设m_
6、pConnection是之前定义并实例化的Connection的智能指针变量/给ActiveConnection赋值,指定数据库连接pCommand-ActiveConnection=m_pConnection;/通过CommandText属性设置SQL命令pCommand-CommandText=select*from student;/执行SQL命令pCommand-Execute();Command对象的ActiveConnection属性用于指定该对象的连接;CommandText属性可以是SQL命令也可以是存储过程名,将发送到数据源执行在上述代码中执行该SQL语句返回一组记录,这就需
7、要记录集对象来存储这些记录。使用记录集对象实现改代码如下_RecordsetPtr m_pRS;m_pRS.CreateInstance(_uuidof(Recordset);m_pRS-CursorLocation=adUseClient;/在OPen方法的第一个参数中给吃SQL命令/假设m_pConn是之前定义并实例化的Connection的智能指针变量m_pRS-Open(select * from student,m_pConn.GetInterfacePtr(),adOpenStatic,adLockBatchOptimistic,adCmdUnknow);/可以看出,在Record
8、set对象的Open函数的5. ADO编程的一般流程(1)连接到数据源:一般情况下,在执行数据库操作之前,都会先使用Connection对象连接到数据源。(2)指定对数据源的命令:在该步骤中,通常涉及到Command对象,当然也可以直接使用Recordset对象执行查询命令,但如果查询或者存储过程是需要参数的,就只能使用Command对象(3)执行命令(4)处理结束:如果上述命令是返回记录的操作,则在记录集对象中缓存了这些返回记录,便于在程序中进行操作,比如获得记录字段,统计等。(5)更改数据:如果需要,可以在缓存记录的记录集中更改数据,然后写会到数据库中,更改数据(6)关闭记录集:记录集使用
9、完毕后,应关闭记录集,以释放相关的数据和资源(7)关闭连接:释放资源20.3.3 引入ADO动态连接库 在使用Visual C+的MFC编程时,MFC并没有提供对ADO的封装类,能够支持ADO编程的是ADO的COM动态链接库文件msado*.dll。一般在系统盘下的C:Program FilesCommon FilesSystemado目录下。*位置的数字代表ADO库的版本。在程序实例中会使用该路径,读者可以根据实际情况进行修改,引入该文件的方法是在Stdafx.h头文件中,添加如下代码#import “C:Program FilesCommon FilesSystemadomsado15.h
10、”no_namesapce rename(“EOF”,”adoEOF”)注意,该代码需要在一行中完成,如果写成两行或者多行,行末应加上“符号,表示把这几行看做一行。20.3.4 初始化COM库对象 ADO是基于COM技术的,所以,在应用程序调用ADO之前,必须初始化COM库环境。ADO使用结束后,还需要关闭库,释放初始化加载的动态链接库。在MFC应用程序中,调用CoInitialize(NULL)初始化COM库环境,调用CoUninitialize()函数释放动态连接库。一般在应用程序CXXApp的InitInstance()成员函数里初始化COM库环境,在ExitInstance()成员函数
11、里释放动态链接库(2) 在项目的类视图(Class View)的树形结构中鼠标右键单击“CXXApp节点,在快捷键选择 Add Virtual Function命令,添加虚函数。20.4 创建ADO与数据库的连接 在ADO中,Connection对象用于处理与数据库的连接。下面将介绍Connection中常用的属性和方法 20.4.1 使用Connection对象打开连接在使用Connection对象进行打开连接操作时,会用到的属性和方法如下(1) ConnectionString属性:ConnectionString是连接字符串,通过传递包含一系列由分号分隔的“argument=value”
12、语句的详细连接字符串,可指定用于建立连接数据源的信息。而连接串的格式根据数据源的不同也有所不同(2) ConnectionTimeout属性:该属性指示在终止尝试和产生错误前建立连接期间所等待的时间。(3) Open方法:使用Open方法可以建立到数据源的物理连接。在引入的动态连接库生成的定义文件(msado15.tlh)中Open方法的定义如下HRESULT Open(_variant_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)其参数意义如表20.5所示Open方法参数表参数名含义ConnectionStr
13、ing可选,类型为字符串,包含连接信息。如果设置了ConnectionString属性,该参数可以不设置UserID可选,字符串,包含建立连接时所使用的用户名Password,可选,字符串,包含建立是所使用的密码Options可选,决定该方法是在建立之后(异步)还是建立连接之前(同步)返回,该值可以是如下两个常量:adConnectUnspecified(默认值)同步和adAsyncConnect(异步)(4) Close方法:Close方法用于关闭到数据源的连接;访问数据库完成后,关闭连接,释放有关的系统资源。关闭对象并不代表将它从内存中删除,可以更改它的属性设置然后再打开一般对连接的操作是
14、,首先设置连接字符串和等待时间属性的值,然后使用适当的参数调用Open方法,打开连接,对连接的数据库操作完成后或者需要等待的时间,关闭连接。微软提供了一种可视化的方法来解决这个问题,。微软提供了通用数据连接文件(UDL)来建立和测试连接属性。其步骤是(1)在项目文件夹中新建一个UDL文件,简单地新建一个txt文件,把该文件名改为扩展名为udl的文件即可。双击该文件(2)在“提供程序”选项卡中选择“Microsoft OLE DB Provider for SQL Server作为OLE DB提供程序(3)在“连接“选项卡中,配置连接的数据库。因为 一般程序和SQL Server 在实际应用中子
15、同一台机器上,所以在”选择或输入服务器名“文件框中输入(local)选择使用Windows NT继承安全设置。(5) 完成UDL文件设置之后,就可以在程序中使用该文件了。具体编程步骤如下:l 首先建立建立一个_ConnectionPtr 接口类型的成员变量:例如 _ConnectionPtr m_pConnectionm_pConnection.CreateInstance(_uuidof(Connection);/m_pRecordset.CreateInstance(_uuidof(Recordset);m_pConnection-ConnectionString=File Name=my
16、date.udl;/设置等待连接打开的时间为20秒m_pConnection-ConnectionTimeout=20;m_pConnection-Open(,adConnectUnspecified);20.5使用记录集对象查询数据库 在ADO程序中,记录集(Recordset)对象代表一个表的记录集合或者是一个SQL命令或者存储过程的执行结果。简单的说,记录集实际上缓存了从数据库获得的记录,应用程序可以从记录集中获得每条记录的字段20.5.1 记录集对象的属性和方法 使用记录集进行查询和获得记录字段值的操作主要涉及如下Recordset对象属性和方法(1) RecordCount属性:返回
17、Recordset对象中记录的当前数目(2) BOF,EOF属性:BOF指示当前记录位置位于Recordset对象的第一个记录之前。EOF指示当前记录位置位于Recordset对象的最后一个记录之后。若打开的记录集至少包含一条记录,则第一条记录为当前记录,BOF和EOF属性都为FALSE(3) AbsolutePosition属性:指定Recordset对象当前记录的序号位置(4) ActiveConnection属性:该属性指定Recordset对象当前所属的Connection对象(5) Open方法,该方法对于Recordset对象非常重要。Open方法在msado15.tlh文件中的定
18、义如下HRESULT Open(_variant_t &Source,Const _variant_t &ActiveConnection,enum CursorTypeEnum CursorType,enum LockTypeEnum LockType,long Options)其中参数Source是记录源,它可以是下列内容之一:Command对象变量,SQL语句,存储过程,表名或完整的路径名参数ActiveConnection对应与ActiveConnection属性,指定在哪个连接中打开该记录集参数CursorType指定打开Recordset时使用的游标,它的取值可以是CursorTy
19、peEnum枚举型中的常量:adOpenStatic,adOpenDynamic,adOpenForwardOnly(默认),adOpenKeyset分别对应以下4中游标类型(1) 静态游标:提供对记录集的一个静态副本,允许各种移动操作,包括前移,后移等等,但其他用户所作的操作(例如添加,更改或删除)将不可见(2) 动态游标:允许各种操作,包括前移,后移等等,并且其他用户所作的操作也可以直接反映出来(3) 前向游标,除了允许在记录集中向前移动,其行为类似静态游标。这样,当需要在Recordset中单程移动时就可以提高性能(4) 键集(Keyset)游标。类似于动态游标,也能够看到其他用户所作的
20、数据修改,但不能看到其他用户新加的记录,也不能访问其他用户删除的记录参数LockType指定打开记录集时应该使用的锁定类型,LockType取值为LockTypeEnum枚举型的值,它可以取值如表20.6所示 表20.6 LockTypeEnum值及其说明常量说明adLockReadOnly(默认值)只读不能改变数据adLockPessimisitic保守式锁定(逐个)数据提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录adLockOptimistic开放式锁定(逐个)数据源提供者使用开放式锁定,只能调用Update方法才锁定记录adLockBatchOptimist
21、ic开放式批更新用于批更新模式参数Option是长整形值,它指定参数Source的种类,经常取值如表20.7所示。所以在调用Open方法时Source参数应该于Option参数相符,否则可能会出现错误。 Option取值常量说明adCmdText提示提供者应该将Source作为命令的文本定义来计算adCmdTable指示ADO生成SQL查询以便在Source中命名的表中返回所有行adCmdTableDirect指示提供者更改从在Source中命令名的表中返回所有行adCmdStoredProc指示提供者应该将Source视为存储过程adCmdUnknown指示Source参数中的命令类型为未知
22、GetCollect和PutCollect方法;GetCollect方法用于取得字段的值putCollect方法用于向记录字段中写入值。其语法如下。其中参数Index可以是字符串表名字段名,也可以是整形数,表示字段的序号。PutCollec函数的参数pvar表示要写入的变量值:_variant_t GetCollect(const _variant_t &Index)Void PutCollect(const _variant_t &Index,const _variant_t & pvar)(5)AddNew 方法:使用该方法创建和初始化新纪录。该方法可以使用参数,在参数中指定要添加的新纪录
23、,也可以不使用参数,而后在后面使用PutCollect方法修改新纪录,使用Update函数保存新纪录(6)Update方法:该方法保存调用AddNew方法以来或更改现有记录的任何字段及所作的所有更改。最后,使用记录集的具体方法是:定义 _RecordsetPtr(记录集对象智能指针)型变量,然后通过它调用Recordset的Open方法,即可打开一个数据集,然后可以使用GetCollect方法获取记录的字段值,使用Move系列方法实现记录集的遍历,最后,关闭记录集20.6 查询功能的实现构造正确的SQL命令,然后作为参数传递给记录集对象的Open函数。20.6.3使用记录集对象修改记录 使用记
24、录集对象修改记录的步骤是:使用查询语句得到需要修改的记录,使用PutCollect方法,对记录的字段值进行修改;最后调用Update方法,保存修改到数据库中。9.3.9 添加记录打开了记录集对象后,就可以往里面添加记录了。如果应用程序中没有使用绑定的记录类,添加一条记录按照如下步骤进行(1) 调用记录集对象的函数Addnew()新增一个空记录(2) 调用记录集对象函数的PutCollect(字段名,值)输入每个字段的值(3) 调用记录集对象的函数Update()更新数据库中的数据。 9.3.10 修改记录打开了记录集对象后,就可以修改某条记录了。如果应用程序中没有使用绑定的记录类,添加一条记录
25、按照如下步骤进行(1) 调用记录集对象的函数PutCollect(字段名,值)给当前记录集行的每个字段赋值。(2) 调用记录集对象的函数Update()更新数据库中的数据。 9.3.10 删除记录 从ADO记录集中删除记录就如同其他访问数据库的技术很相似,可以用Delete函数从记录集中删除行。Delete函数的定义如下HRESULT Delet(enum affectedEnum AffectRecords)AffectRecords 参数是一个枚举型变量,用于指定删除的方式。如果给定变量所赋的值是adAffectCurrent,只有当前行被删除,如果此参数的值是adAffectedGrou
26、p,那么,它将删除符合过滤器的所有行。由于删除了当前行后,没有当前的记录,所以在进行其他操作前必须调用定位函数将指针移到其他位置。列表视图控件的常用操作(1) 列的插入和删除当以报告格式显示列表视图时,一般会显示一列表项和多列子项,在初始化列表视图时,先要调用InsertColumn()插入各列,该函数的声明如下Int InsertColumn(int nCol,LPCTSTR lpszColumnHeading,int nFormat=LVisual C+FMT_LEFT,int nWidth=-1,int nSubItem=-1)此方法指示规定每列的名字其中参数说明如下参数 nCol 为列
27、的位置,从零开始参数lpszColumnHeading为显示的列的列名参数nFormat 为显示的对齐方式,可以取值LVisual C+FMT_LEFT,LVisual C+FMT_RIGHT,LVisual C+FMT_CENTER,可以表示为 LVCFMT_LEFT,LVCFMT_RIGHT,和LVCFMT_CENTER参数 nWidth 为列的宽度,取值为-1,表名采用自动设置参数nSubItem为分配给子列的索引,取值为-1,表名没有子列如果需要删除某列,应调用DeleteColumn()函数,其声明如下BOOL DeleteColumn(int nCol);参数nCol为列的索引值。(2)列表项的插入,设置于删除要插入列表项,可调用InsertItem()函数。Int InsertItem(int nItem,LPCTSTR lpszItem,int nImage);参数nItem指明要插入向的位置,lpszItem则为显示的字符,nImage为位图系列的索引由多列的列表控件中就需要为每一列指明其在每一列中的显示字符,通过调用下面的函数 BOOL SetItemText(int nItem,int nSubItem,LPCTSTR lpszText)其中 nItem为设置项的位置,nSubItem为列的位置,lpszText为显示字符。