友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
VC语言6.0程序设计从入门到精通-第52部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
…………………………………………………………Page 359……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
所示。
表 12…8 域对象的方法及其说明
方法 说明
可将二进制或字符数据填写到域对象中,在系统内存有限的情况下,可使用此方
AppendChunk
法对长整型值进行部分操作
检索域对象部分或全部二进制或字符数据,在系统内存有限的情况下,可使用此
GetChunk
方法处理部分长整型值
表 12…9 域对象的属性及其说明
属性 说明
ActualSize 指示字段的值的实际长度
Attributes 域的属性集合,可以用来判断此域是否有固定长度或者是否可以为空
DefinedSize 确定 Field 对象的数据容量
Name 列的名称
NumericScale 在浮点数中用于指出小数点右边多少位
OriginalValue 发生任何更改前已在记录中存在的 Field 的值
Precision 表示数字 Field 对象的精度
Type 列中的值的数据类型
UnderlyingValue 反映了数据源中列的当前值,当在事务的同步时被使用
Value 列的值,用来查询或者设置此列的值
2 .参数对象
Parameter 对象代表基于参数化查询或存储过程的 mand 对象相关联的参数,它的常
用方法和属性分别如表 12…10 和表 12…11 所示。
表 12…10 参数对象的方法及其说明
方法 说明
可将二进制或字符数据填写到域对象中,在系统内存有限的情况下,可使用此方
AppendChunk
法对长整型值进行部分操作
表 12…11 参数对象的属性及其说明
属性 说明
表示参数的特性,这个属性包含几个字节标志的组合,标志用于指示参数是否有
Attributes
符号
指示 Parameter 所标明的是输入参数、输出参数还是二者都是,或该参数是否为
Direction
存储过程的返回值
Name 参数对象的名称
NumericScale 在浮点数中用于指出小数点右边用于表示这个值的位数
Precision 确定表示参数对象数字值的精度
Type 列中的值的数据类型
Size 表示 Parameter 对象的大小
Value 包含分配给参数的实际值
3 .属性对象
Property 对象代表由提供者定义的 ADO 对象的动态特性,它包括内置属性和动态属性两
种类型。
内置属性是在 ADO 中实现并立即可用于任何新对象的属性,它们不会作为 Property 对
·348 ·
…………………………………………………………Page 360……………………………………………………………
第 12 章 数据库开发
象出现在对象的 Properties 集合中。可以更改它们的值,但不能更改它们的特性。
动态属性由现行数据提供者定义,并出现在相应的 ADO 对象的 Properties 集合中。动态
Property 对象有 4 个内置属性:
o Name 属性是标识属性的字符串;
o Type 属性是用于指定属性数据类型的整数;
o Value 属性是包含属性设置的变体型;
o Attributes 属性是指示特定于提供者属性特征的长整型值。
4 .错误对象
Error 对象用于获得连接对象所发生的详细错误信息,它的主要属性如表 12…12 所示。
表 12…12 错误对象的属性及其说明
属性 说明
Description 获得错误的简要说明
NativeError 获得对特殊的 Error 对象检索特定数据库的错误信息
Number 确定发生错误的类型,该属性的值是与错误条件对应的惟一数字
Source 确定产生错误的原始对象或应用程序的名称,该名称可以是对象的类名或编程 ID
SQLState 读取由提供者在处理 SQL 语句过程中出现错误时返回的 5 个字符的错误代码
12。5。5 集合
ADO 有 4 个集合,分别是域集合 Fields 、参数集合 Parameters 、属性集合 Properties 以及
错误集合 Errors 。
1.域集合
Fields 集合包含 Recordset 对象的所有 Field 对象,它的常用方法和属性分别如表 12…13
和表 12…14 所示。
表 12…13 域集合的方法及其说明
方法 说明
Append 添加新的 Field 对象到 Fields 集合中
Delete 从 Fields 集合中删除 Field 对象
Refresh 更新 Fields 集合中的 Field 对象
Item 返回 Fields 集合中的 Field 对象
表 12…14 域集合的属性及其说明
属性 说明
Count 确定给定 Fields 集合中 Field 对象的数目
2 .参数集合
Parameters 集合包含 mand 对象的所有 Parameter 对象,它的常用方法和属性分别如
表 12…15 和表 12…16 所示。
·349 ·
…………………………………………………………Page 361……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
表 12…15 参数集合的方法及其说明
方法 说明
Append 添加新的 Parameter 对象到 Parameters 集合中
Delete 从 Parameters 集合中删除 Parameter 对象
Refresh 更新 Parameters 集合中的 Parameter 对象
Item 返回 Parameters 集合中的 Parameter 对象
表 12…16 参数集合的属性及其说明
属性 说明
Count 确定给定 Parameters 集合中 Parameter 对象的数目
3 .属性集合
Properties 集合包含特定对象实例的所有 Property 对象,它的常用方法和属性分别如表
12…17 和表 12…18 所示。
表 12…17 属性集合的方法及其说明
方法 说明
Refresh 更新 Properties 集合中的 Property 对象
Item 返回 Properties 集合中的 Property 对象
表 12…18 属性集合的属性及其说明
属性 说明
Count 确定给定 Properties 集合中 Property 对象的数目
4 .错误集合
Errors 集合包含为响应涉及提供者的单个错误而创建的所有 Error 对象,它的常用方法和
属性分别如表 12…19 和表 12…20 所示。
表 12…19 错误集合的方法及其说明
方法 说明
清空 Errors 集合中的全部 Error 对象,发生错误时,ADO 会自动清空 Errors 集合,
Clear
并用新的 Error 对象填充 Errors 集合
Item 返回 Errors 集合中的 Error 对象
表 12…20 错误集合的属性及其说明
属性 属性
Count 确定给定 Errors 集合中 Error 对象的数目
12。6 数据库操作
本节将给出一个具体的利用 ADO 技术操作数据库的实例,通过这个实例,读者对 ADO
技术会有更进一步的了解。
·350 ·
…………………………………………………………Page 362……………………………………………………………
第 12 章 数据库开发
12。6。1 动态链接库的引入和 OLE/ 库的初始化
利用 ADO 技术编写程序,首先要告诉编译器去什么地方找 ADO 的库文件,通常这个文
件在 c:program filesmon filessystemado 下,文件名为 msado15。dll 。因此,第一步应该
在文件“stdafx。h ”的开头加上如下语句:
#import 〃c:program filesmon filessystemadomsado15。dll〃 no_namespace rename(〃EOF〃; 〃adoEOF〃)
使用 no_namespace 意味着程序员不需要在初始化变量的时候引用名字空间,最后的操作
表明将 EOF 更名为 adoEOF,如果不这样做,在程序中很可能会碰到常量冲突。
将 ADO 的动态链接库引入后,在正式用 ADO 编写程序前,还需要对 OLE/ 库初始
化,代码如下:
CoInitialize( NULL );
12。6。2 ADO 与数据库的连接
引入 ADO 库并初始化 OLE/ 后,接下来要进行 ADO 与数据库的连接。
ADO 与数据库连接时,有一个最重要的数据类型,即_ConnectionPtr ,它实际上就是由
类模板__ptr_t 而得到的一个具体的实例类。_ConnectionPtr 类封装了 Connection 对象的
Idispatch 接口指针,及一些必要的操作,通过这个指针便可以操纵 Connection 对象。通常的
连接实现方式如下:
_ConnectionPtr conn;
conn。CreateInstance(__uuidof(Connection));
conn…》Open(BSTR ConnectionString; BSTR UserID; BSTR Password; long Options);
各参数意义如下:
o ConnectionString :最关键的参数,它表明了要连接的数据源,在本章中采用的是 Access
数据库,它的格式一般为: 〃Provider=Microsoft。Jet。OLEDB。4。0;Data Source=db。mdb〃,
至于其他数据库,请读者参考相关资料;此外,ConnectionString 还可以是数据源的名
字。
o UserID :用户名,如果 ConnectionString 中已经包含,则可以为空。
o Password :密码,如果 ConnectionString 中已经包含,则可以为空。
o Options :表示是以同步方式(adConnectUnspecified)还是以异步方式(adAsyncConnect)
进行连接,默认为同步。
具体的,有以下两种实现连接的方式:
(1)LPCSTR strConnect = 〃Provider=Microsoft。Jet。OLEDB。4。0;Data Source=test。mdb〃;
conn…》Open(strConnect; 〃〃; 〃〃; adConnectUnspecified);
(2 )conn…》Open(〃DSN=DataSourceName〃; 〃〃; 〃〃; adConnectUnspecified);
对于本章的例子,要连接的数据库就是在第 2 节创建的数据库 Info。mdb (数据源也在第
2 节已经设置好),则连接语句如下:
_ConnectionPtr m_connection;
//创建实例
m_connection。CreateInstance(__uuidof(Connection) );
·351 ·
…………………………………………………………Page 363……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
//根据连接字符串开启数据连接
m_connection…》Open( 〃DSN=Information〃; 〃〃; 〃〃; …1);
12。6。3 获得和遍历记录集
建立连接后,便可以创建一个 ADO 记录集。在得到记录集之前,需要先声明一个
_RecordsetPtr 型变量,然后创建记录集的实例:
_Recordset m_Recordset;
//创建实例
m_Recordset。CreateInstance(__uuidof(Recordset));
这里_RecordsetPtr 的来历类似于_ConnectionPtr ,也是由类模板__ptr_t 而得到的一个
具体的实例类。
一般说来,打开记录集有 3 种方式。
1.利用 Connection 对象的 Execute()方法执行 SQL 命令
Execute()方法的原型如下:
Execute (_bstr_t mandText; VARIANT* RecordsAffected; long Options)
各参数意义如下:
o mandText :命令字串,通常是 SQL 语句。
o RecordsAffected :操作完成后影响的行数。
o Options :mandText 中内容的类型。取值为 adCmdText 表明是文本命令;取值为
adCmdTable 表明是一个表名;取值为 adCmdProc 表明是一个存储过程。
假设 m_Connection 和 m_Recordset 分别是创建好的连接对象和记录集对象,则利用
Connection 对象的 Execute()方法打开记录集代码如下:
_variant RecordsAffected;
m_Connection…》Execute(“select * from Contact”; &RecordsAffected; adCmdText);
2 .利用 mand 对象执行 SQL 命令
当要执行复杂的命令以及执行带参数的命令时,要使用命令对象对数据源进行操作。一
般的,利用 mand 对象打开记录集代码如下:
_mandPtr m_mand;
//创建实例
m_mand。CreateInstance(〃ADODB。mand〃);
//指向当前连接
m_mand…》ActiveConnection = m_Connection;
//设置命令字串
m_mand…》mandText = 〃select *from Contact〃;
//执行命令,打开记录集
m_Recordset = m_mand…》Execute(&vNULL; &vNULL; adCmdText);
·352 ·
…………………………………………………………Page 364……………………………………………………………
第 12 章 数据库开发
3 .直接利用 Recordset 对象打开记录集
利用 Recordset 的 Open()方法,可以方便的打开一个记录集。Open()方法的原型如下:
Open(VARIANT Source; VARIANT ActiveConnection ; CursorTypeEnum CursorType;LockTypeEnum
LockType ; LONG Options)。
各参数意义如下:
o Source:通常是对数据库进行操作的 SQL 语句,但具体还要看第 5 个参数的取值;
o ActiveConnection :表示当前的数据连接。
o CursorType :记录集光标类型,它的取值如表 12…21 所示。
o LockType :用于指示在什么时候锁定记录,取值如表 12…22 所示。
o Options :操作类型,取值如表 12…23 所示。
表 12…21 光标类型 CursorType
取值 意义
adOpenForwardOnly 指向前游标,默认值。除了只能在记录中向前滚动外,与静态游标相同
键集游标。用户自己的记录集不能访问其他用户删除的记录,无法查看其他
。adOpenKeyset
用户添加的记录,但仍然可以看见其他用户更改的数据
动态游标。可以看见其他用户所作的添加、更改和删除。允许在记录集中进
adOpenDynamic
行所有类型的移动,但不包括提供者不支持的书签操作
静态游标。可以用来查找数据或生成报告的记录集合的静态副本。另外,对
adOpenStatic
其他用户所作的添加、更改或删除不可见
表 12…22 锁定类型 LockType
取值 意义
AdLockReadOnly (默认值)只读,不能改变数据
保守式锁定(逐个),提供者完成确保成功编辑记录所需的工作,通常通过在
AdLockPessimistic
编辑时立即锁定数据源的记录
开放式锁定(逐个),提供者使用开放式锁定,只在调用 Update()方法时才锁
AdLockOptimistic
定记录
AdLockBatchOptimistic 开放式批更新。用于批更新模式(与立即更新模式相对)
表 12…23 操作类型 Options
取值 意义
adCmdText 指示 strSQL 为命令文本,即普通的 SQL 语句
adCmdTable 指示 ADO 生成 SQL 查询以便在 strSQL 命名的表中返回所有行
adCmdTableDirect 指示所作的更改在 strSQL 中命名的表中返回所有行
adCmdStoredProc 指示 strSQL 为存储过程
adCmdUnknown 指示 strSQL 参数中的命令类型为未知
adCmdFile 指示应在 strSQL 命名的文件中恢复保留(保存的)Recordset
adAsyncExecute 指示应异步执行 strSQL
指示在提取 Initial Fetch Size 属性中指定的初始数量后,应该异步提取所有
adAsyncFetch
剩余的行。如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用
指示主要线程在提取期间从未堵塞。如果所请求的行尚未提取,当前行自动
adAsyncFetchNonBlocking
移到文件末尾
下面是一段利用 Recordset 的 Open()方法打开记录集的代码:
_Recordset m_recordSet;
//创建实例
m_recordSet。CreateInstance(__uuidof(Recordset));
·353 ·
…………………………………………………………Page 365……………………………………………………………
Visual C++ 6。0 程序设计�
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!