在VC++中使用ADO13954

上传人:沈*** 文档编号:195475805 上传时间:2023-03-17 格式:PDF 页数:33 大小:980.20KB
收藏 版权申诉 举报 下载
在VC++中使用ADO13954_第1页
第1页 / 共33页
在VC++中使用ADO13954_第2页
第2页 / 共33页
在VC++中使用ADO13954_第3页
第3页 / 共33页
资源描述:

《在VC++中使用ADO13954》由会员分享,可在线阅读,更多相关《在VC++中使用ADO13954(33页珍藏版)》请在装配图网上搜索。

1、在 VC+中使用ADO访问 Access数据库 摘要 ADO 具有易于使用、速度快、内存支出少和磁盘痕迹小的有点。并且提供了轻量高性能的接口。ADO(ActiveEx Data Object)是 Microsoft数据库应用程序开发接口,是建立在 OLE DB 之上的高层数据访问技术。即使我们对 OLE DB和 COM不了解,也能轻松使用 ADO,因为它非常的简单易用,甚至比以前的 ODBC API、DAO都要容易使用,并不适灵活性。同时它也提供了多语言访问技术包括 Visual C+,Visual Basic和 VBA等。使用 ADO编程一般有以下几个步骤组成:(1)连接到一个数据源;(2)

2、打开指定的数据集;(3)执行所需的查询;(4)把数据检索到一个能够在C+代码中很容易访问的对象中;(5)提供检测错误的一般方法。2.ADO对象的详细介绍 如下表:对象 说明 Command 对象查询数据库并返回 RecordSet对象中的记录,以便执行大量操作或处理数据库结构 Connection 打开的与数据源的连接 Error 任何涉及 ADO 对象的操作都会生成一个或多个提供者错误。每个错误出现时,一个或多个 Error 对象将被放到 Connection对象的 Errors 集合中。Field 含有由 Field 对象组成的 Fields集合。每个 Field 对象对应于 Record

3、set 中的一列。使用 Field 对象的 Value 属性可设置或返回当前记录的数据。Parameter 代表与基于参数化查询或存储过程的 Command对象相关联的参数或自变量 Property 对象代表由提供者定义的 ADO 对象的动态特征 RecordSet 表示的是来自基本表或命令执行结果的记录全集。任何时候,Recordset 对象所指的当前记录均为集合内的单个记录 2.1Command对象 使用 Command对象查询数据库并返回 Recordset 对象中的记录,以便执行大量操作或处理数据库结构。可以使用 Command 对象的集合、方法、属性进行下列操作:使用 Command

4、Text 属性定义命令(例如,SQL 语句)的可执行文本。通过 Parameter 对象和 Parameters 集合定义参数化查询或存储过程参数。可使用 Execute 方法执行命令并在适当的时候返回 Recordset 对象。执行前应使用 CommandType 属性指定命令类型以优化性能。使用 Prepared 属性决定提供者是否在执行前保存准备好(或编译好)的命令版本。使用 CommandTimeout 属性设置提供者等待命令执行的秒数。通过设置 ActiveConnection 属性使打开的连接与 Command 对象关联。设置 Name 属性将 Command 标识为与 Conne

5、ction 对象关联的方法。将 Command 对象传送给 Recordset 的 Source 属性以便获取数据。注意 如果不想使用 Command 对象执行查询,请将查询字符串传送给 Connection 对象的 Execute 方法或 Recordset 对象的 Open 方法。但是,当需要使命令文本具有持久性并重新执行它,或使用查询参数时,则必须使用 Command 对象。要执行 Command,只需通过它所关联的 Connection 对象的 Name 属性,将其简单调用即可。必须将 Command 的 ActiveConnection 属性设置为 Connection 对象。如果

6、Command 带有参数,则将这些参数的值作为参数传送给方法。如果在相同连接上执行两个或多个 Command 对象,并且某个 Command 对象是带输出参数的存储过程,这时会发生错误。要执行各个 Command 对象,请使用独立的连接或将所有其他 Command 对象的连接断开。2.2Connection对象 Connection 对象代表与数据源进行的唯一会话。如果是客户端/服务器数据库系统,该对象可以等价于到服务器的实际网络连接。取决于提供者所支持的功能,Connection 对象的某些集合、方法或属性有可能无效。使用 Connection 对象的集合、方法、和属性可执行下列操作:在打开

7、连接前使用 ConnectionString、ConnectionTimeout 和 Mode 属性对连接进行配置。设置 CursorLocation 属性以便调用支持批更新的“客户端游标提供者”。使用 DefaultDatabase 属性设置连接的默认数据库。使用 IsolationLevel 属性为在连接上打开的事务设置隔离级别。使用 Provider 属性指定 OLE DB 提供者。使用 Open 方法建立到数据源的物理连接。使用 Close 方法将其断开。使用 Execute 方法执行对连接的命令,并使用 CommandTimeout 属性对执行进行配置。可使用 BeginTrans、

8、CommitTrans 和 RollbackTrans 方法以及 Attributes 属性管理打开的连接上的事务(如果提供者支持则包括嵌套的事务)。使用 Errors 集合检查数据源返回的错误。通过 Version 属性读取使用中的 ADO 执行版本。使用 OpenSchema 方法获取数据库模式信息。注意 如果不使用 Command 对象执行查询,请向 Connection 对象的 Execute 方法传送查询字符串。但是,当需要使命令文本具有持久性并重新执行,或使用查询参数的时候,则必须使用 Command 对象。可以创建独立于先前定义的其他任何对象的 Connection 对象。可以象

9、执行 Connection 对象的本地方法一样执行命令或存储过程。如果要执行命令,可以使用 Command 对象的 Name 属性给命令指定一个名称。将 Command 对象的 ActiveConnection 属性设置为该连接。然后,象发出 Connection 对象的方法一样发出使用命令名称的语句,后面可带任何参数(如果有返回行,则后面带 Recordset 对象 2.3Error对象 任何涉及 ADO 对象的操作都会生成一个或多个提供者错误。每个错误出现时,一个或多个 Error 对象将被放到 Connection对象的 Errors 集合中。当另一个 ADO 操作产生错误时,Error

10、s 集合将被清空,并在其中放入新的 Error 对象集。注意 每个 Error 对象都代表特定的提供者错误而不是 ADO 错误,ADO 错误被记载到运行时的例外处理机制中。例如,在 Microsoft Visual Basic 中,产生特定 ADO 的错误将触发 On Error 事件并出现在 Err 对象中。关于 ADO 错误的完整列表,请参阅 ADO 错误代码主题。通过 Error 对象的属性可获得每个错误的详细信息,其中包括以下内容:Description 属性,包含错误的文本。Number 属性,包含错误常量的长整型整数值。Source 属性,标识产生错误的对象。在向数据源发出请求之后

11、,如果 Errors 集合中有多个 Error 对象,则将会用到该属性。SQLState 和 NativeError 属性,提供来自 SQL 数据源的信息。出现提供者错误时,Error 对象将被放在 Connection 对象的 Errors 集合中。ADO 支持由单个 ADO 操作返回多个错误,以便显示特定提供者的错误信息。要在错误处理程序中获得丰富的错误信息,可使用相应的语言或所在工作环境下的错误捕获功能,然后使用嵌套循环枚举出 Errors 集合的每个 Error 对象的属性。与提供者一样,ADO 在进行可能引发新的提供者错误的调用前将清除 OLE Error Info 对象。但是,只有

12、当提供者产生新的错误或 Clear 方法被调用时,才能清空并充填 Connection 对象的 Errors 集合。某些属性和方法返回的警告以 Errors 集合中的 Error 对象的方式出现,但并不中止程序的执行。在调用 Recordset 对象的 Resync、UpdateBatch、或 CancelBatch方法,或 Connection 对象的 Open 方法,或者在设置 Records 对象的 Filter 属性之前,可通过调用 Errors 集合的 Clear 方法。这样就可以读取 Errors 集合的 Count 属性,以测试返回的警告。2.4Field对象 Recordset

13、 对象含有由 Field 对象组成的 Fields 集合。每个 Field 对象对应于 Recordset 中的一列。使用 Field 对象的 Value 属性可设置或返回当前记录的数据。取决于提供者具有的不同功能,Field 对象的某些集合、方法或属性有可能无效。使用 Field 对象的集合、方法、和属性可进行如下操作:使用 Name 属性可返回字段名。使用 Value 属性可查看或更改字段中的数据。使用 Type、Precision 和 NumericScale 属性可返回字段的基本特性。使用 DefinedSize 属性可返回已声明的字段大小。使用 ActualSize 属性可返回给定字

14、段中数据的实际大小。使用 Attributes 属性和 Properties 集合可决定对于给定字段哪些类型的功能受到支持。使用 AppendChunk 和 GetChunk 方法可处理包含长二进制或长字符数据的字段值。如果提供者支持批更新,可使用 OriginalValue 和 UnderlyingValue 属性在批更新期间解决字段值之间的差异。在打开 Field 对象的 Recordset 前,所有元数据属性(Name、Type、DefinedSize,Precision 和 NumericScale)都是可用的。在此时设置这些属性将有助于动态构造其格式。2.5.Parameter对象

15、许多提供者都支持参数化的命令。需要进行的操作在这些命令中只定义一次,但可以使用变量(或参数)改变命令的某些细节。例如,SQL SELECT 语句可使用参数定义 WHERE 子句的匹配条件,而使用另一个参数来定义 SORT BY 子句的列的名称。Parameter 对象代表与参数化查询关联的参数,或进/出参数以及存储过程的返回值。取决于提供者的功能,Parameter 对象的某些集合、方法或属性有可能无效。使用 Parameter 对象的集合、方法、和属性可进行如下操作:使用 Name 属性可设置或返回参数名称。使用 Value 属性可设置或返回参数值。使用 Attributes 和 Direc

16、tion、Precision、NumericScale、Size 以及 Type 属性可设置或返回参数特性。使用 AppendChunk 方法可将长整型二进制或字符数据传递给参数。如果知道与想要调用的存储过程或参数化查询相关联的参数属性和名称,则可使用 CreateParameter方法创建带有相应属性设置的 Parameter 对象,并使用 Append 方法将它们添加到 Parameters 集合。这样就可以设置并返回参数值,而无需调用 Parameters 集合的 Refresh 方法来检索提供者的参数信息,即潜在的、资源集中的操作。2.6Property对象 ADO 对象有两种类型的属

17、性:内置属性和动态属性。内置属性是在 ADO 中实现并立即可用于任何新对象的属性,此时使用 MyObject.Property 语法。它们不会作为 Property 对象出现在对象的 Properties 集合中,因此,虽然可以更改它们的值,但无法更改它们的特性。动态属性由基本的数据提供者定义,并出现在相应的 ADO 对象的 Properties 集合中。例如,指定给提供者的属性可能会指示 Recordset 对象是否支持事务或更新。这些附加的属性将作为 Property 对象出现在该 Recordset 对象的 Properties 集合中。动态属性只能通过集合使用 MyObject.Pro

18、perties(0)或 MyObject.Properties(Name)语法来引用。两种属性都无法删除。动态 Property 对象有四个自己的内置属性:Name 属性是标识属性的字符串。Type 属性是用于指定属性数据类型的整数。Value 属性是包含属性设置的变体型。Attributes 属性是指示特定于提供者的属性特征的长整型值。2.7.RecordSet对象 可使用 Recordset 对象操作来自提供者的数据。使用 ADO 时,通过 Recordset 对象可对几乎所有数据进行操作。所有 Recordset 对象均使用记录(行)和字段(列)进行构造。由于提供者所支持的功能不同,某些

19、 Recordset 方法或属性有可能无效。ADOR.Recordset 和 ADODB.Recordset 是用来创建 Recordset 对象的 ProgID。由此产生的 Recordset 对象行为相同,与 ProgID 无关。ADOR.Recordset 随 Microsoft Internet Explorer 安装,而 ADODB.Recordset 则随 ADO 安装。Recordset 对象的行为受环境(即客户端、服务器、Internet Explorer 等)的影响。这些差异将在属性、方法和事件的“帮助”主题中加以说明。在 ADO 中定义了四种不同的游标类型:动态游标 用于查

20、看其他用户所作的添加、更改和删除,并用于不依赖书签的 Recordset 中各种类型的移动。如果提供者支持,可使用书签。键集游标 其行为类似动态游标,不同的只是禁止查看其他用户添加的记录,并禁止访问其他用户删除的记录,其他用户所作的数据更改将依然可见。它始终支持书签,因此允许 Recordset 中各种类型的移动。静态游标 提供记录集合的静态副本以查找数据或生成报告。它始终支持书签,因此允许 Recordset 中各种类型的移动。其他用户所作的添加、更改或删除将不可见。这是打开客户端(ADOR)Recordset 对象时唯一允许使用的游标类型。仅向前游标 除仅允许在记录中向前滚动之外,其行为类

21、似静态游标。这样,当需要在 Recordset 中单程移动时就可提高性能。在打开 Recordset 之前设置 CursorType 属性来选择游标类型,或使用 Open 方法传递 CursorType 参数。部分提供者不支持所有游标类型。请检查提供者的文档。如果没有指定游标类型,ADO 将默认打开仅向前游标。如果 CursorLocation属性被设置为 adUseClient 后打开 Recordset,则在返回的 Recordset 对象中,Field 对象的 UnderlyingValue 属性不可用。对部分提供者(例如 Microsoft ODBC Provider for OLE

22、DB 连同 Microsoft SQL Server),可以通过使用 Open 方法传递连接字符串,根据以前定义的 Connection 对象独立地创建 Recordset 对象。ADO 仍然创建 Connection 对象,但它不将该对象赋给对象变量。不过,如果正在相同的连接上打开多个 Recordset 对象,就应该显式创建和打开 Connection 对象,由此将 Connection 对象赋给对象变量。如果在打开 Recordset 对象时没有使用该对象变量,即使在传递相同连接字符串的情况下,ADO 也将为每个新的 Recordset 创建新的 Connection 对象。可以创建所需

23、数量的 Recordset 对象。打开 Recordset 时,当前记录位于第一个记录(如果有),并且 BOF 和 EOF 属性被设置为 False。如果没有记录,BOF 和 EOF 属性设置是 True。假设提供者支持相关的功能,可以使用 MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法以及 Move 方法,和 AbsolutePosition、AbsolutePage 和 Filter 属性来重新确定当前记录的位置。仅向前 Recordset 对象只支持 MoveNext 方法。当使用 Move 方法访问每个记录(或枚举 Recordset)时,可

24、使用 BOF 和 EOF 属性查看是否移动已经超过了 Recordset 的开始或结尾。Recordset 对象可支持两类更新:立即更新和批更新。使用立即更新,一旦调用 Update 方法,对数据的所有更改将被立即写入基本数据源。也可以使用 AddNew 和 Update 方法将值的数组作为参数传递,同时更新记录的若干字段。如果提供者支持批更新,可以使提供者将多个记录的更改存入缓存,然后使用 UpdateBatch 方法在单个调用中将它们传送给数据库。这种情况应用于使用 AddNew、Update 和 Delete 方法所做的更改。调用 UpdateBatch 方法后,可以使用 Status

25、属性检查任何数据冲突并加以解决。注意 要执行不使用 Command 对象的查询,应将查询字符串传递给 Recordset 对象的 Open 方法。但是,在想要保持命令文本并重复执行或使用查询参数时,仍然需要 Command 对象。3 ADO在 VC+中的具体使用方法 3.1 ADO接口简介 COM把组件应用程序分成了两部分:COM服务器和 COM客户,如图所示。COM服务器的任务就是提供组件模块,而 COM客户就是使用 COM服务器所提供的组件的应用程序。客户必须通过组件的接口才能获得服务器的服务,也就是说客户只能通过接口与组件进行通信。那么什么是接口呢?从客户的角度看,接口就是组件暴露在外部

26、,从而使客户可以访问的方法;从组件的角度看,接口是一组功能相关的函数集合,COM规定,一个组件对象可以拥有多个接口。ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。(1)_ConnectionPtr接口返回一个记录集或一个空指针。通常使用它来创建一个数据连接或执行一条不返回任何结果的 SQL语句,如一个存储过程。但是使用_ConnectionPtr接口返回一个记录集不是一个 客户 服务器 接口 1 接口 2 好的使用方法。对于要返回记录的操作通常用_RecordserPtr来实现。两者的区别则是:_ConnectionPt

27、r操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。(2)_CommandPtr接口返回一个记录集。它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用_CommandPtr接口时,可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。如果只执行一次或几次数据访问操作,使用_CommandPtr接口是比较好的选择。但是如果要频繁访问数据库,并要返回很多记录集,那么,就应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和 SQL语句。(3)_Recor

28、dsetPtr是一个记录集对象。与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。它同_CommandPtr接口一样,不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的 connection成员变量,让它自己创建数据连接。如果要使用多个记录集,最好的方法是同 Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口然后使用_RecordsetPtr执行存储过程和SQL语句。3.2 在 VC 中使用的基本流程及所需代码 为了能更详细的描述我们用 VC+建立一个新的 MFC 应用程序ADOCtrAcc

29、ess,下文所涉及到的语句都以这一应用程序为基础。(1)引入 ADO 库定义文件。在工程中引入库定义文件需要在 StdAfx.h文件中添加一下语句:#import C:Program FilesCommon FilesSystemADOmsado15.dll rename_namespace(ADOCG)rename(EOF,adoEOF)其中 C:Program FilesCommon FilesSystemADOmsado15.dll为系统安装的 ADO 支持文件的路径,这个路径名可以根据自己系统安装的 ADO支持文件的路径来自行设定。当编译器遇到#import语句时,它会为引用组件类型库

30、中的接口生成包装类,#import语句实际上相当于执行了 API涵数 LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句 no_namespace说明 ADO 对象不使用命名空间,rename(“EOF”,“adoEOF”)说明将 ADO 中结束标志 EOF 改为 adoEOF,以避免和其它库中命名相冲突。(2)初始化 COM 库。ADO库是一组 COM动态库,这意味应用程序在调用 AD

31、O前,必须初始化 OLE/COM库环境。在程序初始过程中需要初始化组件,一般可以用 CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的 COM,可以用下面语句 CoUnInitialize();来实现。在 MFC中还可以采用另一种方法来实现初始化 COM,那就是使用 AfxOleInit();语句,使用这一语句便可以自动为我们实现初始化 COM和结束时关闭COM的操作,具体语句如下所示:A 使用 CoInitialize(NULL);语句进行初始化:int CADOCtrAccessView:OnCreate(LPCREATESTRUCT lpCreateStruct

32、):CoInitialize(NULL)AfxEnableControlContainer();return TRUE;B.使用AfxOleInit();语句进行初始化:BOOL CADOCtrAccessApp:InitInstance()if(!AfxOleInit()AfxMessageBox(“OLE 初始化出错!”);return FALSE;(3)连接数据库。打开一个数据库连接。要先用_ConnectionPtr接口创建一个实例指针对象,再用调用 Open 方法打开数据库连接,它将返回一个IUnknown的自动化接口指针。本工程中要连接一个名为 people的Access数据库,具

33、体代码如下:_ConnectionPtr m_pConn;_RecordsetPtr m_pRec;m_pRec.CreateInstance(_uuidof(Recordset);m_pConn.CreateInstance(_uuidof(Connection);try m_pConn-Open(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=people.mdb,adModeUnknown);catch(_com_error e)AfxMessageBox(数据库连接失败,确认数据库是否在当前路径下!);return FALSE;其中 Open

34、方法的原型为:Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options);ConnectionString 为连接字串这里的连接字符串为:“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=people.mdb”,即是通过 JET数据库引擎对 ACCESS数据库连接;UserID 是用户名,Password 是登陆密码,这两项一般为空;Options 是连接选项,用于指定 Connection对象对数据的更新许可权,Options可以是如下几个常量:adModeU

35、nknown:缺省,当前的许可权未设置;adModeRead:只读;adModeWrite:只写;adModeReadWrite:可以读写;adModeShareDenyRead:阻止其它Connection对象以读权限打开连接;adModeShareDenyWrite:阻止其它 Connection对象以写权限打开连接;adModeShareExclusive:阻止其它 Connection对象打开连接;adModeShareDenyNone:允许其它程序或对象以任何权限建立连接。Options的设置要看具体的使用情况,但是一般设为 adModeUnknown。在使用VC+进行ADO操作时建

36、议语句中要常用try.catch()来捕获错误信息,否则 ADO错误会使你的应用程序崩溃。当 ADO发生运行时错误时(如数据库不存在),OLE DB 数据提供者将自动创建一个_com_error对象,并将有关错误信息填充到这个对象的成员变量。(4)打开表、对记录和字段操作。在 VC+中要对表、记录集中的数据和字段进行查询、定义、操纵和控制,就离不开 SQL语句,在 VC+中执行 SQL语句对数据库的操作可以采用多种形式,下面我们一一进行阐述。而要执行 SQL 语句对数据进行操作就要进行数据类型的转换,这是因为 COM 对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,因此 Cstri

37、ng 类和 COM 对象是不兼容的,我们需要一组 API 来转换 COM 对象和 C+类型的数据。_vatiant_t 和_bstr_t 就是这样两种对象。它们提供了通用的方法转换 COM 对象和 C+类型的数据。具体的转换为:short/long/float/double/char*可通过构造函数或直接赋值转换成_variant_t 类型或_bstr_t 类型。_variant_t 可隐式转换为 short/long/float/double,所以可以直接用。_bstr_t 可隐式转换成 char*,所以也可以直接用。_variant_t 与 _bstr_t 可互相直接转换。现在我们就具体的

38、介绍在在 VC+中执行 SQL语句的几种方法:(1)利用 Connection对象的 Execute方法执行 SQL命令 Execute方法的原型如下所示:Execute(_bstr_t CommandText,VARIANT*RecordsAffected,long Options)其中:CommandText 是命令字串,通常是 SQL命令;RecordsAffected 是操作完成后所影响的行数;Options 表示 CommandText中内容的类型;Options可以取如下值之一:adCmdText:表明 CommandText是文本命令;adCmdTable:表明 CommandT

39、ext是一个表名;adCmdProc:表明 CommandText是一个存储过程;adCmdUnknown:未知。Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。void CComManageView:OnDraw(CDC*pDC)CComManageDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);try _variant_t ra;m_pConnection-Execute(CREATE TABLE 学生信息(学号 INTEGER,姓名 TEXT,年龄 INTEGER,生日 DATETIME),&ra,adCmdText);m

40、_pConnection-Execute(INSERT INTO 学生信息(学号,姓名,年龄,生日)VALUES(200605805,王五,22,1982-08-16),&ra,adCmdText);/往表格里面添加记录 m_pRecordset=m_pConnection-Execute(SELECT*FROM pupil,&ra,adCmdText);/执行 SQL命令查询 pupil 表的所有记录/以下是执行 SQL语句结果的输出:pDC-TextOut(350,0,学生信息管理系统);_variant_t vNumber,vName,vSex,vAge,vDept;/定义 pupil表

41、相关的变量 CString sInformation;/数据库信息 int Height=20;/输出的高度 if(!m_pRec-BOF)m_pRecordset-MoveFirst();else AfxMessageBox(表内数据为空);return;while(!m_pRec-adoEOF)/判断是否到表的结尾,到结尾退出循环 vNumber=m_pRec-GetCollect(vNumber);vName =m_pRect-GetCollect(sNumber);vNumber=m_pRec-GetCollect(vNumber);vSex =m_pRecordset-GetColl

42、ect(sSex);vAge =m_pRec-GetCollect(sAge);vDept =m_pRec-GetCollect(sDept);/GetCollect(列名)方法的作用是取得所在列的数据。pDC-TextOut(0,20,学号 姓名 年龄 性别 所在系 );information.Format(%d%-8s%-8s%d%-8s ,vNumber.lVal,(LPCTSTR)(_bstr_t)vName,(LPCTSTR)(_bstr_t)vSex,vAge.lVal,vMemory.lVal,(LPCTSTR)(_bstr_t)vDept);Height=Height+17;p

43、DC-TextOut(0,Height,sInformation);m_pRecordset-MoveNext();/移到下一条记录 catch(_com_error e)AfxMessageBox(e-ErrorMessage();/显示错误信息 m_pRec-Close();(2)利用 Command对象 来执行 SQL命令 使用 Command对象来实现同样的功能的具体语句如下:void CComManageView:OnDraw(CDC*pDC)CComManageDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);try m_pComm.CreateI

44、nstance(ADODB.Command);/创建一个实例 m_pComm-ActiveConnection=m_pConnection;/关键的一句,将建立的连接赋值给它 m_pComm-CommandText=INSERT INTO 学生信息(学号,姓名,年龄,生日)VALUES(200605805,王五,22,1982-08-16);m_pComm-Execute(NULL,NULL,adCmdText);/插入一条新的记录 m_pComm-CommandText=SELECT*FROM pupil;m_pRec=m_pComm-Execute(NULL,NULL,adCmdText)

45、;/查询 pupil表的所有记录/以下是执行 SQL语句结果的输出:pDC-TextOut(350,0,学生信息管理系统);_variant_t vNumber,vName,vSex,vAge,vDept;/定义 pupil表相关的变量 CString sInformation;/数据库信息 int Height=20;/输出的高度 if(!m_pRec-BOF)m_pRecordset-MoveFirst();else AfxMessageBox(表内数据为空);return;while(!m_pRec-adoEOF)/判断是否到表的结尾,到结尾退出循环 vNumber=m_pRec-Get

46、Collect(vNumber);vName =m_pRect-GetCollect(sNumber);vNumber=m_pRec-GetCollect(vNumber);vSex =m_pRecordset-GetCollect(sSex);vAge =m_pRec-GetCollect(sAge);vDept =m_pRec-GetCollect(sDept);/GetCollect(列名)方法的作用是取得所在列的数据。pDC-TextOut(0,20,学号 姓名 年龄 性别 所在系 );information.Format(%d%-8s%-8s%d%-8s ,vNumber.lVal,

47、(LPCTSTR)(_bstr_t)vName,(LPCTSTR)(_bstr_t)vSex,vAge.lVal,vMemory.lVal,(LPCTSTR)(_bstr_t)vDept);Height=Height+17;pDC-TextOut(0,Height,sInformation);m_pRecordset-MoveNext();/移到下一条记录 catch(_com_error e)AfxMessageBox(e-ErrorMessage();/显示错误信息 m_pRec-Close();(3)直接用 Recordset对象进行查询取得记录集 使用 Rescordset对象执行 S

48、QL语句主要是使用它的 Open方法,Open方法的原型如下:Open(const _variant_t&Source,const _variant_t&ActiveConnection,enum CursorTypeEnum CursorType,enum LockTypeEnum LockType,long Options)其中:Source是数据查询字符串;ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象);CursorType光标类型,它可以是以下值之一,具体取值如下:adOpenUnspecified=-1,

49、不作特别指定;adOpenForwardOnly=0,前滚静态光标。这种光标只能向前浏览记录集,比如用 MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用;adOpenKeyset=1,/采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的;adOpenDynamic=2,/动态光标。所有数据库的操作都会立即在各用户记录集上反应出来;adOpenStatic=3/静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的

50、记录集来说是不可见的;LockType锁定类型,它可以是以下值之一:adLockUnspecified=-1,/未指定;adLockReadOnly=1,/只读记录集;adLockPessimistic=2,/悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制;adLockOptimistic=3,/乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作;adLockBatchOptimistic=4,/乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成;Options请参考本文中对 Connection对象的

51、Execute方法的介绍。使用 Open方法的具体语句如下:void CComManageView:OnDraw(CDC*pDC)CComManageDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);try m_pRecordset.CreateInstance(ADODB.Recordset);/创建一个实例 m_pRec-Open(SELECT*FROM pupil,_variant_t(IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);/查询 pupil表的所有

52、记录/以下是执行 SQL语句结果的输出:pDC-TextOut(350,0,学生信息管理系统);_variant_t vNumber,vName,vSex,vAge,vDept;/定义 pupil表相关的变量 CString sInformation;/数据库信息 int Height=20;/输出的高度 if(!m_pRec-BOF)m_pRecordset-MoveFirst();else AfxMessageBox(表内数据为空);return;while(!m_pRec-adoEOF)/判断是否到表的结尾,到结尾退出循环 vNumber=m_pRec-GetCollect(vNumbe

53、r);vName =m_pRect-GetCollect(sNumber);vNumber=m_pRec-GetCollect(vNumber);vSex =m_pRecordset-GetCollect(sSex);vAge =m_pRec-GetCollect(sAge);vDept =m_pRec-GetCollect(sDept);/GetCollect(列名)方法的作用是取得所在列的数据。pDC-TextOut(0,20,学号 姓名 年龄 性别 所在系 );information.Format(%d%-8s%-8s%d%-8s ,vNumber.lVal,(LPCTSTR)(_bst

54、r_t)vName,(LPCTSTR)(_bstr_t)vSex,vAge.lVal,vMemory.lVal,(LPCTSTR)(_bstr_t)vDept);Height=Height+17;pDC-TextOut(0,Height,sInformation);m_pRecordset-MoveNext();/移到下一条记录 catch(_com_error e)AfxMessageBox(e-ErrorMessage();/显示错误信息 m_pRec-Close();通过对以上三种方法的对比我们知道,在执行 SQL语句后一般都要使用 Recordset对象对执行结果进行操纵,因此我们一般都是用Recordset对象对表和数据集进行 SQL操纵。鉴于此我们在认识一些Recordset对象的常用方法:(1)A ddNew()创建可更新 Recordset 对象的新记录。一般和PutCollect(“列名”,“数据”)结合使用:m_pRecordset-AddNew();/添加新记录 m_pRec-PutCollect(姓名,_variant_t(王斌年);(2)(5)使用完毕后关闭连接释放对象和关闭初始化的 COM。void CADOCtrAccessView:OnDestroy()CListView:OnDestroy();CoUnInitialize();

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!