RemoteData 控件

通过被绑定的控件提供对存储在远程 ODBC 数据源中数据的存取。RemoteData 控件允许在某一结果集的行与行之间移动，并且允许显示和操作来自于被绑定的控件各行里的数据。

语法

RemoteData

说明

RemoteData 控件在远程数据对象 (RDO)和数据识别的被绑定的控件之间提供了接口。通过 RemoteData 控件，能够：

  • 建立起与基于其本身属性的数据源的连接。

  • 创建 rdoResultset。

  • 把当前行的数据传送给相应被绑定的控件。

  • 允许对当前行指针进行定位。

  • 将对被绑定的控件所做的任何更改反传给数据源。

概述

若是没有 RemoteData 控件，则 Data 控件或其等价物，即窗体上的数据识别（被绑定的）控件就不能自动存取数据。RemoteData 控件和 Data 控件是 DataSource 控件的例子。利用 DataSource 控件在根本不用写任何代码的情况下就能执行大部分远程数据存取操作。被绑定在 DataSource 控件上的数据识别控件，能自动显示来自于当前行某一列或数列的数据，或者在某些情况下，能显示当前行在任一侧时、一组行的某一列或数列的数据。DataSource 控件执行当前行的所有操作。

DataSource 控件：RemoteData

如果发指令要求 RemoteData 控件移动到另一行，则所有被绑定的控件应自动地把所做的任何更改传送给 RemoteData 控件，以便将它们存储到 ODBC 数据源。然后 RemoteData 控件移动到所需要的行，并且把当前行数据回传给显示它的被绑定的控件。

RemoteData 控件能自动处理一些意外事件，包括空结果集，增加新行，编辑和更新现有行，转换和显示复杂数据类型，以及处理某些类型的错误等。然而，在更完善的应用程序中，必须捕获 RemoteData 控件不能处理的错误情况。例如，如果远程服务器在访问数据源时出现错误、权限不够、或者查询不能按照编码执行，等等，都会产生可捕获的错误。如果错误出现在应用程序过程开始之前，或者作为某些内部错误的结果，则将触发 Error 事件。

操作

为了描述数据源，建立连接，并指明要创建的游标类型，应使用 RemoteData 控件属性。一旦创建了结果集合，若是改变这些属性，就要用 Refresh 方法来重建基于新属性设置的基本的 rdoResultset。

很多方面 RemoteData 控件的行为与 Jet 驱动的 Data 控件相似。下面的一些准则表明了在设置 SQL 属性时两者的微略不同。

可以象处理 Data 控件的 RecordSource 属性那样处理 RemoteData 控件的 SQL 属性，只是后者不能自己接受表的名称，除非首先移居到 rdoTables 集合中。一般说来，SQL 属性指定一个 SQL 查询。例如，不是给出准确的“Authors”，而是编制可提供同样功能的代码“SELECT * FROM AUTHORS”。不过，这种指定一个表的方式并不是好的编程实践，因为它倾向于返回太多的行，并易于耗尽工作站资源或者使数据库中的大量区段锁定。

RemoteData 控件创建的结果集合与 Data 控件创建的 Recordset 在顺序上可能不同。例如，如果 Data 控件的 RecordSource 属性被设置为“Authors”，而 RemoteData 控件的 SQL 属性被设置为“SELECT * FROM AUTHORS”，则由 Jet 返回给 Data 控件的第一条记录是基于 Authors 表的第一条可用索引。然而，RemoteData 控件返回的是基于数据库中各行物理顺序的、被远程数据库引擎所返回的第一行，而不考虑索引。在某些情况下，上述两种记录的顺序可能相同，但并不总是这样。

这种行为上的差别会影响被绑定的控件—尤其是象 DataGrid 控件那样多行被绑定的控件如何处理结果行。可以用鼠标操纵 RemoteData 控件—在行与行之间移动当前行指针，或者通过单击控件将其移动到 rdoResultset 的开始或结尾。当操作 RemoteData 控件的按钮时，当前行指针在 rdoResultset 被重新定位。不能用鼠标移动到 rdoResultset 的任一端之外。也不能将焦点设置在 RemoteData 控件上。

其它功能

可以利用 RemoteData 控件所创建的对象来创建附加的 rdoConnection，rdoResultset 或者 rdoQuery 对象。

可以把 RemoteData 控件的 Resultset 属性设置为不依赖于该控件而创建的 rdoResultset。若是这样做了的话，该 RemoteData 控件的属性要基于新的 rdoResultset 和 rdoConnection 而重新设置。

可以设置 Options 属性从而允许 rdoResultset (rdAsyncEnable) 的异步创建，或者在无需创建临时存储过程 (rdExecDirect) 而执行查询。

在当前行指针每次重定位之前都将触发 Validate 事件。可以选择接受对被绑定的控件所作的改变或者使用 Validate 事件的 action 参数来取消该操作。

RemoteData 控件也能管理当遇到一个无行的 rdoResultset 时应做些什么。通过改变 EOFAction 属性，可以对 RemoteData 控件编程，以自动进入 AddNew 模式。

注意 如果 Image 控件与在 RemoteData 控件中的一个包含图象的字段绑定，且 RemoteData 控件使用批游标（即，CursorDriver = rdUseClientBatch），则 Image 控件不能显示图象。

计划性操作

为了用 RemoteData 控件有计划的创建 rdoResultset：

  • 为了描述所要求创建的 rdoResultset 的特征应设置 RemoteData 控件的各种属性。

  • 为了开始自动处理或者创建新的 rdoResultset，应使用 Refresh 方法。应抛弃任何已存在的 rdoResultset。

所有 RemoteData 控件的属性和新的 rdoResultset 对象都可能受到独立的有或者没有被绑定的 RemoteData 控件 [image] 的操作处理。每个 rdoConnection 和 rdoResultset 对象都有自己的属性和方法，它们可以与编写过程一起使用。

例如，rdoResultset 对象的 MoveNext 方法可以在 rdoResultset 里从当前行移到下一行。为了使用 RemoteData 控件所创建的 rdoResultset，应调用该方法，可能用到下面的代码：

RemoteData1.Resultset.MoveNext

结果集不能自动更新绑定控件

将一个结果集赋值给 RemoteData 控件 (RDC) 不能更新绑定控件。当将一个控件绑定到 RDC 的结果集时，结果集不能自动显示控件。以下说明此问题：

  1. 启动 Visual Basic 并打开一个标准 EXE 工程。

  2. 引用 RDC.

  3. 将 RDC 放入窗体。

  4. 将 TextBox 控件放入窗体。

  5. 设置下列 TextBox 属性：

    DataSource: MSRDC1

    DataField: au_lname

  6. 将 CommandButton 控件放入窗体并添加以下代码到 Click 事件：
    Dim cn As New rdoConnection
cn.Connect = _
"dsn=pinkpearl;database=rdobugs;uid=rdo;pwd="
cn.EstablishConnection
Set MSRDC1.Resultset = cn.OpenResultset("select * _
from authors]")
  7. 运行工程 (F5)。

  8. 单击 CommandButton。

注意绑定控件不象您预期的那样填充数据。必须发命令 MSRDC1.Refresh 给绑定控件以填充，这样将会使服务器再发送整个结果集。（注意：这在某些情况下会用很长时间）。

要解决该问题，请在设置代码中的结果集之后设置任何绑定控件的数据域。例如，在下列行之后：

Set MSRDC1.Resultset = cn.OpenResultset("select * _
from authors]")

应该添加：

Text1.DataField = "au_lname"

这样将迫使绑定管理器设置并更新绑定，用数据填充绑定控件。

当RDC 使用批游标时，绑定 Image 或 PictureBox 控件不显示图片

在用 Image 或 PictureBox 控件绑定 RDC 中包含图象的字段，同时 RDC 使用批游标 (CursorDriver = rdUseClientBatch)时，注意 Image 或 PictureBox 控件不显示图象。要正确地显示图象，或者将 RDC 的 Options 属性设置为 128 (rdFetchLongColumns)，或者使用另一个不同的游标。

不要使用仅向前结果集

当企图将只向前结果集赋值给 RDC 时，会发生“无效对象”错误。以下说明此情况：

  1. 启动 Visual Basic。

  2. 将 RemoteData 控件放入 Form1。

  3. 通过“工程”菜单的“引用”命令添加一个对 RDO 的引用。

  4. 将下列代码添加入 Form_Load 事件。
    Dim x as new rdoConnection
Dim y as rdoQuery
x.Connect = "DSN=Union;UID=rdo;PWD="
x.EstablishConnection
Set y = x.CreateQuery("Query1", "SELECT * FROM _
authors")
x.Query1
' invalid object error occurs on next line
Set MSRDC1.Resultset = x.LastQueryResults
  5. 按下 F5。

该错误发生的原因在于它使用了不能赋值给 RDC 的仅向前结果集。要将一个结果集赋值给 RDC， 它必须是键集或静态的。例如：

Dim x As New rdoConnection
Dim y As rdoQuery
x.Connect = "DSN=Union;database=rdobugs;UID=rdo;PWD="
  x.EstablishConnection
Set y = x.CreateQuery("Query1", "SELECT * FROM _
  authors")
y.CursorType = rdOpenKeyset
y.LockType = rdConcurRowVer
x.Query1
Set MSRDC1.Resultset = x.LastQueryResults


Topic Not Found

未找到该主题

未找到相匹配的主题。可能的原因和解决方法如下：

  • 包含目标主题的文件 (.chm) 没有位于指定的位置。

    解决方法：重新运行 MSDN Library的安装。

  • 包含当前主题或目标主题的文件 (.chm) 已经过时，并且链接不再有效。

    解决方法：安装最新版本的 MSDN Library。

  • MSDN Library CD 不在 CD-ROM 中。

    解决方法：将 MSDN Library CD 装入 CD-ROM 中。


分离结果集

与特定连接不关联的 rdoResultset 对象。分离结果集基本上变成静态快照类型数据。它是可更新的，但是在 rdoResultset 与特定的连接重新关联之前，不把改变传递到远程数据库中。


多结果集查询

一个查询，它包含一个以上选定查询并返回不只一个结果集。多结果集查询还可包含由选定和动作查询组成的组合。


开放式批处理

开放式批是行的集合，它们被提交到远程服务器，作为工作单元来处理。在这种情况下，假定没有什么更新或插入冲突的可能。


参数化查询

在执行前需要一个或多个参数的查询。例如，引用用户支持的特定部分数的 SQL 语句将使用参数化的查询，以执行之前向该 SQL 语句插入用户提供的参数，使查询引用那个特定部分。


结果集

查询的结果。当查询含有 SELECT 语句时，结果集可能含有行。动作查询不返回行，而且返回一个结果集，该集包含了象受到影响的行的操作信息。


独立对象

在 RDO 中可以创建 rdoConnection 和 rdoQuery 对象，需要使用：

Dim X as New rdoxxxx

若做到这一点，就创建了独立对象。这些对象属性与访问连接或其它对象无关，可进行操作。


hEnv 属性示例

下例是说明当访问 ODBC API 函数时， hEnv 属性的使用方法。这个代码显示在 ListBox 控件中的所有已登录的数据资源名 (DSNs) 。

Private Sub ShowDSNs_Click()
Dim fDirection As Integer
Dim szDSN As String * 1024
Dim cbDSNMax As Integer
Dim pcbDSN As Integer
Dim szDescription As String * 1024
Dim cbDescriptionMax As Integer
Dim pcbDescription As Integer
Dim Item As String
Set En = rdoEnvironments(0)
fDirection = SQL_FETCH_NEXT
cbDSNMax = 1023
cbDescriptionMax = 1023
List1.Clear
I = SQL_SUCCESS
 While I = SQL_SUCCESS
     szDSN = String(1024, " ")
     szDescription = String(1024, " ")
     I = SQLDataSources(En.hEnv, fDirection, szDSN, _
     cbDSNMax, pcbDSN, szDescription, _
     cbDescriptionMax, pcbDescription)
     Item = Left(szDSN, pcbDSN) & " - "  _
      & Left(szDescription, pcbDescription)
     Debug.Print Item
     List1.AddItem Item
 Wend

End Sub


Attributes属性常数

这些常数与 Attributes 属性一起使用来确定特定的 rdoColumn 对象的特征。

常数 | 值 | 描述
rdFixedColumn | 1 | 列的大小是固定的（对数字列为缺省）。 对于字符列，它表示该列被定义为 rdTypeCHAR 类型。
rdVariableColumn | 2 | 列的大小是可变的（只对字符列而言）。 表示该列被定义为 rdTypeVARCHAR 类型。
rdAutoIncrColumn | 16 | 新行的列值自动地增加到一个唯一的 Long 整数，该整数不可变。
rdUpdatableColumn | 32 | 列值可以改变。
rdTimestampColumn | 64 | 列被定义为系统管理的 TimeStamp。


BOFAction 属性常数

这些常数与 RemoteData 控件的 BOFAction 属性一起使用来确定当rdoResultset 对象的 BOF 属性改变状态时 RDO 如何动作。

常数 | 值 | 描述
RdMoveFirst | 0 | MoveFirst（缺省）：将第一行作为当前行 。
RdBOF | 1 | BOF：移过 rdoResultset 的开头，触发RemoteData 控件第一行的败 Validate 事件，接着是在无效的 (BOF) 行上的 Reposition 事件。这时，在 RemoteData 控件上的“向前移动”按钮无效。


CursorDriver、rdoDefaultCursorDriver 属性常数

这些常数用于确定 ODBC 驱动程序管理器选取哪类 RDO 游标库。

常数 | 值 | 描述
rdUseIfNeeded | 0 | ODBC 驱动程序将选取适当的游标样式。如果服务器端的游标可供使用，则使用它。
RdUseOdbc | 1 | RDO 层使用ODBC 游标库。对于小的结果集来说这样做会得到较好的性能，但对于大的结果集来说性能则会迅速地下降。
rdUseServer | 2 | 使用服务器端的游标。对于大多数大的操作，这样做会得到较好的性能，但会导致更多的网络通信。
rdUseClientBatch | 3 | 使用用于批更新操作的客户端批处理游标库，。
rdUseNone | 4 | 不打开游标。创建只向前的、只读的单行结果集。这是使用数据访问获取技术，它类似于 VBSQL 和 ODBC API 访问方法使用的获取技术。


Direction 属性常数

这些常数用于确定各个参数在用于参数查询时是如何处理的。

常数 | 值 | 描述
rdParamInput | 0 | （缺省）该参数用于把信息传送到过程。
rdParamInputOutput | 1 | 该参数用于把信息传入或传出过程。
rdParamOutput | 2 | 该参数用于作为 SQL中的一个输出参数从过程返回信息。
rdParamReturnValue | 3 | 该参数用于从过程传送返回值。


EditMode 属性常数

这些参数用于确定 RDO EditMode 属性的状态。

常数 | 值 | 描述
rdEditNone | 0 | 当前无编辑操作在进行。
RdEditInProgress | 1 | 已经调用 Edit 方法，并且当前行在复制缓冲区中。
rdEditAdd | 2 | 已经调用 AddNew 方法，并且拷贝缓冲区中的当前行是新行，它尚未被保存在数据库中。


EOFAction 属性常数

这些常数与 RemoteData 控件的 EOFAction 属性一起使用来确定RDO在rdoResultset 对象的 EOF 属性改变状态时如何动作。

常数 | 值 | 描述
rdMoveLast | 0 | MoveLast（缺省）：保持最后一行为当前行。
rdEOF | 1 | EOF：移过 rdoResultset 的末尾，触发在最后一行上RemoteData 控件的 Validate 事件，接着是在无效的 (EOF) 行上的 Reposition 事件。这时，RemoteData 控件上的“移到下一个” 按钮无效。
rdAddNew | 2 | AddNew：移过最后一行，触发 RemoteData 控件的 Validate 事件，使它发生在当前行，接着是自动的AddNew，然后是新行上的 Reposition 事件。


Error 事件常数

这些常数用于确定 RDO 应如何处理 Error 事件产生的信息。它们应用于 CancelDisplay 参数。

常数 | 值 | 描述
rdDataErrContinue | 0 | 继续但不自动显示错误信息。
rdDataErrDisplay | 1 | （缺省）显示错误信息。


Prompt 属性、OpenConnection, EstablishConnection 方法提示参数常数

这些常数用于确定ODBC 驱动程序管理器在使用 OpenConnection 或 EstablishConnection 方法建立一个连接或使用 RemoteData 控件时如何提示用户。

常数 | 值 | 描述
rdDriverPrompt | 0 | 驱动程序管理器显示 ODBC (开放数据库连接)的数据源对话框。用于建立连接的连接字符串由用户通过对话框选定和完成的数据源名称 (DSN) 来构成。或者，如果没有选取 DSN 并且 DataSourceName 属性是空的，则使用缺省的 DSN。
rdDriverNoPrompt | 1 | 驱动程序管理器使用在 connect 时提供的连接字符串。如果没有足够的信息，则 OpenConnection 方法返回一个可以捕获的错误。
rdDriverComplete | 2 | 如果提供的连接字符串包含 DSN 关键字，则驱动程序管理器将用象在 connect 中提供的那种字符串，否则它将象rdDriverPrompt 被指定时那样动作。
rdDriverCompleteRequired | 3 | （缺省）与 rdDriverComplete 的行为类似，除了驱动程序由于任何不许可的信息而禁止控件完成连接外。


OpenResultset 方法的 LockType 参数、LockType 属性常数

这些常数用于确定 RDO 如何管理用 OpenResultset 方法或 RemoteData 控件创建的 rdoResultset 对象的并发操作。

常数 | 值 | 描述
rdConcurReadOnly | 1 | （缺省）游标是只读的。不允许更新。
rdConcurLock | 2 | 保守式并发。游标使用最低层的锁足以保证行能被更新。
rdConcurRowVer | 3 | 基于行 ID 的开放式并发。游标比较旧行和新行中的行 ID 来确定该行在最近访问后是否进行过改变。
rdConcurValues | 4 | 基于行值的开放式并发。游标比较旧行和新行中的数据值来确定在最近访问该行后是否进行过改变。
rdConcurBatch | 5 | 开放式批处理方式操作。只能在CursorDriver设置为rdUseClientBatch时使用。


OpenResultset 方法的类型参数、 ResultsetType 和 Type 属性常数

这些常数用于确定由选定的游标库创建的游标的类型。

常数 | 值 | 描述
rdOpenForwardOnly | 0 | 打开一个仅向前类型 rdoResultset 对象。（缺省）
rdOpenKeyset | 1 | 打开一个键集类型 rdoResultset对象。
rdOpenDynamic | 2 | 打开一个动态类型 rdoResultset 对象。
rdOpenStatic | 3 | 打开一个静态类型 的 rdoResultset 对象。


Options 属性、Execute和OpenResultset方法选项参数常数

这些常数用于确定 RDO 应如何处理 Execute 和 OpenResultset 方法以及使用 RemoteData 控件建造 rdoResultset 对象。

常数 | 值 | 描述
rdAsyncEnable | 32 | 异步地执行操作。
rdExecDirect | 64 | 使用 SQLExecDirect 而不是 SQLPrepare/ SQLExecute 来执行查询。rdoQuery 对象的 Prepared 属性也控制这个功能。
rdFetchLongColumns | 128 | 下载长字符和长二进制列的所有数据。


Type 属性、rdoQuery 对象常数

这些常数用于确定特定 rdoQuery 对象的功能。

常数 | 值 | 描述
rdQSelect | 0 | 该查询包含一个或多个选择语句。
rdQAction | 1 | 该查询包含一个或多个更新、插入或删除语句。
rdQProcedures | 2 | 该查询是一个或多个存储过程调用。
rdQCompound | 3 | 该查询包含动作和选择语句。


rdoLocaleID 属性常数

这些常数用于确定在生成错误信息时 RDO 应使用哪种语言。

常数 | 值 | 描述
RdLocaleSystem | 0 | 系统
RdLocaleEnglish | 1 | 英语
RdLocaleFrench | 2 | 法语
rdLocaleGerman | 3 | 德语
rdLocaleItalian | 4 | 意大利语
rdLocaleJapanese | 5 | 日语
rdLocaleSpanish | 6 | 西班牙语
rdLocaleChinese | 7 | 汉语
rdLocaleSimplifiedChinese | 8 | 简体汉语
rdLocaleKorean | 9 | 朝鲜语


远程数据常数

RDO 提供可以与方法、属性和事件一起使用的内置常数。这些常数都以字母 "rd" 开始并和用到它们的事件、方法或属性一起编制文档说明。这些常数也与RemoteData 控件属性一起使用。

可以使用对象浏览器来浏览内置常数的列表。从“视图”菜单选择“对象浏览器”并选定适当的库。滚动对话框的“类”部分的列表来查看常数组。为了查找特定的常数，使用搜索窗口来定位指定的群组或常数。

远程数据常数 | 描述 - 确定：
Attributes 属性 | RdoColumn 对象特征
BOFAction 属性 | 文件开始选项
CursorDriver 属性 | 游标库的类型
Column Status | 批处理方式更新的列状态
Data Type | 数据类型
Direction | 参数类型
EditMode | Edit 或 AddNew 状态
EOFAction | 文件结束选项
Error Event | 错误信息处理
LookType | 并发管理的类型
Option | 处理选项
Prompt | ODBC 驱动程序管理器提示
QueryType | 查询类型
RdoDefaultCursorDriver 属性 | 游标库的类型
RdoLocaleID | 错误信息语言
ResultsetType | 游标类型
Row Status | 批处理方式更新的行状态
SQLRetCode | ODBC 返回码
Status (rdoColumn) | 批处理方式更新的列状态
Status (rdoResultset) | 批处理方式更新的行状态
Type (rdoColumn, rdoParameter) | 数据类型
Type (rdoQuery) | 查询函数
UpdateCriteria | 批更新的 WHERE 子句
UpdateOperation | 批更新操作
UpdateReturnCode | 批更新完成状态
Validate | 数据有效性检查常数


ReturnCode 参数常数

这些常数用于确定 RDO 在启动 WillUpdateRows 事件时如何管理更新的操作。ReturnCode 参数用来通知 RDO 用户代码在事件过程中做了什么。

常数 | 值 | 描述
rdUpdateSuccessful | 0 | 开发者处理更新并获得成功。
rdUpdateWithCollisions | 1 | 开发者处理更新并获得成功，但某些行产生了冲突（仅在批方式）。
rdUpdateFailed | 2 | 开发者试图处理更新，但在进行时发生了错误。
rdUpdateNotHandled | 3 | 开发者没有处理更新，RDO 应继续通知，如果没有人处理更新，RDO 应自己更新数据。


SqlRetCode 属性常数

这些常数用于确定最近的 RDO 操作是如何进行的，就象 rdoError 对象中指明的那样。

常数 | 值 | 描述
rdSQLSuccess | 0 | 操作成功。
rdSQLSuccessWithInfo | 1 | 操作成功且有附加信息可用。
rdSQLNoDataFound | 100 | 无附加数据可用。
rdSQLError | -1 | 执行操作时发生了错误。
rdSQLInvalidHandle | -2 | 提供的句柄无效。


Status 属性、rdoColumn 对象常数

这些常数用于确定特定的 rdoColumn 对象是如何受最近的 BatchUpdate 方法影响的。

常数 | 值 | 描述
rdColUnmodified | 0 | 该列还未修改或已经成功地进行了更新。
rdColModified | 1 | 该列已经修改。


Status 属性、rdoResultset 对象常数

这些常数用于确定特定的 rdoResultset 行是如何受最近的 BatchUpdate 方法影响的。

常数 | 值 | 描述
rdRowUnmodified | 0 | 该行还未修改或已经成功地进行了更新。
rdRowModified | 1 | 该行已经修改但还没有在数据库中更新。
rdRowNew | 2 | 该行已经用 AddNew 方法插入但还未 插入到数据库中。
rdRowDeleted | 3 | 该行已被删除但在数据库中还未删除。
rdRowDBDeleted | 4 | 该行已经在本地和 数据库中删除。


Type 属性、rdoColumn、rdoParameter 对象常数

这些常数用于确定 rdoResultset 对象的特定列的数据类型。

常数 | 值 | 描述
rdTypeCHAR | 1 | 长为 n (1≤ n ≤254)的固定长字符串。 由Size 属性设置长度。
rdTypeNUMERIC | 2 | 具有精度 p 和标度 s (1 ≤ p ≤15; 0 ≤ s ≤ p) 的带符号的、精确的数字值。
rdTypeDECIMAL | 3 | 具有精度 p 和标度 s (1 ≤ p ≤15; 0 ≤ s ≤ p) 的带符号的、精确的数字值。
rdTypeINTEGER | 4 | 具有精度 10, 标度 0 的带符号的、精确的数字值（带符号的： -231 ≤ n ≤ 231-1； 不带符号的：0 ≤ n ≤ 232-1）。
rdTypeSMALLINT | 5 | 具有精度5、标度 0 的带符号的、精确的数字值（带符号的：-32,768 ≤ n ≤ 32,767, 不带符号的：0 ≤ n ≤ 65,535）。
rdTypeFLOAT | 6 | 具有尾数精度 15 的带符号的、近似的数字值（0 或绝对值 10-308 到 10308）。
rdTypeREAL | 7 | 具有尾数精度 7 的带符号的、近似的数字值（0 或绝对值 10-38 到1038）。
rdTypeDOUBLE | 8 | 具有尾数精度 15 的带符号的、近似的数字值（0 或绝对值 10-308 到 10308）。
rdTypeDATE | 9 | 日期 － 从属数据源。
rdTypeTIME | 10 | 时间 － 从属数据源。
rdTypeTIMESTAMP | 11 | 时间标记 － 从属数据源。
rdTypeVARCHAR | 12 | 可变长字符串。最大长度是决定于DBMS。
rdTypeLONGVARCHAR | -1 | 可变长字符串。最大长度由数据源来确定。
rdTypeBINARY | -2 | 固定长二进制数据。最大长度是决定于DBMS。
rdTypeVARBINARY | -3 | 可变长二进制数据。最大长度是决定于DBMS。
rdTypeLONGVARBINARY | -4 | 可变长二进制数据。 最大长度是决定于数据源。
rdTypeBIGINT | -5 | 具有精度19（带符号）或20（不带符号）、标度 0 的带符号的、精确的数字值；（带符号：-263 ≤ n ≤ 263-1；不带符号： 0 ≤ n ≤ 264-1）。
rdTypeTINYINT | -6 | 具有精度 3 标度 0 的带符号的、精确的数字值；（带符号：-128 ≤ n ≤ 127，不带符号： 0 ≤ n ≤ 255）。
rdTypeBIT | -7 | 单个二进制数字。


UpdateCriteria 属性常数

这些常数用于确定， RDO 在使用 BatchUpdate 方法时如何管理更新的操作。

常数 | 值 | 描述
rdCriteriaKey | 0 | 在 SQL WHERE 子句中仅仅使用键值列。
RdCriteriaAllCols | 1 | 在 SQL WHERE 子句中使用键值列和 所有被更新的列。
RdCriteriaUpdCols | 2 | 在 SQL WHERE 子句中使用键值列和所有 的列。
RdCriteriaTimeStamp | 3 | 在 SQL WHERE 子句中仅仅使用时间标记列。（如果没有时间标记列可用，则产生可以捕获的错误。）


UpdateOperation 属性常数

这些常数用于确定 RDO 在使用 BatchUpdate 方法时如何管理更新的操作。

常数 | 值 | 描述
rdOperationUpdate | 0 | 对被修改的每一行使用一个更新语句。
rdOperationDelIns | 1 | 对被修改的每一行使用一对删除和插入语句。


Validate 事件动作参数常数

这些常数用于确定 RemoteData 控件如何管理有效性检查。

常数 | 值 | 描述
rdDataActionCancel | 0 | 当 Sub 退出时取消操作。
rdDataActionMoveFirst | 1 | MoveFirst 方法。
rdDataActionMovePrevious | 2 | MovePrevious 方法。
rdDataActionMoveNext | 3 | MoveNext 方法。
rdDataActionMoveLast | 4 | MoveLast 方法。
rdDataActionAddNew | 5 | AddNew 方法。
rdDataActionUpdate | 6 | Update 操作（不是UpdateRow）。
rdDataActionDelete | 7 | Delete 方法。
rdDataActionFind | 8 | Find 方法 (有效事件)。
rdDataActionBookmark | 9 | 已经设置 Bookmark 属性。
rdDataActionClose | 10 | Close 方法。
rdDataActionUnload | 11 | 正在卸载窗体。
rdDataActionUpdateAddNew | 12 | 对 AddNew 的更新操作（有效事件）。
rdDataActionUpdateModifed | 13 | 对 Edit 的更新操作（有效事件）。
rdDataActionRefresh | 14 | Refresh 方法（有效操作）。
rdDataActionCancelUpdate | 15 | CancelUpdate 方法（有效事件）。
rdDataActionBeginTransact | 16 | BeginTransaction 方法。
rdDataActionCommitTransact | 17 | CommitTransaction 方法。
rdDataActionRollbackTransact | 18 | RollbackTransaction 方法（有效事件）。
rdDataActionNewParameters | 19 | NewParameters 方法。
rdDataActionNewSQL | 20 | 新的 SQL 语句。


动作查询

一个 SQL 查询，它能改变基本数据或执行某些管理操作，比如添加新表或用户。动作查询返回的是被影响的行数而不是一个结果集。


集合函数

在计算值的查询中使用的函数，如 Count、Avg 或 Sum 之类。在书写 SQL 表达式时，可以使用 SQL 集合函数来完成各种统计。


别名

在 Visual Basic 中对外部过程另予命名，以避免与 Visual Basic 的关键字、全局变量、常数或标准的命名约定所不允许的名称冲突。

在 SQL 中，对 SELECT 语句中的列或者表达式另起一个名称，可以使之缩短或使其更有意义，当使用不返回名称的表达式执行 SQL 查询时，或在一个查询中多次引用相同的表时，这样做可防止名称发生冲突。


ASCII 字符集

美国信息交换用标准码 (ASCII) 7 位字符集，广泛用于表示标准 U.S. 键盘上的字母和符号。ASCII 字符集与 ANSI 字符集中的前 128 个字符（0 到 127）相同。


异步

一种查询模式，SQL 查询立即返回，即使结果一直在挂起时也是如此。这使应用程序在查询完全挂起时仍可以继续进行其它处理。


基本表

远程数据库中的表。可以使用数据定义 SQL 语句操作基本表的结构，也可以使用 rdoResultset 对象或动作查询修改基本表中的数据。


书签

系统生成的标识当前行的值，该当前行包含在 rdoResultset 对象 Bookmark 属性中。如果将 Bookmark 属性值赋值给一个变量并接着移动到另一行，可以通过将变量值赋值给 Bookmark 属性使前面的行再次成为当前行。


Boolean

True/False 或是/否值。Boolean 值通常保存在远程数据库的 Bit 列中；但是，某些数据源不直接支持这种数据类型。


被绑定的控件

一种数据觉察控件，可以通过 RemoteData 或 Data 控件对数据源中的一个或多个特定的列进行访问。Data 觉察控件可通过 DataSource 和 DataField 属性绑定到 RemoteData 或 Data 控件上。当 RemoteData 或 Data 控件从一行移动到下一行时，所有与 RemoteData 或 Data 控件绑定的被绑定的控件随着显示当前行中各列的数据。当被绑定控件中的数据被改变并随后移动到不同的行时，这些改变会自动保存在数据源中。


Byte 数据类型

基本数据类型，用以保持 0 到 255 之间的正整数。


笛卡儿积

联结两个关系表，将第一个表中的所有行与第二个表中的所有行都按序结合起来而得到的结果。

一般说来，执行一个 SQL SELECT 语句，在它的 FROM 子句中引用两个或多个表，但不包含表明如何联接表的 WHERE 或 JOIN 子句，所得的结果就是笛卡儿积


区分大小写

能够区分大写和小写字母。区分大小写的搜索将严格按大写和小写字母匹配来查找正文。例如，这样一种搜索将把 "ZeroLengthStr" 和 "zerolengthstr" 视为不同。区分大小写是某些数据库管理系统的特点。


列

定义 rdoTable 或 rdoResultset 中列的数据类型、大小以及其它属性。所有列的集合定义了数据库中的一行。单个列包含与类型相关的数据，这个数据也反映整个表的用途；也就是说，一个列的定义是不会逐行变化的。


列属性

列的属性，描述它所包含的数据。Size 与 Type 是其两个例子。


提交

接受挂起的事务。如果使用事务处理并开始一个事务，那么，在提交（接受）事务之前，事务中所作的任何改变都不会被写到数据源上。


编译时间

源代码被编译成可执行代码的时刻。


连接

到 ODBC 数据源的一个连接。


连接句柄

对具体连接的信息标识内存。在连接到数据源之前，RDO 将要求连接句柄；RDO 通过 rdoConnection 对象自动管理连接句柄。每个连接句柄都与环境句柄相关联。环境句柄可以有多个连接句柄与之相关联，并有多个环境。


连接字符串

用于说明数据源以及其它信息的字符串，例如用户名和密码。连接字符串通常被赋值给 rdoConnection 对象或 RemoteData 控件的 Connect 属性，或作为参数赋给 OpenConnection 方法。


复制缓冲区

rdoResultset 对象为一行的内容创建的位置，这一行打开用于编辑。Edit 方法把当前行复制到复制缓冲区，AddNew 方法为一新的行清除缓冲区，而 Update 方法把复制缓冲区的数据保存到数据源中，替换当前行或插入一新行。任何将当前行指针复位或进行移动的语句或者取消编辑的语句都将放弃复制缓冲区.


准则

一组限定条件，如 ="Denmark"（意思是指等于 Denmark）或 > 30000 等，用于创建查询或过滤器，以说明一组指定的行。


当前行

rdoResultset 对象中的行，可用来修改或校验数据。使用 Move 方法将一个行集中的当前行重定位。

只有 rdoResultset 中的一行才能成为当前行；但是，一个 rdoResultset 可能没有当前行。例如，在删除了当前的 rdoResultset 行之后，或者 rdoResultset 没有行时，当前行无定义。在这种情况下，引用当前行的操作将得到一个可以捕获的错误。


当前事务

对 rdoResultset 对象或数据库中的一组行所作的所有改变，这些改变都是在使用 BeginTrans 方法之后以及使用 RollbackTrans 或 CommitTrans 方法之前作出的。


游标

数据源或 ODBC 驱动程序管理器管理的行的逻辑集合。以游标命名的原因在于，就像 CRT 屏幕上的光标指出当前位置一样，它指出结果集合中的当前位置。


数据访问对象 (DAO)

由 Microsoft Jet 数据库引擎定义的对象。使用数据访问对象，比如 Database、TableDef、 Recordset 和 QueryDef 对象来表示被用于组织和操作代码中数据的对象。


RemoteData 控件

提供对保存在远程 ODBC 数据源中的数据进行访问的方法。RemoteData 控件允许在结果集中从一行移动到另一行，并使用被绑定的控件显示和操作这些行的数据。


数据库

与具体主题或目的有关的数据集合。数据库包含表，也可以包含查询和表关系，还包含表和列的有效性校验标准。


数据库管理

创建、管理和维护数据库的完整性与安全性的活动，例如，维护用户的权限以及对数据库备份并修复数据库集。


数据库引擎

数据库管理系统的一部分，检索用户和系统数据库中的数据并将数据保存在这一数据库中。


数据库管理系统 (DBMS)

用于组织、分析和修改保存在数据库中的信息的软件。例如，Microsoft SQL 服务器是数据库管理系统的一个实例。


rdoConnection 对象（定义）

表示到远程数据源的开放连接。


DDL（数据定义语言）

用于描述、改变或定义数据库的属性的语言，更适用于与表、列及存储策略关联的数据库结构描述。


数据定义查询

SQL 专用查询，可以创建、更改或删除一个表，或者创建或删除数据库中的索引。


数据操作语言 (DML)

SQL 语句的属性和方法，用来书写访问、操作现有数据库中数据的应用程序或查询。这包括查询数据库、在它的表中定位、执行更新以及添加或删除行的处理程序。


数据页

数据库的一部分，行数据被保存在其中。根据行的大小，一个数据页可以包含多个行。多数远程数据库中的数据页的大小是 2K 字节。


数据源

一个命名的开放数据库连接 (ODBC) 的资源，指明位置、驱动程序类型和 ODBC 驱动程序访问数据库所需的其它参数。


数据类型（远程数据）

变量或列的属性，指明它可以保留哪种数据。例如，将 rdoColumn 的数据类型定义为 rdTypeCHAR，使之包含正文。


Date/Time

日期和时间作为一个实数的不同部分被内部存储。

十进制数左边的值表示从 100 年 1 月 1 日到 9999 年 12 月 31 日之间的日期。负值表示 1899 年 12 月 30 日之前的日期。

十进制数右边的值表示 0:00:00 和 23:59:59 之间的时间。用 .5.表示中午。


缺省环境

当应用程序首次引用远程数据对象时，Visual Basic 自动建立的 rdoEnvironment 对象。rdoEnvironment 由 rdoEngine.rdoEnvironments(0) 引用或只由 rdoEnvironments(0) 引用。


设计时

一段时间，在此期间，在开发环境中通过添加控件、设置控件或窗体属性等等来建立应用程序。与之相对，在运行时以用户身份与应用程序交互作用。


动态链接库 (DLL)

在运行时装载和链接到应用程序上的例程库。


动态类型 rdoResultset

可以拥有可更新行的查询结果。动态类型 rdoResultset 是行的动态集合，可用来添加、改变或删除基础数据库表或表的行。动态类型 rdoResultset 可能包含数据库中一个或多个表中的列。动态的 rdoResultset 成员关系不是固定的。


环境

rdoEnvironment 对象为特定用户定义会话。在第一次引用 RDO 时，用 "" 的密码和 "" 的用户名创建一个缺省的 rdoEnvironment 对象。


环境句柄

标识全局信息的内存存储，包括有效的连接句柄和当前活动连接句柄。在连接到数据源之前，RDO 将要求这个句柄。远程数据对象通过 rdoEnvironment 对象自动管理环境句柄。


转义代码

允许以独立于数据的方式指定一值，诸如日期或时间。例如，允许指定日期 (select * FROM table WHERE DateField = {d "2/17/94"})。当这个查询提交到 ODBC 驱动程序时，它将扫描字符串并对正在使用的 ODBC 驱动程序以适当的形式用日期替换转义子句。


表达式（远程数据）

由操作符、常数、原义值、函数、列的名称、控件以及计算单个值的属性的任意组合。可以使用表达式作为许多属性和操作参数的设置值，以设置标准或定义查询中计算的列。


过滤器

用于行的一组标准，以创建行的一个子集。


向前滚动

向 rdoResultset 对象结尾 (EOF) 所作的移动。


仅向前类型 rdoResultset

一个 rdoResultset 对象，在其内可以只从头到尾搜索行；不能将当前行位置退回到第一行，每一次只有一行是可访问的。仅向前类型 rdoResultset 对象可用于快速检索与处理数据。


标识符

表达式的一个元素，它引用列的值或属性。


索引（远程数据）

动态交叉引用一个或多个表数据列，允许快速检索一个表的特定列。在添加、改变或删除行时，数据库管理系统自动更新索引，以反映这个变化。


初始化文件

ASCII 正文文件，用于放置参数，对基于 Windows 的应用程序或 Microsoft Windows 本身进行配置。一般说来，初始化文件使用扩展名 .ini，并以在使用它的可执行程序之后命名。例如，命名为 Testing.exe 的程序将会要求命名为 Testing.ini 的初始化文件。


integer 数据类型

保存整数的基本数据类型。Integer 变量被作为 16 位（2 字节）数字保存，它们在 -32,768 和 32,767 之间取值。类型声明字符为 %（ANSI 字符 37）。


键集

用于识别游标中特定行的键值的集合。键集被存储在服务器一侧键集游标中的服务器上以及客户一侧键集游标中的工作站上。


键集类型 rdoResultset

可以拥有可更新行的查询结果。键集内的移动无限制。键集类型 rdoResultset 是行的集合，可用来添加、改变或删除基础数据库表或表的行。键集类型 rdoResultset 可能包含数据库中一个或多个表中的列。键集 rdoResultset 成员关系不是固定的。


锁定

数据页或行的条件，使该数据页或行对所有用户都是只读的，只有当前正在向其内输入数据的用户除外。


long 数据类型

4 字节整数（包含在 -2,147,483,648 和 2,147,483,647 之间，并含此二数）。


消息

由一个应用程序传递到另一个应用程序的信息包。


多用户数据库

允许多个用户同时访问并修改相同数据集合的数据库。对于某些情况，新增“用户”可能是应用程序的另一实例，或者是系统上运行的另一个应用程序，它与其它某个程序访问相同数据。


本地错误

由已给连接上的数据源的数据库管理系统生成和返回的错误。


规范化

通过有效的表设计将关系数据库中信息的复制最小化。


null

指出丢失的或未知的数据的值。Null 值可以输入到信息为未知的列中以及表达式和查询中。在 Visual Basic 中，Null 关键字指明一个 Null 值。.


null 列

不包含字符或值的列。null 列不同于长度为零的字符串 ("") 或具有 0 值的列。当列的内容未知时，将该列设置为 null。例如，任务表中的 Date_Completed 列在任务完成之前一直为 null 。


数值表达式

可以作为数来计算的任何表达式。表达式的元素可以包含关键字、变量、常数和运算符的任意组合，运算的结果是数。


对象浏览器

一个对话框，允许检查对象库的内容以获得有关所提供的对象及它们的方法和属性的信息，可能还可以获得它们的常数的信息。


对象表达式

指定特别对象的表达式。该表达式可以包含任何的对象容器。


对象库

一个带有 .olb 扩展名的文件，向 Automation 客户（类似 Visual Basic）提供有关可用的 ActiveX 对象。可以使用对象浏览器来检查对象库的内容以获得所提供的对象的有关信息。


ODBC （开放数据库连接）

标准协议，允许应用程序连接到各种外部数据库服务器或文件上。ODBC 驱动程序管理器使用的 ODBC 驱动程序允许访问 SQL 服务器以及其它几个数据源，包括正文文件和 Microsoft Excel 电子数据表。


ODBC 数据源

作为数据源使用的数据库或数据库服务器。ODBC 数据源通过它们的数据源名称来引用，或者通过具体引用 ODBC 驱动程序和服务器名称来引用。可以在 Windows 的控制面板中使用 ODBC 管理程序或 rdoRegisterDataSource 方法来注册命名的数据源。


列数据类型

下表描述列数据类型。

列数据类型 | 描述
rdTypeCHAR | 定长字符串Size 属性设置的长度。
rdTypeNUMERIC | 具有精度 p 以及刻度 s (1 ≤ p ≤15; 0 ≤ s ≤ p) 的有符号的精确数值。
rdTypeDECIMAL | 具有精度 p 以及刻度 s (1 ≤ p ≤15; 0 ≤ s ≤ p) 的有符号的精确数值。
rdTypeINTEGER | 具有精度 10 以及刻度 0 的有符号的精确数值（带符号的: -2^31 ≤ n ≤ 2^31-1； 不带符号的: 0 ≤ n ≤ 2^32-1 ）。
rdTypeSMALLINT | 具有精度 5 以及刻度 0 的有符号的精确数值（带符号的: -32,768 ≤ n ≤ 32,767，带符号的: 0 ≤ n ≤ 65,535 )。
rdTypeFLOAT | 具有尾数精度 15 (零或绝对值在 10^-308 和 10^308 之间) 的有符号的近似数值。
rdTypeREAL | 具有尾数精确度 7 (零或绝对值在 10^-38 和 10^38 之间)的有符号的近似数值。
rdTypeDOUBLE | 具有尾数精度 15 (零或绝对值在 10^-308 和 10^308之间)的有符号的近似数值。
rdTypeDATE | 日期 － 依赖于数据源。
rdTypeTIME | 时间 － 依赖于数据源。
rdTypeTIMESTAMP | 时间戳 － 依赖于数据源。
rdTypeVARCHAR | 可变长字符串。最大长度是由 Size 属性定义。
rdTypeLONGVARCHAR | 可变长字符串。数据源确定的最大长度。
rdTypeBINARY | 定长二进制数据。最大长度是由 Size 属性定义。
RdTypeVARBINARY | 变长二进制数据。最大长度 255.
RdTypeLONGVARBINARY | 变长二进制数据。依赖于最大数据源。
rdTypeBIGINT | 具有精度 19 （有符号）或 20 （无符号），刻度 0（有符号的: -2^63 ≤ n ≤ 2^63-1; 无符号的: 0 ≤ n ≤ 2^64-1 的有符号的精确数值）。
rdTypeTINYINT | 具有精度 3，刻度 0（有符号的: -128 ≤ n ≤ 127, 无符号的: 0 ≤ n ≤ 255 的有符号的精确数值）。
rdTypeBIT | 单二进制数字。


ODBC 驱动程序

动态链接库 (DLL)，用于连接特定开放式数据库连接数据源与客户应用程序。例如，Visual Basic 中有 Microsoft SQL 服务器专用驱动程序。为了使 RDO 工作，ODBC 驱动程序必须满足 ODBC Level II 需求。


ODBC 驱动程序管理器

提供从主机语言到特定后端数据源驱动程序的接口。


开放式

一种锁定类型，在其中，仅当用 Update 方法来更新行时，其他用户不可使用包含一个行或多个行（包含正在编辑的行）的数据页，而在 Edit 和 Update 方法之间却可使用。在打开 rdoResultset 用到 rdConcurRowver 或 rdConcurValues LockType 时使用开放式锁定 。


参数

包含一个值的元素，可以通过改变该值来影响查询的结果。例如，一个返回有关雇员数据的查询可能对雇员的名字有一个参数。于是，在运行查询之前将 rdoQuery 对象的一个 rdoParameter 设置成一个名字，就可以用这个参数查找某一雇员的数据。


参数查询

在运行查询之前要求提供一个或多个标准值的查询，例如，Redmond for City。严格说来，参数查询不是一种独立的查询；它将扩展了其它查询的灵活性加以推广。


语法分析

为识别语句或表达式的成分，并参照适当的语言规则对这些成分进行有效性检查。


权限

一个或多个属性，指明用户对数据库中的数据或对象可进行哪种访问。例如，具有只读权限的表或查询允许用户检索表或查询中的数据，但不允许编辑它们。


保守式

一种锁定类型，在其中，只要游标被打开而且直到 Rowset 重新定位时才释放，（RowsetSize 属性所确定的）当前 Rowset 涉及的每一页都被锁定? 在当前 Rowset 涉及的页集合被锁定时。当打开 rdoResultset 用到 rdConcurLock LockType 选项时，保守式锁定是允许的。仅对特殊的情况才使用这种锁定。


rdoPreparedStatement 对象

一个远程数据对象，包含一个准备好的 SQL 语句，而且对 rdoPreparedStatement 中的每个参数都包含 rdoParameter 对象的集合。该对象已经不在使用，并已由 rdoQuery 对象替代。


过程查询

执行存储的过程的 SQL 查询。


查询

一个对数据库的形式化指令，如查询中所指定的，或者返回行的集合，或者执行一个行的集合上的具体操作。例如，以下 SQL 查询语句返回行：

SELECT CompanyName FROM Publishers WHERE State = 'NY'

查询类型包括选定、动作、参数、组合和保存过程查询。


rdoQuery 对象（定义）

一个远程数据对象，包含一个 SQL 语句，而且对 rdoQuery 中的每个参数都包含 rdoParameter 对象的集合。rdoQuery 对象被用来管理参数化的查询或在执行应用程序时反复使用的查询。


只读

一种访问数据的类型，只读类型的数据可以检索但不能修改。对大多数情况而言，这将提供更好的性能。


远程数据对象

一个对象，例如 rdoConnection、 rdoTable、 rdoResultset或 rdoQuery，表示用于组织、操作代码中的数据的对象。


远程数据对象 (RDO)

通过 ODBC 为访问远程数据源提供信息模型。RDO 提供对象集，使易于连接到数据库， 执行查询和存储过程，操作结果将所作的改变提交给服务器。


再查询

返回查询以反映行的变化，检索新添加的行和清除删除的行。


保留字

一个字，为数据源 SQL 语言的部分。保留字包括语句名、预定义的函数和数据类型、方法、操作符、运算符和对象。SELECT、UPDATE、ETWEEN、SET 和 INSERT 为一些例子。


行

关于个人、地点、事件或其它一些项的相关数据的集合。表数据保存在数据库的行中。每个行由一个相关列的集合组成；每个列定义行的信息的属性。总之，行定义了数据库中可检索信息的一个特定单元。


行集移居

将 rdoResultset 行加载到内存中的过程。

rdoResultset 对象移居由 rowsetSize 属性定义的行数。如果使用服务器端的游标，在任何时刻都只有这个行数在内存中表示出来。


运行时

应用程序正在运行的时间。在运行时将作为用户与代码交互作用。与之相对，设计时是开发应用程序的时间。


范围

定义变量，过程或对象的可见性。例如，被说明为 Public 的变量对所有模块都是可见的。在过程中说明的变量只在过程中可见，而且在两次调用之间会丢失其值，除非将它们说明为 Static。


安全机制

用来指定或限制特定用户和组对数据库中数据和对象的访问。


选定查询

一个查询，它询问存储在表中的数据，并返回一个 rdoResultset 对象而不改变数据。一旦检索 rdoResultset 数据，就可以检查和改变基本查询中的数据。


服务器

设计的数据库管理系统，与客户应用程序共享数据；服务器和客户常在网络上连接。数据库服务器通常拥有并管理一个中心数据库，远程客户应用程序可以检索和操作它。


服务器端的游标

在服务器上而不是在客户工作站上创建的游标键集。


会话

当用户连接到数据源时，会话开始，当用户断开数据源时，会话结束。在会话期间执行的所有操作都符合由登录用户名和密码确定的权限。会话作为 rdoConnection 对象被实现，并通过连接保持同步。


Single 数据类型

一种基本数据类型，以 IEEE 格式保存单精度浮点数。Single 变量被作为 32 位（4 字节）数存储，若取负值，则取值范围在 -3.402823E38 到 -1.401298E-45 之间，若取正值和零，则取值范围在 1.401298E-45 到 3.402823E38 之间。类型声明字符为 !。


排序顺序

一种排序原则，用于安排数据的顺序，例如字典顺序、二进制顺序、升序、降序等等。


SQL 数据库

通过使用开放式数据库连接 (ODBC) 数据源或与数据库紧密相关的其它接口。亦称之为关系数据库。


SQL 专用查询

可以只通过写一个 SQL 语句创建的查询。


SQL 语句

定义结构查询语言 (SQL) 命令的表达式，例如 SELECT、UPDATE 或 DELETE，也可能包括像 WHERE 和 ORDER BY 这样的子句。SQL 字符串语句一般在查询和 rdoResultset 对象中使用，但也可以用来创建或修改数据库结构。

SQL 语句的语法与数据源有关。


SQL 视图

SQL 视图与查询相似：都允许限制一个或多个表中显示的行和列，并都提供类似的功能。SQL 视图行的逻辑集合，在这里，表示实际行。


语句句柄

被 ODBC 驱动程序用来引用存储名称、参数和绑定的信息、错误消息以及其它与语句处理流有关的信息。rdoResultset 的 hStmt 属性是一个 ODBC 语句句柄.


静态类型 rdoResultset

在打开静态游标时，这个游标使用的结果集合中的成员关系、顺序和值通常是固定的。直到游标关闭后再打开或有需要之前，游标不会检测出其它用户更新、删除或插入的行。


存储过程

存储在数据源中的预编译过程，可根据需要由应用程序调用。预定义的查询减少重复指定同一选定标准的系统开销，而且比提交一个特定查询更迅速。


String 数据类型

保持字符信息的基本数据类型。字符串变量可以包含大约 65,535 字节 (64K)，可以为定长，也可以为变长，每个字节包含一个字符。定长字符串用一个具体长度来说明。变长字符串可以有不超过 64K 的任何长度，减少存储开销。

字符串数据类型的类型声明字符是 $。


字符串表达式

计算连续的字符的字符串的任何表达式。表达式的元素可以包含返回字符串的函数，字符串文字、字符串常数、字符串变量、字符串 Variant, 或返回字符串 Variant (VarType 8) 的函数。


结构化查询语言 (SQL)

对数据库进行查询、更新和管理时所用的语言。SQL 可用于检索、排序以及将数据库中抽取的特定数据过滤。


表

关系数据库中数据存储的基本单元。表存储行和列中的数据，通常包含一个特定范围的事物，例如雇员或部件。也称作基本表.


rdoTable 对象

表示基本表或 SQL 视图的存储定义。


TEMP

在启动系统时用系统初始化 TEMP 环境变量。TEMP 通常指向 Microsoft Windows 以及其它程序使用的硬盘区域，以便存储那些在关闭系统之后不必保存的信息。例如，下一行为 autoexec.bat 文件中的内容，将 TEMP 环境变量指向目录 D:\Temparea。

SET TEMP=D:\TEMPAREA


临时磁盘

通过 TEMP 操作系统环境变量标识的目录，亦称之为临时驱动器。尽管 TEMP 环境变量可以指向 RAM 磁盘，但并不推荐这样做。


时间标记

包含唯一值，只要行更新该值就自动更新。


事务

对数据库的数据所作的一系列改变。用 BeginTrans 语句标记事务的开始，用 CommitTrans 语句提交事务，或者用 RollbackTrans 语句撤消自 BeginTrans 以来的所作的一切改变。

事务是可选的，但可以提高操作的速度，允许反向改变。

可以在 rdoConnection 层或 rdoEnvironment 层上管理事务。

也可以用分布式事务协调器管理事务。


两阶段提交

允许应用程序协调多个 SQL 服务器之间的更新。分布式事务的实现将分立的 SQL 服务器上的事务作为单个事务处理。服务使用一个 SQL 服务器，即提交服务器作为记录管理帮助应用程序确定是提交还是回滚事务。于是，两阶段提交保证了或者在共享服务器上的所有数据库都被更新，或者没有一个被更新。


更新

用来保存对行中数据所作的改变的过程。在保存行之前，改变都存储在称作复制缓冲区的临时行中。

SQL 语句中的 UPDATE 子句可以改变数据库表中一行或多行的数据值。


更新查询

根据指定的标准改变基本表数据的动作查询。更新查询不返回任何行，但返回被影响的行数。


用户帐号

通过用户名和密码识别的帐号，创建这一帐号是为管理对远程数据库中对象的访问。


验证

校验输入的数据是否满足某些条件或符合某些限制的过程。


variant 数据类型

特殊的数据类型，可以包含数字、字符串或日期数据以及特定值 Empty 与 Null。VarType 函数确定了如何处理 Variant 中的数据。如果没有明确说明是其它类型，所有变量都成为变体类型。


WHERE 子句

一个 SQL 语句的部分， 指定要检索的行。WHERE 子句限制查询的范围并指定用哪些列来联结多个表。


Yes/No 数据类型

一种列数据类型，包含一个 Boolean（“True/False”或“Yes/No”）值。


零长度字符串

不包含字符的字符串。零长度的字符串的 Len 函数返回 0。


Associate 事件

该事件是在一个新的连接与该对象相关联之后被引发。

语法

Private Sub object.Associate( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

该事件是在结果集被关联到一个新的 rdoConnection 对象之后被引发。可使用该事件初始化这个新连接。被关联的 rdoResultset 对象的 ActiveConnection 属性引用这个新连接。

例如除了在其它操作执行之前，每次在连接建立时，可使用 Associate 事件过程发送特定的查询。


BeforeConnect 事件

在 RDO 调用 ODBC API SQLDriverConnect 函数来建立一个到服务器的连接之前该事件发生。

语法

Private Sub object.BeforeConnect(ConnectString as String, Prompt as Variant)

BeforeConnect 事件的语法包括以下部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
ConnectString | Variant 表达式，该表达式对一个用来为 ODBC SQLDriverConnect 函数提供连接参数的连接串进行求值。
Prompt | 确定如何向用户提示。

说明

BeforeConnect 事件仅仅在 RDO 调用 ODBC API SQLDriverConnect 函数来建立一个到服务器上的连结之前被引发。该事件使代码有机会提供自定义的提示，或只提供或捕获连接信息。

参数 ConnectString 是 RDO 将要传送给 ODBC API SQLDriverConnect 函数的 ODBC 连接串。此串在该事件期间可以被改变，并且 RDO 将使用改变后的值。例如，代码可以提供附加参数，或改变此连接串存在的参数。

参数 Prompt 是 ODBC 提示常数（请参见 Prompt 属性）。此参数将作为 OpenConnection 或 EstablishConnection 方法中被传送的参数 Prompt 的缺省值。开发者可改变该值，并且在调用 SQLDriverConnect 时 RDO 将使用新值。


BeginTrans 事件

在 BeginTrans 方法完成之后该事件发生。

语法

Private Sub object.BeginTrans( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

BeginTrans 事件在 BeginTrans 方法完成之后被引发。该事件过程可使其它一些处理与该事务同步。


CommitTrans 事件

该事件是在 CommitTrans 方法完成之后发生。

语法

Private Sub object.CommitTrans( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

该事件是在 CommitTrans 方法完成之后引发。开发者对该事件的响应可使其它一些处理与该事务进行同步化。


Connect 事件

该事件是在到服务器的连接建立之后发生。

Private Sub object.Connect( )

Private Sub object.Connect(ErrorOccurred As Boolean)

部分 | 描述
object | 一个对象表达式，其值是“应用于”列表中的一个对象。
ErrorOccurred | 一个 Boolean 表达式，确定连接是否已成功，如设置值中所述。

设置值

将 ErrorOccurred 参数设置成以下诸值之一：

值 | 描述
True | 集合失败。
False | 集合成功。

说明

可以捕捉 Connect 事件并做在一个新的连接上所要求的任何初始查询，例如对照客户的版本来检验数据库的版本，或在此连接串中设置一个没有被建立起来的缺省数据库。也可以在打开此连接的过程中或者是简单地清除信息消息的 rdoErrors 集合时检查所返回的错误或信息。


DataChanged 事件

该事件是在列的值已经改变后发生。

语法

Private Sub object.DataChanged( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

该事件是在列中的数据已经被改变之后引发。新数据通过 rdoColumn 对象的 Value 属性可以访问。也可以使用 WillChange 事件来阻止或修改逐列所做的改变。然而，一旦 DataChanged 事件引发，该改变已经被提交给数据库。


Disconnect 事件

该事件是在连接被关闭之后发生。

Private Sub object.Disconnect( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

该事件在一个物理连接被关闭之后发生。开发者可以捕捉该事件来做任何清理所需的工作。

该事件应用于 rdoConnection 对象。


Dissociate 事件

该事件是在 rdoResultset 对象从一个连接上解除关联之后发生。

Private Sub object.Dissociate( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

该事件发生在 ActiveConnection 属性已经被设置为 Nothing 并且结果集已经从它的连接上被解除关联之后。


Error 事件（远程数据）

该事件只是作为数据访问错误的结果而发生，在没有 Visual Basic 代码执行时产生数据访问错误。

语法

Private Sub object _Error([index As Integer,]Number As Long, Description As String, Scode As Long, Source As String, HelpFile As String, HelpContext As Long, CancelDisplay As Boolean)

Error 事件的语法包括以下部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
index | 如果控件在某个控件数组中，用此索引来标识该控件。
Number | 本地的错误号。
Description | 错误描述。
Scode | ODBC 的错误返回码。
Source | 错误源。
HelpFile | 帮助文件的路径，该文件包含有关该错误的详细信息。
HelpContext | 帮助文件上下文编号。
CancelDisplay | 一个与所要采取操作相应的数字，参见设置中的描述。

设置值

用于 CancelDisplay 的设置值有：

常数 | 值 | 描述
rdDataErrContinue | 0 | 继续。
rdDataErrDisplay | 1 | （缺省）显示错误信息。

说明

通常，Error 事件的参数与 rdoError 对象的属性相对应。

通常在代码中要为 运行时的各种错误提供错误处理功能。然而正在执行的不是自己的代码时，运行时错误也可能发生，如当：

  • 单击一个 RemoteData 控件 按钮。

  • 在 Form_Load 事件发生后，RemoteData 控件试图打开一个 rdoConnection ，并且要创建 rdoResultset 对象。

  • 自定义控件执行一个操作，例如 MoveNext 方法、AddNew 方法或 Delete 方法这样的操作。

如果上述某个操作导致一个错误时，该错误事件将发生。

如果没有为此错误事件编写事件过程，Visual Basic 将显示与该错误相关的信息。


InfoMessage 事件

该事件是在信息消息被添加到集合 rdoErrors 上时发生。

Private Sub object.InfoMessage( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

在 RDO 从 ODBC 驱动器管理程序接收一个 SQL_SUCCESS_WITH_INFO 返回码并且与该信息消息一起移居到 rdoErrors 集之后该事件引发。

InfoMessage 事件为每一个信息消息集合引发一次。因此，如果 RDO 方法产生几条信息消息，该事件仅发生一次 － 是在最后一条消息被添加到该集合之后。可以捕获该事件并检查 rdoErrors 集合的内容以及决定采取什么相应操作为宜。


QueryComplete 事件

该事件发生在 rdoResultset 的查询返回第一个结果集之后。

语法

Private Sub object.QueryComplete(Query as rdoQuery, ErrorOccured as Boolean)

QueryComplete 事件的语法包括以下部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
Query | 对象表达式，该表达式对一个刚刚完成查询的 rdoQuery 对象进行求值。
ErrorOccured | 一个布尔 表达式，该表达式指明在处理查询的过程中是否发生了错误。

用于 ErrorOccured 的设置值有：

设置 | 描述
True | 在查询处理期间出现的错误。
False | 在查询处理期间没有发生错误。

该事件在一个查询完成之后被引发。用该事件作为通知，指明结果集现在对处理已经就绪。

参数 ErrorOccured 指明在查询执行时是否有错。如果此标志为 True，应检查集合 rdoErrors 以得到详细信息。

QueryComplete 事件引发对于在这个 rdoConnection 上执行要引发所有的查询。这包括那些通过 OpenResultset 或 Execute 方法来执行的查询以及那些在一个被关联的 rdoQuery 对象上执行的查询。参数 Query 是一个对象的引用，用以指明哪一个查询正好完成执行。使用此参数，可以为该连接上的所有查询编写一个简单处理程序，但是仍然可为特定的查询定制处理程序。当对 rdoConnection 对象自身执行查询时，RDO 在内部要创建一个 rdoQuery 对象和一个对这个内部 rdoQuery 的引用作为参数 Query 被传递。

该事件可以用来替代为了检查 OpenResultset 或 Execute 方法的查询完成情况对 StillExecuting 属性的询问。


QueryCompleted 事件（远程数据）

该事件发生在 rdoResultset 查询返回第一个结果集之后，而 rdoResultset 是由 RemoteData 控件生成的。

语法

Private Sub object.QueryCompleted ([index As Integer])

QueryCompleted 事件的语法包括以下部分：

部分 | 描述
Object | 对象表达式，其值是“应用于”列表中的一个对象。
Index | 如果控件在某个控件数组中，用此索引来标识该控件。

说明

当 RemoteData 控件完成 rdoResultset 的创建时，QueryCompleted 事件被引发。如果在该查询完成之前执行了终止查询处理的 Cancel 方法，则该事件就不能触发。

该事件对异步和同步查询操作都能引发。


QueryTimeout 事件

该事件发生在查询执行时间已经超出了 QueryTimeout 属性的设置值时。

语法

Private Sub object.QueryTimeout(Query as rdoQuery, Cancel as Boolean)

QueryTimeout 事件的语法包括以下部分：

部分 | 描述
Object | 对象表达式，其值是“应用于”列表中的一个对象。
Query | 对象表达式，该表达式对一个刚刚完成查询的 rdoQuery 对象进行求值。
Cancel | 一个布尔 表达式，该表达式指明在处理查询的过程中是否发生了错误。

用于 Cancel 的设置值有：

设置 | 描述
True | RDO 应取消进一步的查询处理。
False | RDO 应在另一个查询超时周期继续处理该查询。

说明

当一个正在运行的查询已经超过由 QueryTimeout 属性所指定的时间时，该事件被引发。每次 QueryTimeout 时间到时，该事件都要引发。该事件对同步或异步查询都要引发。

参数 Cancel 指明 RDO 是否取消此查询，或是继续处理此查询并且等待 QueryTimeout 属性中所指定的秒数。该参数的缺省值为 True，所以如果代码不响应该事件，则在 QueryTimeout 时间到后，查询将被取消。如果该参数的值设置为 False，则 RDO 在另一个 QueryTimeout 周期将继续等待查询完成。

可以使用此方法来向用户显示一个信息框，以询问用户是不是想取消查询，还是继续再等待另外 N 秒。

QueryTimeout 事件对于在这个 rdoConnection 上执行的所有查询都要引发。这包括那些通过 OpenResultset 或 Execute 方法来执行的查询以及那些在一个被关联的 rdoQuery 对象上执行的查询。参数 Query 是一个对象的引用，用以指明哪一个查询正好时间到。使用此参数，可以为该连接上的所有查询编写一个简单事件处理程序，但是仍然可为特定的查询定制处理程序。当对 rdoConnection 对象自身执行查询时， RDO 在内部要创建一个 rdoQuery 对象和一个对这个内部 rdoQuery 的引用作为参数 Query 被传递。


Reposition 事件（远程数据）

该事件发生在某行变为当前行 之后。

语法

Private Sub object.Reposition ([index As Integer])

Reposition 事件的语法包括以下部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
index | 如果控件在某个控件数组中，用此索引来标识该控件。

说明

当装入一个 RemoteData 控件时， rdoResultset 对象中的第一行变为当前行，使 Reposition 事件引发。每当某行变为当前行后，Reposition 事件被引发：

无论何时单击 RemoteData 控件上的任一按钮都可在行间移动。

  • 使用某种 Move 方法，例如 MoveNext 。

  • 使用改变当前行的任何其它属性或方法。

相比之下，验证事件则是在移到不同行之前发生。当当前结果集的行改变时，与 rdoResultset 相关的 RowCurrencyChang 事件也引发。

使用 Reposition 事件来执行基于当前行中数据的计算或改变窗体使其反映当前行中的数据。


ResultsChanged 事件

当 MoreResults 方法执行后使得某个新结果集成为可用时，该事件发生。

Private Sub object.ResultsChanged( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

该事件发生在 MoreResults 方法完成，并且一个新的行集被装入结果集之后。即使不再有集合并且 MoreResults 方法返回 False 时该事件被引发。在这种情况下，EOF 和 BOF 属性都将为 True，表明结果集为空。


RollbackTrans 事件

该事件发生在 RollbackTrans 方法已经完成之后。

Private Sub object.RollbackTrans( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

可响应此事件使某些其它处理和该事务同步化。


RowCurrencyChange 事件

当结果集重定位到一个新行，BOF 或 EOF之后，该事件发生。

Private Sub object.RowCurrencyChange( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

该事件是在结果集被重定位到一新行，或已经移动到 BOF 或 EOF 之后引发。任何一种 Move 方法，AbsolutePosition、PercentPosition 或 Bookmark 属性，或 Requery、MoreResults或 Update（在一个 AddNew 之后）方法也能引起当前行指针重定位并引发 RowCurrencyChange 事件。通过访问对象的 AbsolutePosition、PercentPosition 或 Bookmark 属性，可以决定当前位置。

当一个被关联的主控文件行流动改变时，RowCurrencyChange 事件可用来执行一个详细的查询。例如，如果建立窗体，该窗体包含主控客户记录和与客户定单相对应的行的集合，则每当选择另一个主控客户记录时，可使用 RowCurrencyChange 事件进行查询，并能返回所有相关联的定单信息。

注意 RowCurrencyChange 事件和 Reposition 事件引发的顺序不可预知。


RowStatusChanged 事件

该事件是在当前行的数据状态由于编辑、删除或插入操作而改变之后发生的。

Private Sub object.RowStatusChange( )

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

说明

该事件是在当前行数据的状态改变之后引发的。行的状态可由于 Delete 或 Update 操作而改变。使用该对象的 Status 属性可决定行的当前状态。


Validate 事件（远程数据）

在另一行变为当前行之前，或 Update 方法之前（除非数据是用 UpdateRow 方法保留的），或者是在 Delete、Unload 或 Close 等操作之前，该事件发生。

语法

Private Sub object_Validate ([index As Integer,] action As Integer, reserved As Integer)

Validate 事件的语法包括以下部分：

部分 | 描述
Object | 对象表达式，其值是“应用于”列表中的一个对象。
Index | 如果控件在某个控件数组中，用此索引来标识该控件。
Action | 一个Integer或常数，用以指示使该事件出现的操作，如设置中的所描述的。
Reserved | Integer参数，仅为与 RDO 1.0版兼容才保留，并被 Remote Data 控件忽略。

设置值

用于 action 的设置值有：

常数 | 值 | 描述
RdActionCancel | 0 | 当 Sub 退出时取消该操作。
RdActionMoveFirst | 1 | MoveFirst 方法。
RdActionMovePrevious | 2 | MovePrevious 方法。
RdActionMoveNext | 3 | MoveNext 方法。
RdActionMoveLast | 4 | MoveLast 方法。
RdActionAddNew | 5 | AddNew 方法。
RdActionUpdate | 6 | Update 操作（不是 UpdateRow）。
RdActionDelete | 7 | Delete 方法。
RdActionFind | 8 | Find 方法。（未实现）。
RdActionBookmark | 9 | Bookmark 属性已设置。
RdActionClose | 10 | Close 方法。
RdActionUnload | 11 | 窗体正被卸载。
RdActionUpdateAddNew | 12 | 在结果集中插入一新行。
RdActionUpdateModified | 13 | 当前行被改变。
RdActionRefresh | 14 | Refresh 方法已执行。
RdActionCancelUpdate | 15 | 更新被取消。
RdActionBeginTransact | 16 | BeginTrans 方法。
RdActionCommitTransact | 17 | CommitTrans 方法。
RdActionRollbackTransact | 18 | RollbackTrans 方法。
RdActionNewParameters | 19 | 参数或是行或列的顺序改变。
RdActionNewSQL | 20 | SQL 语句被改变。

说明

无论被绑定的控件中的数据是否改变或者绑定控件存在与否，该事件都可发生。可以使用该事件来改变值和更新数据。每当动作引起该事件发生时可以选择保存数据或者停止，并代之以不同的动作。

如果企图将 AddNew 方法或 Move 方法之一转换为任何其它动作，（任何 Move 转换为 AddNew，任何 Move 转换为其它 Move，或 AddNew 转换为任何 Move），则会导致动作被中止，如同设置了 rdActionCancel。

在该事件的代码中，可对每一个其 DataChanged 为 True 的被绑定控件中的数据进行检查。然后可将 DataChanged 设置为 False，以避免在数据库中保存该数据。

注意 因为一个数据识别控件可以有一个以上的绑定属性，对于 Bindings 集合中所枚举的每个绑定属性，都必须检查 DataChanged 属性。

在此事件期间对于基本的 rdoResultset 对象不能使用任何方法（如 MoveNext ）。


WillAssociate 事件

该事件是在一个新的连接被关联到对象上之前发生。

Private Sub object.WillAssociate(Connection as rdoConnection, Cancel as Boolean)

WillAssociate 事件语法包括以下部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
Connection | 对象表达式，该表达式对一个被关联的 rdoConnection 对象进行求值。
Cancel | 布尔表达式，该表达式指明 RDO 是否应禁止该关联。

用于 Cancel 的设置值有：

设置 | 描述
True | RDO 将禁止该关联。
False | （缺省值） RDO 将不禁止该关联。

说明

该事件是在将属性 ActiveConnection 设置为有效的 rdoConnection 对象之后，但实际关联还没有进行之前引发的。

参数 Connection 是对一个试图与某个 rdoResultset 对象相关连的 rdoConnection 对象的引用。当 WillAssociate 事件引发时，属性 ActiveConnection 保持试图关联之前的设置值。可用此属性来决定当前 rdoResultset 连接的关联。

通过将参数 Cancel 设置为 True 也可以禁止该关联，从而使 RDO 不把结果集与新的连接相关联并产生一个运行时错误。如果使用参数 Cancel 不禁止关联，在此事件过程完成之后，属性 ActiveConnection 被设置为包含在参数 Connection 中的引用。


WillChangeData 事件

该事件发生在列中的数据被改变之前。

Private Sub object.WillChangeData(NewValue as Variant, Cancel as Boolean)

WillChangeData 事件的语法包括以下部分：

部分 | 描述
Object | 对象表达式，其值是“应用于”列表中的一个对象。
NewValue | Variant 表达式，该表达式中包含将要应用到该列的数据。
Cancel | 布尔 表达式，该表达式指明 RDO 是否禁止该改变。

用于 Cancel 的设置值有：

设置 | 描述
True | RDO 将禁止该改变。
False | （缺省值） RDO 不禁止该改变。

说明

该事件正好在 RDO 给列中数据提交任何改变之前引发。通过捕获该事件，可以修改该新值，或通过修改参数 Cancel 来禁止改变。

如果修改了参数 NewValue，修改过的值被赋给列的 Value 属性。这将允许对数据进行翻译或代替数据。

在缺省的情况下，参数 Cancel 为 False，但是如果将它设置为 True，对列的数据的修改就被取消，同时 RDO 要产生一个可捕获的错误。


WillDissociate 事件

该事件发生在将连接置成空之前。

Private Sub object.WillDissociate(Cancel as Boolean)

WillDissociate 事件的语法包括以下部分：

部分 | 描述
Object | 对象表达式，其值是“应用于”列表中的一个对象。
Cancel | 布尔表达式，该表达式表明 RDO 是否将禁止该解除关联。

用于 Cancel 的设置值有：

设置 | 描述
True | RDO 将禁止该改变。
False | （缺省值）RDO 不禁止该改变。

说明

该事件在开发者试图将 ActiveConnection 属性设置为 Nothing ，但结果集还没有从该连接解除关联之前发生。

如果要禁止解除关联，可将参数 Cancel 设置为 True，从而引起 RDO 取消此操作并触发一个可捕获的错误。

Cancel 参数的缺省值为 False，所以如果此事件没有被捕获，则此解除关联即被完成。


WillExecute 事件

该事件在查询执行后发生。

Private Sub object.WillExecute(Query as rdoQuery, Cancel as Boolean)

WillExecute 事件的语法包括以下部分：

部分 | 描述
Object | 对象表达式，其值是“应用于”列表中的一个对象。
Query | 一个对象表达式，该表达式对一个刚刚完成查询的 rdoQuery 对象进行求值。
Cancel | 布尔 表达式，该表达式表明 RDO 是否将禁止此改变。

用于 Cancel 的设置值有：

设置 | 描述
True | RDO 将禁止改变。
False | （缺省值） RDO 将不禁止改变。

说明

该事件在一个查询执行之前被引发，不管这个查询是一个动作还是返回行的查询。可以捕获这个事件来禁止某些查询的执行，或对 rdoQuery 对象的 SQL 串做最后的调整。

参数 Cancel 可用来禁止查询。参数 Cancel 缺省为 False，但是如果把它设置为 True，查询不会执行，而且 RDO 将产生一个可捕获的错误指明查询被取消。

例如，可预演该查询以明确 WHERE 子句没有引起一个表扫描操作。这样，通过将参数 Cancel 设置为 True，可以禁止不提供名字或街道地址就想进行搜索的 "Smith" 的客户的查找。

WillExecute 事件对于所有在 rdoConnection 上执行查询都被引发。这包括那些通过 OpenResultset 或 Execute 方法执行的查询以及从一个被关联的 rdoQuery 对象上执行的查询。参数 Query 是一个对象的引用，它指明哪一个查询将执行。使用这个参数，可以为此连接上的所有查询编写一个简单的事件处理程序，但仍然可以为特定的查询定制处理程序。当对 rdoConnection 对象自身执行查询时，RDO 在内部创建一个 rdoQuery 对象，同时，一个对这个内部的 rdoQuery 的引用作为参数 Query 被传递。


WillUpdateRows 事件

该事件发生在对数据库进行更新操作之前。

Private Sub object.WillUpdateRows(ReturnCode as Integer)

WillUpdateRows 事件的语法包括以下部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
ReturnCode | 整数表达式或常数，用以表明开发者是否如设置值中所描述的那样来处理更新。

在该事件处理过程中，ReturnCode 参数被用来通知 RDO 代码正在执行的活动内容。该参数可能的值如下：

设置 | 描述
rdUpdateSuccessful | 代码处理了更新，并且成功地进行了更新。
rdUpdateWithCollisions | 代码成功地处理了更新，但是一些行发生了冲突（仅对批处理模式）。
rdUpdateFailed | 代码试图处理更新，但是在处理更新时遇到了一个错误。
rdUpdateNotHandled | 代码没有处理更新，RDO 将继续发出通知，并且在该更新没有处理时，RDO 将自己更新数据。

说明

WillUpdateRows 事件在更新之前引发，新的和被删除的行被提交到服务器。通过响应该事件并执行以前保存的过程或其它选用的机制来执行自己的更新，可以代替光标的更新行为。

如果结果集正在使用批处理优化并发，该事件仅当 BatchUpdate 方法被调用时才发生。在这种情况下，改变的全集将发送给服务器。

如果结果集不处于批处理模式，每次调用 Update 方法时 WillUpdateRows 事件都会发生，因为那一行的所有改变都被立即发送到服务器。

总而言之，无论结果集处于何种模式，在数据实际被送到服务器之前该事件发生。

如果将参数 ReturnCode 设置为 rdUpdateSuccessful，RDO 就假定代码已经成功地处理了更新。RDO 就不再把该事件发送到任何附加的客户（如果该事件有多于一个的处理程序）并且这一行或几行及其列的状态分别被设置为 rdRowUnmodified 和 rdColUnmodified。

如果将参数 ReturnCode 设置为 rdUpdateWithCollisions，RDO 就假定更新已经成功地处理了，但是有几行引起了冲突。RDO 不会将此事件发送到任何附加的客户（如果该事件有多于一个的处理程序）这些行及其列的状态将不发生改变。在处理该事件的过程中，设置列状态标志是代码的责任。如果正在使用批处理优化并发，并且想要核查和代码处理中的冲突时，则只能使用 rdUpdateWithCollisions。

如果将参数 ReturnCode 设置为 rdUpdateFailed，RDO 就假定代码试图处理此更新，但在进行更新时却碰到了一个错误。RDO 不会将此事件发送到任何附加的客户（如果该事件有多于一个的处理程序），并且这些行及其列的状态将保持不变。最后，RDO 产生一个让 Update 方法来捕捉的运行时错误，从而引起事件引发。

如果将参数 ReturnCode 设置为 rdUpdateNotHandled，RDO 就假定开发者没有处理此更新，并且 RDO 将继续给所有剩下的客户引发此事件（如果该事件有多于一个的处理程序）。如果所有的客户都返回 rdUpdateNotHandled，RDO 将按照常规自己执行此更新。

参数 ReturnCode 的缺省值为 rdUpdateNotHandled，所以，如果无客户使用此事件或无客户改变 ReturnCode 的值，则 RDO 将执行此更新。


对象集合：不允许给 Count 属性赋值（错误号 40051）。

不能在代码中设置这个集合的 Count 属性。该属性由 Visual Basic 自动维护。


行对于 AddNew 无效（错误号 40010）。

当前行指针对该操作无效。


已经在 BOF（错误号 40030）

当 BOF 属性为 True 时，试图使用如 MovePrevious 或 MovePrevious 当前行重定位方法。


已经在 EOF（错误号 40031）

当 EOF 属性为 True 时，试图使用如 MoveNext 或 MoveLast 当前行重定位方法。


对象已经关闭（错误号 40046）

试图在已关闭的对象上调用 Close 方法。

为了避免此错误，不要在已关闭的对象上使用 Close 方法。


该 rdoConnection 对象已经连接到数据源上了（错误号 40072）。

当 rdoConnection 对象还同某个数据源连接着的时候，试图对它使用 EstablishConnection方法。用 Close 方法来解除它当前的连接，然后再重试。


集合中已经有该对象（错误号 40077）。

不能用所提供的名字向这个集合添加成员。该集合中已经存在另外一个取这个名字的成员。


对未绑定列不能赋值（错误号 40037）

试图给代表一个大的二进制对象 (BLOB) 或类似的对象的列赋值。

为了避免此错误，请使用 AppendChunk 方法来给这种类型的列赋值。并使用 ChunkRequired 方法来判定有疑问的列是否要求 AppendChunk。


有异步查询进行时不能执行查询（错误号 40045）

一个异步 查询仍在执行时，试图调用方法或属性。

为了避免此错误，应检查 StillExecuting 属性，在 StillExecuting 属性返回 False 之前，不要调用影响 SQL 语句的 RDO 属性或方法。


属性在 RemoteData 控件的当前状态下不可用（错误号 40514）。

有些 RemoteData 控件的属性在运行时不可用。


仅有 rdUseClientBatch 游标驱动器能支持 rdConcurBatch 锁定类型（错误号 40081）。

只要用优化批更新来工作，或解除 rdoResultset 对象的关联时，就必须使用客户批游标库。


不支持这个功能（错误号 40082)

在此上下文中不支持这个操作。


已设置了 BOF（错误号 40025）

BOF 属性已设置为 True，试图调用 rdoResultset.MovePrevious。这意味着当前行指针已定位在结果集第一行之前，但却试图执行一个移动操作，而该操作可能会把指针移到无效的位置上。

为了避免出现这个错误，应在调用 MovePrevious 方法之前检查 BOF 属性的状态。


一般的客户游标错误（错误号 40069）。

没有关联的查询对象，却试图执行 BatchUpdate 或 Requery 方法。


对象无效或还没有设置（错误号 40011）。

试图用还没有设置的对象来赋值。

ODBCDirect: GetRows (错误号 40035)

不要使用带有长值字段的 GetRows 方法。如果在包含长值字段（备注或长二进制）的 ODBCDirect Recordset 对象上使用 GetRows 方法，在应该是长值字段的数组中存入的会是一个错误的变量。。数组数据值将是 “错误 40035” 且数据类型 Variant 。


对象集合：不能找到由文本所指示的项（错误号 40041）

试图使用文本值来访问集合中的对象，而该集合中又没有与所提供的文本串相匹配的对象。例如，试图用名字来引用结果集的一列，而该结果集中却没有所指定的列。

为了避免此错误，应确保结果集中有一个对象的 Name 属性与所提供的文本串相匹配，或是使用这个对象的序号值。


对象集合：非法的修改─集合是只读的（错误号 40049）。

试图从只读的集合中删除一个成员。


对象集合：这个集合不支持文本标签定位（错误号 40021）

试图在集合中用文本串来查找对象，而该集合中的对象不支持由文本串查看。例如，不能用名字来引用 rdoErrors 集合的成员，而只能用序号。

为了避免此错误，可用序号值来代替，例如 rdoErrors(1)。


对象集合：非法修改─集合是只读（错误号 40049）

试图计划修改 RDO 集合的内容，然而这个集合是只读的。

为了避免此错误，不要试图修改这种类型 RDO 集合的内容。对这种集合类型，自动添加到该集合的各项在为对象调用 Close 或 Remove 方法时将被删除。


配置 DSN 时出现了错误。请检查各个参数，然后再重试（错误号 40000）

调用 rdoEngine.rdoRegisterDataSource 失败。

为了避免出现这个错误，应检查所传递的 rdoRegisterDataSource 参数的有效性，然后再重试。


不能为无效的数据库连接创建准备语句（错误号 40015）

程序试图对无效 rdoConnection 创建 rdoPreparedStatement 或 rdoQuery 对象。

为了避免出现这个错误，应确保 rdoConnection 对象当前已连接到数据源上。


不正确的 CursorDiver。仅支持 rdUseClient（错误号 40075）。

除非正在使用客户批游标库，否则不能设置 ActiveConnection 属性。


用这个结果集绑定到数据控件上的控件取消了该操作，或该控件不能使它自己同此结果集同步（错误号 40503）。

用这个结果集绑定到数据控件上的控件取消了该操作，或该控件不能使它自己同此结果集同步。


控件取消了该操作，或出现了意外的内部错误（错误号 40503）。

控件取消了该操作，或出现了意外的内部错误，造成操作取消。


The _ is not registerable as an ActiveX control

You tried to register a control or DLL which is not a valid ActiveX component. Make sure that you have the correct control or DLL. If this is a third-party ActiveX control or DLL, contact the component's vendor for more information.


不能刷新控件（错误号 40504）。

RemoteData 控件不能刷新关联的被绑定的控件。


传递给游标类型参数的值无效（错误号 40034）

试图调用 OpenResultset 方法，而传给 type 参数的值却不属于下列值之一：

  • rdOpenKeyset

  • rdOpenDynamic

  • rdOpenStatic

  • rdOpenForwardOnly

为了避免出现这个错误，应确保 type 参数取上面所列值之一。

注意 并非所有的数据源都支持所有游标。


数据类型转换错误（错误号 40517）。

这个错误往往是在试图从被绑定的控件来设置数据列时，由于不能转换 Variant 数据类型而引起。


在一个要求参数（这些参数是完成连接所必须的）的 ODBC 对话框中已经选择了“取消”（错误号 40059）。

当提示所需的连接参数（例如用户标识号、密码或数据源名）时，用户选取了“取消”。


ODBCDirect: GetRows (Error 40035)

You should not use the GetRows method with long value fields. If you use the GetRows method on an ODBCDirect Recordset object containing long value fields (Memo or Long Binary), you will get an error variant stored in the array where the long value field should be. The array data value will be “Error 40035” and the data type Variant.


集合中存在此环境名（错误号 40048）

试图调用 rdoEngine.rdoCreateEnvironment 方法、rdoConnection.CreatePreparedStatement、rdoConnection.CreateQuery 或 Add 方法，而传递的是一个在 rdoEnvironments、rdoConnections 或 rdoPreparedStatements 集合中已经存在的名字。

为了避免此错误，应确保所传递的名字没有同已添加进集合中的名字发生冲突。


无当前行（错误号 40009）。

当前指针还没有定位到一有效行上时，就想进行编辑、删除或执行某些别的操作。当存在下列情况时将出现该错误：

  • 结果集的所有行都被删除了。

  • 结果集中没有行。

  • 一行或多行的书签已无效。

无更新行或删除行

当使用带有动态游标结果集的相对移动方法（例如 MovePrevious, MoveNext 等等）时，发生该错误。

当您在其它用户对您当前行集合（即，您高速缓存在客户中的行）上面或下面的行做了删除之后使用动态游标，也会发生错误。当您向删除行移动时，您当前窗口中的一些行会返回，因为您正在请求前一个或下一个行集合的大小。当您接近结果集的开头或结尾时，数据会重叠，因为没有足够的行得到唯一的新集。

设置一个较低的行集合大小可以帮助解决这个问题。但是如果要考虑性能的话，它降低了性能，您最好不要先使用动态游标，与其它游标的移动数据相比，动态游标不是最快的执行者。

由于这一点，由于数据删除时产生的带有错误信息的问题，建议尽量不要使用动态游标，除非需要并知道您当前所做的事情。键集或静态游标集比动态游标集更容易处理，而且对大多数客户/服务器开发者来说，客户方的批静态可能是最好的选择。


不能执行空 rdoPreparedStatement（错误号 40018）

在调用 Execute 方法的期间，rdoPreparedStatement 或 rdoQuery 对象的 SQL 属性中有 Null 或空字符串。

为了避免出现这个错误，应确保 rdoPreparedStatement 或 rdoQuery 对象的 SQL 语句是有效的，可通过把它作为参数传递给 CreatePreparedStatement 或 CreateQuery，或通过设置 rdoPreparedStatement 或 rdoQuery 对象的 SQL 属性进行。


用户取消操作（错误号 40059）

用户在 ODBC 对话框中单击了“取消”按钮。


不能与远程数据对象连接（错误号 40516）

RemoteData 控件不能创建远程数据对象。如果 Microsoft 远程数据对象库没有正确地注册，或该库不在计算机上，就会出现这种错误。

要人工注册远程数据对象库，可在命令提示行键入以下内容：

regsvr32 msrdo32.dll

如果系统中没有 MSRDO32.DLL，需重新安装 Visual Basic 或应用程序，并确认是否购置了企业版，以及应用程序安装程序是否正确安装。


出现了错误。不能检索错误信息（错误号 40501）。

RDO 碰到了内部错误。但没有进一步提供关于错误原因的信息。


试图用 Execute 方法来发出 SELECT 语句（错误号 40057）。

Execute 方法可用来执行那些不返回行的操作查询。所执行的查询包含一个或多个 SELECT 语句。在某些情况下，被存储过程会调用其它包含 SELECT 语句的被存储过程。


试图使用 Execute 方法发出一个选择语句（错误号 40057）

试图使用 Execute 方法发出一个 SELECT 语句。当执行包含 SELECT 语句的被存储过程时，也会出现这个错误。

为了发出一个选定查询，应代之以使用 OpenResultset 方法。Execute 方法是用于动作查询 (Insert、Update、Delete) 的。


加载 RDOCURS.DLL 失败（错误号 40078）。

批游标库 DLL 找不到或已经损坏。


列没有正确绑定（错误号 40035）

试图打开一个具有未知数据类型的列的结果集。多数情况下，ODBC 驱动程序能够识别由正在访问的后端版本所支持的所有数据类型。当驱动程序不能识别所返回的数据类型时，也会出现这个错误。

详细信息，可参阅关于生成该列数据的数据源的文档。例如，要获得关于 SQL 服务器驱动程序的详细信息，可参阅 DRVSSRVR.HLP 文件。


非编辑模式不能给列赋值（错误号 40039）

在调用 rdoResultset.Edit 或 rdoResultset.AddNew 之前，试图给一列赋值。

为了避免此错误，在给具有 Value 属性或 AppendChunk 方法的各列赋值之前，应确保已调用了 Edit 或 AddNew 方法。


不可更新的列不能赋值（错误号 40038）

试图给不可更新的列赋值。

为了避免此错误，在给具有 Value 属性或 AppendChunk 方法的列赋值之前，应保证结果集是可更新的。注意，由于多种因素（包括权限和游标类型），Updatable 属性并不一定总是能反映任一给定结果集的可更新性。


不能给不可更新的字段赋值（错误号 40038）。

试图更改只读类型的数据库列的 Value 属性。


用于比较的数据类型不兼容（错误号 40014）

用参数来调用 rdoResultset 时，该参数的数据类型与所比较列的数据类型不兼容。

为了避免此错误，应确保在比较过程中所用的值同正在对它做比较的那一列的数据类型相匹配。另外，只有由数据源控件调用时，这个方法方才有效。


比较不相容的数据类型（错误号 40014）。

试图比较不相容的数据类型。例如，把 Binary 类型的数据同 mumeric 类型的数据进行比较。


该 rdoConnection 对象正忙于连接（错误号 40073）。

在 StillConnecting 属性返回 False 之前，不能使用该 rdoConnection 对象。


给 rdoParameter Value 属性赋值时发现了不正确的类型（错误号 40044）。

给出现问题的 rdoParameter 的所指定数据类型与正被赋值的数据类型不匹配。例如，数据类型设置为 Integer，而所赋的值却为 String。

只要有可能，RDO 会根据从远程数据源传回的信息来选取数据类型。将 rdoParameter 对象的 Type 属性设置为正确的数据类型，可使由 RDO 选取的那个数据类型无效。


该对象还在其它集合中（错误号 40083）。


AddNew 的行无效（错误号 40010）

当游标定位在无效行上时没有调用 rdoResultset.AddNew，或程序以前已经调用了 AddNew 或 Edit 操作，却没有调用 Update 或取消该操作。

为了避免此错误，可把游标移到有效行上，确保存在一个有效的结果集，并保证随后对 rdoResultset 的调用都是正确的。


一个或多个参数无效（错误号 40508）

至少有一个用这种方法调用的参数值超出了有效值域。应使用有效的参数值来调用该方法。

对有问题的方法可搜索文档，以获得另外的信息。


一个或多个参数无效（错误号 40508）。

所提供的参数在这个上下文中无效。


无效的书签（错误号 40027）

给 rdoResultset.Move 传递了无效书签值。

为了避免此错误，应确保传递的书签有效。可以用 rdoResultset.Bookmark 检索书签，并保证存储书签的变量仍然有效。


用于移动的书签参数无效（错误号 40028）

没有以正确数据类型把 bookmark 参数传递给 rdoResultset.Move。

为了避免此错误，应确保以 Integer 或 Byte 数据类型传递 bookmark 参数。可用 rdoResultset.Bookmark 检索书签，并保证存储书签的变量仍然有效。


给并发选项传递了一个无效的值（错误号 40019）

把无效的锁定类型传递给了 rdoPreparedStatement.LockType，或rdoPreparedStatement.OpenResultset 中的 locktype 参数，或rdoQuery.LockType，或 rdoQuery.OpenResultset 中的 locktype 参数。

为了避免出现这个错误，应确保传递下列几种有效的锁定类型之一：

  • rdConcurReadOnly

  • rdConcurLock

  • rdConcurRowVer

  • rdConcurValues

注意 并非所有的锁定类型都可用在每一个数据源上。


连接字符串无效（错误号 40005）

给 rdoEnvironment.OpenConnection 传递的、或通过私有的 rdoConnection 对象的 Connect 属性给 EstablishConnection 方法传递的字符串无效。

为了避免此错误，应确保传递给 rdoEnvironment 的 OpenConnection 方法的 ODBC 连接字符串有效。


传递给游标驱动程序的值无效（错误号 40003）

给 rdoEnvironment.CursorDriver 或 rdoEngine.rdoDefaultCursorDriver 传递的类型值无效。

为了避免出现这个错误，应传递下列值之一：

  • rdUseIfNeeded

  • rdUseODBC

  • rdUseServer

  • rdUseClient

  • rdUseNone

注意 并非所有的数据源驱动程序都支持所有游标。


对于仅向前游标操作无效（错误号 40008）

处理仅向前类型的查询时，程序调用了 rdoResultset.MovePrevious、rdoResultset.MoveLast 或 rdoResultset.MoveFirst。

为了避免此错误，可把游标类型改为 rdOpenKeyset、rdOpenDynamic 或 rdOpenStatic，或对于仅向前的 rdoResultset 只调用 MoveNext。


必须为环境指定有效的名字（错误号 40047）

在调用 rdoEngine.rdoCreateEnvironment 方法或与私有 rdoEnvironment 一起的 Add 方法时，试图把无效的名字传递给 name 参数。

为了避免此错误，应确保传递给 name 参数的名字是有效的。这个名字可以是不为 null 或空的任何字符串表达式，而且它不能同以前添加进集合中的任何名字重名。


对象无效或未建立（错误号 40011）

程序在一个对象上调用方法或操作，而该对象已被关闭、遗弃或没分配。

为了避免此错误，应确保：

  • 使用 Set 语法分配对象。

  • 对象及其父对象没有关闭。

  • 对象没有被设置为 Nothing。


出现无效的 ODBC 句柄（错误号 40004）

执行 ODBC 操作时，出现了由无效的 ODBC 语句句柄引起的错误。

要获得该问题的准确描述，可检查 rdoErrors 集合。如果找不到信息，应确保以前的操作没有释放或改变这个语句句柄。


无效的操作 (错误 40055).

该操作在这个上下文中无效。


无效的操作（错误号 40055）

属性或所调用的方法在上下文中无效。例如，可能对不可更新的 rdoResultset 使用了 Edit 或 Update 方法。

为了避免此错误，检查要进行的操作序列，并确保这些操作都是正确的。一个可能的原因是，试图在一个元数据列（即由 rdoTable 而非 rdoResultset 所生成的列）上设置列值。


选项标志无效（错误号 40085）。

所选取的选项在这个上下文中无效。


传递的参数无效（错误号 40054）

传给属性或方法的值无效。

赋给属性或方法的值不合适，因为大多数属性和方法只能接受一定类型的、在某个范围内的值。请参阅该属性或方法的帮助主题，以决定合适的值的类型和范围。


属性值无效（错误号 40505）。

给这个属性赋了一个无效的值。


寻道标志无效（错误号 40012）

给 rdoResultset 传递了一个无效的寻道标志。可用这一条消息来创建第三方的被绑定的控件。

为了避免此错误，应确保所传递的标志取下列值之一：

  • DBSEEK_LT

  • DBSEEK_LE

  • DBSEEK_EQ

  • DBSEEK_GE

  • DBSEEK_GT

  • DBSEEK_PARTIALEQ

另外，只有由数据源控件调用时，这个方法方才有效。


状态对 Move 无效（错误号 40023）。

不能在这个上下文中使用 Move 方法。


用于移动的状态无效（错误号 40023）

结果集标记为无效时，试图调用 rdoResultset.MoveFirst 或 rdoResultset.MoveNext。结果集标记为无效发生在：

  • 调用 Move 方法之前，在结果集上调用了 Cancel 方法。

  • 调用 MoreResults 方法，但却没有更多的结果集。

  • 出现了 SQL 错误。

为了避免此错误，应确保当前结果集是有效的，而且还没有调用过可能会把该结果集标记为无效的操作。


参数类型不正确（错误号 40040）

检测到带有无效类型的 Variant。把值传给一个不能强制为正确类型的 RDO 方法或属性，就会引起该错误。例如，试图把一个字符串数据类型作为一个数字值来传递。

为了避免此错误，应确保传给操作的值的类型是正确的。对于列值，可检查列的 Type 属性，以保证传递的类型正确。


用于更新的结果集状态无效（错误号 40026）

当前行指针正指向无效行，或结果集标记为无效时，试图调用 rdoResultset.Update。该错误出现在：

  • 当前行指针正指在 EOF 或 BOF 上。

  • 由于调用了诸如 Cancel 一类的方法，结果集已标记为无效。

  • 出现了 SQL 错误。

另外，删除一行也使该行标记为无效。

为了避免此错误，在调用 Update 之前，应检查 BOF 和 EOF 的状态；并保证在调用 Update 之前，没有调用其它可能会将该结果集标记为无效的方法。


加载版本库 (VERSION.DLL) 时的错误（错误号 40016）

试图调用 rdoEngine.rdoVersion，而应用程序却没有加载 Win32 库文件 VERSION.DLL。

为了避免此错误，应确保 VERSION.DLL 文件在系统路径上。


加载 ODBC 安装库 (ODBCCP32.DLL) 时出现了错误（错误号 40032）

试图调用 rdoEngine.rdoRegisterDataSource，而应用程序又没有加载 ODBC 安装库文件 ODBCCP32.DLL。

为了避免出现这个错误，应确认在产生该错误的机器上是否已正确地安装了 ODBC，并且保证 ODBCCP32.DLL 文件在系统路径上。


不能加载对应于 rdoLocaleID 的资源库（错误号 40061）

找不到本地的 DLL 或本地的 DLL 损坏了。


加载 Win32 库 (version.dll) 时出现了错误（错误号 40016）。


RemoteData 控件报告：内存溢出（错误号 40510）。

任何内部资源耗尽时都会引起该错误，包括 RAM、磁盘交换空间或内部句柄。


方法在 RemoteData 控件的当前状态下不能被调用（错误号 40507）。

在 RemoteData 控件当前的状态下不能调用该方法。


EOF/BOF 已设置，不能相对当前行移动（错误号 40029）

结果集已定位在 EOF 或 BOF，或结果集标记为无效时，试图调用（传递的 bookmark 参数为 Null）rdoResultset.Move 以指定相对移动。

注意 如果设置了 EOF 或 BOF，必须把一个有效的书签作为 Move 调用的一部分传递。

为了避免此错误，应确保 EOF 或 BOF 属性没有设置，或者提供有效书签。


超出了结果集的末端（错误号 40024）

EOF 属性已设置为 True，试图调用 rdoResultset.MoveNext。

为了避免出现这个错误，应在调用 MoveNext 之前检查 EOF 属性的状态。


游标类型应为：rdOpenForwardOnly。LockType 应为：rdConcurReadOnly。RowsetSize 应为：1（错误号 40080）。

对这种类型的操作必须使用“无游标”结果集。参见所示来设置 OpenResultset 选项，RDO 将创建一个无游标的结果集。


GetNewEnum：不能为 IID_Iunknown 获得接口（错误号 40050）

为了使集合上进行迭代的 For...Each 语法在分配内存时有效，所出现的一个内部错误。

这个错误可由任一种耗尽系统资源的条件引发，系统资源包括内部句柄、RAM、磁盘空间以及对象引用指针。对递归过程或那些会使内存丢失的过程应小心从事。


rdoQuery 或 rdoResultset 无活动的连接（错误号 40074）。

除非该对象有一个活动的连接，否则想执行的操作是不允许的。


列缓冲区被绑定了，因此不能追加数据。用 Value 属性来设置数据（错误号 40048）。


连接没有打开（错误号 40512）。

试图进行的操作要求 rdoConnection 对象关联到一个具体的服务器上。用 EstablishConnection 或 OpenConnection 方法来打开连接。


无当前行（错误号 40009）

游标定位在无效行上时没有调用 rdoResultset.Edit。引起这个错误原因或许是由于试图编辑已删除的行，或许是由于当游标定位在第一行之前或最后一行之后时调用 Edit。

为了避免此错误，可把游标移到有效行上，并确保存在一个有效的结果集。如果 BOF 或 EOF 属性为 true，就不能使用 Edit 方法。


SQL 返回“没有找到数据”（错误号 40001）

试图执行的 SQL 语句返回了一条消息，指明没有找到查询的数据，或试图执行的操作语句（Insert、Update 或 Delete）没有影响任何行。然而，对发出不期望查询有数据或查询的行存在的场合，这或许是一个有效的响应。

为了避免此错误，可改动 SQL 语句中的条件，再重试一次。


出现了错误，但无可用信息（错误号 40501）。

RDO 碰到了内部错误。但没有进一步提供关于错误原因的信息。


对象集合：不能添加非对象项（错误号 40053）。

试图把不同类型的对象添加到集合中。例如，试图把一个 rdoResultset 对象添加到 rdoQueries 集合中时会触发这个错误。


不能连接到 RemoteData 对象上（错误号 40516）。

该错误发生在连接指定的数据源失败时。连接不成功的原因可能是网络、远程服务器、用户身份或其它的选项无效。该错误也可能是由于网络、远程服务器或有关的任何连接性部件的硬件失效所引起。


No rows updated or deleted

This error occurs when using relative move methods (such as MovePrevious, MoveNext, and so on) with a dynamic cursor resultset.

It can also occur when you use a dynamic cursor after another user has deleted rows just above or below your current rowset window (that is, the rows you have cached on your client). When you move toward the deleted rows, some of the rows in your current window return since you are asking for the previous or next rowset size of rows. When you're near the end or beginning of a resultset, you can get data overlap since there are not enough rows to get a unique new set.

Setting a lower rowset size can help solve this problem. It degrades performance, but if performance is a concern, you're better off not using a dynamic cursor in the first place, since they're not the speediest performers when moving data compared to other cursors.

Because of this, and because of the problem with error messages when data has been deleted, it is recommended that you avoid using dynamic cursors unless you need them and know what you're doing. A keyset or static cursor is much easier to deal with than a dynamic cursor, and a client-side batch static is probably the best overall choice for most client/server development.


这一列没有设置 ChunkRequired 标志。用 Value 属性来检索它的内容（错误号 40060）。

不能对不要求使用 GetChunk 方法的列使用该方法。


该 rdoConnection 对象没有连接到数据源上（错误号 40071）。

rdoConnection 对象可以被实例化而不连接到某个具体的数据源上。为了执行该操作，必须先用 EstablishConnection 或 OpenConnection 方法来打开连接。


出现了内部的 ODBC 错误（错误号 40002）

最近被调用的属性或方法出现了 ODBC 错误。

精确的错误取决于 ODBC 驱动程序及正在使用的数据库的类型。要获得此问题的准确描述，可检查 rdoErrors 集合。

注意 在语句执行过程中，ODBC 可能产生一个以上的错误。确保检查 rdoErrors 集合中的每一个错误。


遇到无效的 ODBC 句柄（错误号 40004）。

代码引用了无效的 ODBC 句柄（诸如无效的 hEnv、hDbc 或 hStmt 属性）。如果直接使用 ODBC API，可能会使一个或多个句柄无效。


对仅向前的游标的操作无效（错误号 40008）。

仅向前的游标不支持正在使用的当前行定位方法。只能用 MoveNext 方法重新定位仅向前的游标。


内存溢出（错误号 40510）

所需的系统资源比可用的系统资源多。这种错误可能有以下一种或多种原因和解决办法：

  • 打开了过多的应用程序、文档或资源文件。

    应关闭不需要的应用程序、文档或资源文件。

  • 装入了过多的窗体或控件。

    应取消不必要的开销，或者是分解应用程序，以减少一次装入的窗体或控件。

  • 运行超出了 Public 变量的空间。

    应减少 Public 变量的数目。

  • 已经耗尽了可用的 TEMP 或虚拟内存空间。

    应使用系统资源检测程序来查看可用的系统资源。检查可用的磁盘空间。

  • 无足够的 RAM 来运行已装入内存的应用程序或应用程序集合。

    安装额外内存，以增加可用的 RAM 量；或重新分配内存，以减小 SmartDrive 或其它高速缓存。

  • 应用程序产生了内存漏洞；应用程序分配的内存不再需要时却没有释放。

  • 编写的可重入代码不能正确地执行，或者是过程数组分配内存过多。


仅作输出的参数不能赋值（错误号 40043）

试图给定义为（仅作）输出的参数设置数值。

为了避免此错误，可使用 Direction 属性，以确定将要给它赋值的参数是定义为输入参数 (rdParamInput)，还是输出/输入参数 (rdParamInputOutput)。一般来说，Direction 属性是基于被调用过程定义方式自动设置的，不过有的驱动程序要求访问参数之前设置这个方向。如果参数序号或名字不匹配，把输出参数误作为输入参数，也会出现这个错误。


部分等式要求字符串列（错误号 40013）。


部分相等要求字符串列（错误号 40013）

调用 rdoResultset.FindByValues 时，把 DBSEEK_PARTIALEQ 指定在一非字符串的列上。DBSEEK_PARTIALEQ 仅工作在包含字符串数据的列上。

为了避免此错误，应在字符串列上仅使用 DBSEEK_PARTIALEQ。另外，仅由数据源控件调用时，这个方法才有效。

可用这条消息来创建第三方的被绑定的控件.。


传递给提示选项的值无效（错误号 40033）

试图调用 rdoEnvironment.OpenConnection，而传给 prompt 参数的值不属于下列值之一：

  • rdDriverPrompt

  • rdDriverNoPrompt

  • rdDriverComplete

  • rdDriverCompleteRequired

为了避免出现这个错误，应确保 prompt 参数是上面所列值之一。


这个属性当前是只读的（错误号 40076）。

在对象的当前状态下，该对象的这个属性不能更改。


控件取消操作或出现意外内部错误

RemoteData 控件试图更新被绑定的控件数据的行，但 update 操作失败。这种情况常常由以下原因引起：

  • 被绑定控件的数据无效。

  • 数据类型不是结果集的列所要求的。

  • 被绑定控件中的值与行描述、规则或引发条件不匹配。

检查并修改数据值，然后重试该操作。


连接没有打开（错误号 40512）

因为没有与数据库的连接，所以 Connection 属性不能引用有效的数据库连接。要建立数据库连接，可检查 SQL 属性，把 DataSourceName 或 Connection 属性设置为有效值，并对 RemoteData 控件使用 Refresh 方法。


无效的对象（错误号 40506）

Resultset 属性只能用 rdoResultset 之外的对象赋值。Resultset 属性用有效的 rdoResultset 对象赋值。唯一的可以给 RemoteData 控件的 Resultset 属性赋值的那个对象是用另一个 RemoteData 控件、或 OpenResultset 方法所创建的一个 rdoResultset 对象。


无效的属性值（错误号 40505）

给属性赋了一个不合适的值。大多数属性只接受一定范围内的某种类型的值。

要查看属性的合适值，可在文档中搜索有疑问的属性。


RDC 的当前状态不能调用的方法（错误号 40507）

在 AddNew 或 Edit 操作进行时，调用了不能完成的方法。例如，当 RemoteData 控件 (RDC) 正在编辑一现有的行或正在添加一新行时，就不能调用 Refresh 方法。通过执行 Update 或 CancelUpdate 方法，或者在调用引起错误的那个方法之前使用移动方法，就可确认是否完成了 AddNew 和 Edit 操作。

对有问题的方法可搜索文档，以获得另外的信息。


RDC 当前状态不能设置的属性（错误号 40513）

用编程的方式设置了 Resultset 属性后，RemoteData 控件 (RDC)的某些属性不能设置。如果代码中创建了一个 rdoResultset 对象，并把它赋值给 RemoteData 控件的 Resultset 属性，则 RemoteData 控件就不能使某些属性自动复位，例如 DataSourceName、Options、Password、QueryTimeout 和 UserName 等属性。因为 rdoResultset 对象是在 RemoteData 控件之外被创建的，所以 RemoteData 控件不能使这些属性复位。

为使这些属性复位，关闭当前的 rdoResultset 对象，用编程的方式把 RemoteData 控件的属性设为新值，然后对这个 RemoteData 控件调用 Refresh 方法，以重建此结果集。

对有问题的属性可搜索文档，以获得另外的信息。


RDC 当前状态不可用的属性（错误号 40514）

因为只有创建了有效的 RemoteData 控件 (RDC) / RDO 的连接时某些属性才能访问，所以 RemoteData 控件的状态把这种属性限定为读访问。可设置适当的 RemoteData 控件属性，并且用 Refresh 方法来建立连接。

对有问题的属性可搜索文档，以获得另外的信息。


不能刷新控件（错误号 40504）

RemoteData 控件的 Refresh 方法由于以下原因失败：

  • 连接不能建立。

  • 结果集不能打开。

  • 被绑定的控件更新失败。

检查该连接、结果集和控件绑定（复查帮助中关于被绑定的控件的信息）。如果服务器或网络意外地断开了连接，也会发生该事件。一般来说，它标志着不能再使用该 rdoResultset 或连接。


结果集不可使用（错误号 40511）

打开或关闭结果集时出现了错误，所以 Resultset 属性不能找到有效的结果集。把 SQL 属性设置为有效值和/或对 RemoteData 控件使用 Refresh 方法。


出现错误。不能检索错误信息（错误号 40502）

RemoteData 控件内出现错误，并且无详细错误信息。该错误仅在十分特别的情况下才会出现，决不会出现在正常操作中。仅当 RemoteData 控件不能访问详细错误信息时，才会得到这条错误消息。OLE 工作异常时才会发生这种情况，并且一般来说，是较严重的错误。


出现意外内部错误（错误号 40500）

RemoteData 控件试图通知被绑定的控件新数据可用，但从 RDO 接收的却是失败代码。该错误仅在十分特别的情况下才会出现，决不会出现在正常操作中；并且只有在 Visual Basic 的绑定管理程序或被绑定的控件本身有严重错误时才会发生。一般来说，这条错误消息标志较严重的错误情况。


rdoResultset 为空（错误号 40022）

试图在一个空结果集上调用 rdoResultset.Move、rdoResultset.MoveNext 或 rdoResultset.MovePrevious。

为了避免此错误，在使用前面提到的任何方法时，应确保所用的 SQL 语句返回一个有效的结果集。通过检查 RowCount 属性，或通过检查 EOF 和 BOF 属性是否都为 True，就可查看结果集是否为空。


结果集是只读的（错误号 40058）。

试图在结果集中进行其所不支持的更新、添加或删除行操作。


试图重定位到已经被删除的行上（错误号 40056）。

该行已被删除了。


结果集为空（错误号40509）。

没有行返回结果集，或所有行都被删除了。


结果集不可用（错误号 40511）。

结果集的当前状态使其不能被引用。


试图移动的行已删除（错误号 40056）

试图用书签来移动已经从数据库中删除了的行。有问题的数据库行可能已经被存取这一行的程序（本程序或别的程序）删除。

为了避免此错误，应指定一个有效的书签，再试一次。


结果集为空（错误号 40509）

结果集为空，因此对于不存在的行，不能调用需要 UpdateRow 方法的操作。在调用 UpdateRow 之前应保证结果集非空。


属性不能在 RemoteData 控件的当前状态下被设置（错误号 40513）。

有些 RemoteData 控件的属性不能在运行时设置。


找不到要更新的表（错误号 40079）。

SQL 语法分析程序不能决定要更新的表。


结果集只读（错误号 40058）

试图在只读的结果集上进行 Edit、Delete 或 AddNew 操作。在打开该结果集时，应确保指定的 LockType 值正确，该值支持动作查询。


类型不匹配（错误号 40515）。

数据类型与所指定的列或参数不匹配。


类型不匹配（错误号 40515）

传递的 RemoteData 控件事件参数类型有错。检查这些参数的值。

对有问题的事件可搜索文档，以获得另外的信息。


不能为未命名的表打开结果集（错误号 40020）。

必须命名每一个用 rdoTable 对象引用的表。


未绑定的列--使用 GetChunk（错误号 40036）

未绑定的列—使用 GetChunk（错误号 40036）

试图访问一个含有大的二进制对象 (BLOB) 或类似对象的列，

为了避免此错误，应使用 GetChunk 方法来访问这种类型的列。如果参数使用时出现此错误，对表示大二进制对象（SQL 服务器中的文本或图象列）的列就不能使用参数。可以用属性 ChunkRequired 来判定有问题的列是否要使用 GetChunk。


对未绑定参数不能赋值（错误号 40042）

试图给未绑定的参数赋值。

为了避免此错误，应保证前面 RDO 的方法没有错误返回。如果返回了错误，修改所传递的 SQL 语句，然后再重试该操作。


出现意外错误（错误号 40501）

RemoteData 控件试图调用一种正常情况下应该存在的RDO方法。却找不到该方法，或者不能正确完成调用。该错误仅在十分特别的情况下才会出现，而决不会出现在正常操作中。当 RemoteData 控件不能获得对 RDO 的指派接口，或 RDO 中的方法由于某种未知原因而失败时，就可看到这条错误消息。一般来说，这条错误消息标志较严重的错误情况。


意外错误（错误号 40006）

出现致使 RDO 不稳定的意外错误。如果用 ODBC API 来操作 使用了一种 ODBC 句柄的由RDO生成的对象时，也会出现该错误。

为了避免此错误，应确保有充足的空闲资源和内存，然后重新启动程序，再试一次。


出现了意外的内部错误（错误号 40503）。

许多内部的有效性检查都会引起此类错误，那些有效性检查指明应了用程序耗尽了资源，或是出现了其它不确定的问题。


不能执行没有准备的 rdoPreparedStatement （错误号 40017）

在对 rdoPreparedStatement.Execute 或 rdoQuery.Execute 中所传递的 SQL 语句进行准备时，出现了 ODBC 错误。

详细的信息，可检查 rdoErrors 集合，并确保 rdoPreparedStatement 或 rdoQuery 对象的 SQL 语句对正引用的数据源是有效的。


必须用 AppendChunk 来设置 TEXT 或 IMAGE (BLOB) 字段中的数据（错误号 40052）。

字段中的字节数要求使用 AppendChunk 方法。检查 ChunkRequired 属性来判定何时需要 chunk 方法。

不能作为 ActiveX 控件注册

试图对不是有效 ActiveX 部件的控件或 DLL 注册。确保有正确的控件或 DLL。如果这是第三方 ActiveX 控件或 DLL，请与部件提供商联系以获得更多信息。


Add 方法（远程数据）

添加一个成员到远程数据 Collection 对象。

语法

object.Add item, key, before, after

Add 方法语法包括下列部分：

部分 | 描述
Object | 对象表达式，用于计算包含在 rdoColumns 集合中的 rdoResultset 对象。
Item | 必须的。任何类型的表达式，指明要添加到集合defcollection 中的成员。
key | 可选的。唯一的字符串表达式，指明要访问集合中的成员可以使用的一个键字符串，而不是位置索引。
before | 可选的。指定集合中相对位置的表达式。要添加的成员放在集合中由 before 参数指定的成员前面。如果是数字表达式，则before 必须是一个从1到集合的 Count 属性值的数。如果是一个字符串表达式，before 必须与所引用的成员被添加到集合中时指定的键相一致。可以指定一个 before 位置或一个 after 位置，但不能二者都指定。
after | 可选的。指定集合中相对位置的表达式。要添加的成员放在集合中由 after 参数指定的成员后面。如果是数字表达式，则 after 必须是一个从1到集合的 Count 属性值的数。如果是一个字符串表达式，after 必须与所引用的成员被添加到集合中时指定的键相一致。可以指定一个 before 位置或一个 after 位置，但不能二者都指定。

说明

before 或 after 参数是字符串表达式还是数字表达式，必须参考集合中已有的成员，否则会发生错误。

如果指定的键与已经存在的集合中的成员键相同，也会发生错误。


AddNew 方法（远程数据）

为可更新的 rdoResultset 对象建立一个新行。

语法

object.AddNew

object 所在处代表一个对象表达式，其值为“应用于”列表中的一个对象。

说明

AddNew 方法准备一个新的行，可以对它进行编辑，并随后添加到由 object 使用 Update 方法命名的 rdoResultset 对象中。这个方法将列 初始化为 SQL_IGNORE，以保证未被引用的列不在更新操作范围内。

当执行 AddNew 方法时，EditMode 属性被设为 rdEditAdd，直到执行 Update 方法才被改变。

修改完这个新行之后，要使用 Update 方法保存修改值，并将该行添加到结果集中。在使用 Update 方法之前，对数据库不作改变－使用 Client Batch 游标库除外，在使用 BatchUpdate 方法之前不改写数据库。

如果 rdoResultset 是不可更新的，则 AddNew 方法就不返回错误信息。当 Update 方法被用于一个不可更新的对象时，就触发一个可以捕获的错误。对于一个可更新的对象，rdoColumn, rdoResultset 和 rdoConnection 对象也都必须是可更新的－在执行一个更新之前，先检查这些对象的每个 Updatable 属性。为什么 rdoResultset 不可更新有各种原因，这将在 Update 方法的主题中讨论。

注意 如果对行使用了 AddNew 方法，但未使用 Update，然后执行任何移动到另一行的操作，则修改将被丢失并不会出现警告信息。另外，如果关闭 object，或者结束声明 object 或其 rdoConnection 对象的过程，新的行及其修改将被废弃并不会出现警告信息。

如果被数据源和游标类型支持，则新添加的行作为 rdoResultset 的一部分是可视的。例如，新添加的行不包括在静态类型 rdoResultset 中。

当新添加的行包括在 rdoResultset 中时，使用 AddNew 之前的那个当前行仍然还是当前行。当行被添加到游标键集，并且希望它成为当前行时，可以将书签属性设置为 Bookmark，该属性由 LastModified 属性设置设定。

如果需要取消一个挂起的 AddNew 操作，则可使用 CancelUpdate 方法。

当使用了 AddNew 方法之后，再使用 Update 方法时，会引发一个 RowCurrencyChange 事件。


AppendChunk 方法（远程数据）

从 Variant 表达式向具有 rdTypeLONGVARBINARY 或 rdTypeLONGVARCHAR 数据类型的 rdoColumn 对象追加数据。

语法

object ! column.AppendChunk source

AppendChunk 方法的语法有下列部分：

部分 | 描述
object | 对象表达式，其值是包含 rdoColumns 集合的 rdoResultset 对象。
column | 对象表达式，其值是 rdoColumn 对象，该对象的 ChunkRequired 属性设置为 True。
source | 字符串表达式或变量，它包含要追加到被 column 指定的 rdoColumn 对象中的数据。

说明

大块数据列是用来保存大的二进制值 (BLOB) 或文本值，其值的大小范围可从几个字符到 1.2GB，并被保存在数据库中连续的数据页上。在很多情况下，大块数据不能由单个操作管理，因此必须使用大块方法保存和写数据。如果列的 ChunkRequired 属性为 True，可以使用 AppendChunk 方法生成列数据。不过，如果有足够的内存可供使用，RDO 也可以不用 AppendChunk 方法来执行操作。换言之，也可以简单地对 BLOB 列赋值。

使用 AppendChunk 方法将连续的数据块写到数据库列中，同时使用 GetChunk 方法从数据库列中抽取数据。某个操作（例如，复制）涉及临时字符串。如果字符串空间受限，可能需要用较小的大块列段代替整个的列。

使用 BindThreshold 属性指定最大的列的大小，列的大小将被自动限定。

使用 ColumnSize 属性确定在大块列中字节的个数。注意对于可以改变大小的列，当 ColumnSize 反映改变之前的列的大小时，不需要写回与由 ColumnSize 属性返回的同样的字节个数。

当使用 AppendChunk 时，如果没有指定当前行，则会出现一个可以捕获的错误。

注意 初始化 AppendChunk（在第一次 Edit 方法之后）时，如果该行已有数据，那么将取代已存在的列数据。后续的在单个 Edit 过程内的 AppendChunk 调用就向已存在的列数据追加数据。


BatchUpdate 方法（远程数据）

执行成批优化更新。

语法

object.BatchUpdate (SingleRow, Force)

BatchUpdate 方法的语法有下列部分：

部分 | 描述
object | 对象表达式，其值为“应用于”列表中的一个对象。
SingleRow | 布尔 值，如果只对当前行作了修改，其值为 True；如果对批中的所有行都作了修改，其值为 False。缺省值是 False。
Force | 布尔值，行或成批的行，不管是否造成冲突，都将覆盖数据库中已存在的行，其值为 True。缺省值是 False。

说明

这个方法完成批优化更新操作。如果同时使用批优化，需要调用该方法将修改如实地发送给服务器。

无论何时使用客户批游标库 (rdUseClientBatch) 打开连接，都要使用批更新。在这种情况下，每次使用 Update 或 UpdateRow 方法，都更新本地的 rdoResultset，但不改变基本数据库表。由于 rdoResultset 是最后建立的，或者与 BatchUpdate 命令同步，BatchUpdate 方法将任何修改的信息用于更新基本数据库表。

BatchUpdate 方法将 BatchCollisionRows 属性更新为每个未能更新的行都包含一个书签 - 与已存在的行发生冲突，因为其数据比在 rdoResultset 对象中第一次读取时更新了。BatchCollisionCount 属性指示处理批更新的过程中发生了多少次冲突。

如果使用 CancelBatch 方法，保存在本地 rdoResultset 对象中的修改就被放弃。当使用 CancelUpdate 方法，只将当前行的修改回滚到执行最后一个 Update 方法之前时的状态。

SingleRow 参数可和 Force 参数一起使用，使得即使发生冲突，也要强制将客户版本的数据备份到数据库中。SingleRow 参数将通知 RDO 只发送当前行备份到服务器中，而不是整个成批的行；Force 参数将通知 RDO 强制执行数据备份，并且不使用正规的优化同时检测。

如将 SingleRow 和 Force 参数都设为 True，就用当前更新的 rdoResultset 行覆盖数据库中的一个行。当处理冲突行，并且不论当前数据库行如何设置都强制保存本地版本的数据时，这是有用的。

如将 SingleRow 设置为 False 并且 Force 为 True，会造成将所有被改乱了的行强制备份到数据库中，这作为一个强制备份一切的速记方法，是有用的（孤注一掷）。

如将 SingleRow 设置为 True 并且 Force 为 False，会造成只对当前行进行详尽的优化并且更新，当只希望更新当前行，而不是全部成批的行时，这是有用的。


BeginTrans、CommitTrans、RollbackTrans 方法（远程数据）

下面的“事务方法”管理在会话处理中的事务，会话由 object 所在处表示：

  • BeginTrans 开始一个新的事务。

  • CommitTrans 结束当前事务并保存所作的修改。

  • RollbackTrans 结束当前事务并将在 rdoEnvironment 对象中的数据库还原到该当前事务开始时的状态。

可以对 rdoConnection 对象使用事务方法－但是在这种情况下，事务的范围只限于在 rdoConnection 下建立的 rdoResultset 和 rdoQuery 对象中。

语法

object.BeginTrans | CommitTrans | RollbackTrans

object 所在处代表一个对象表达式，其值为“应用于”列表中的一个对象。

说明

当要将在会话中对数据库所作的一系列改变作为一个逻辑单元时，可以对 rdoEnvironment 或 rdoConnection 对象使用事务方法。也就是，一个操作集合既以一个集合为单位完成，也以一个集合为单位回滚。这样，如果集合的任何操作失败，则整个事务也失败。事务还允许对数据库作临时改变- 该改变可用 RollbackTrans 方法取消。

一般，ODBC 驱动程序以下列两种模式中的一种工作：

  • 自动提交模式：当没有显式地使用 BeginTrans 方法启动一个事务，每一个被执行的操作在完成时都立即提交给数据库。

  • 手工提交模式：当显式地使用 BeginTrans 方法启动一个事务时，或使用 ODBC SQLSetStmtOption 函数禁止 SQL_AUTO_COMMIT 模式时，或发送一个 SQL 语句启动一个事务 (BEGIN TRANS) 时，所有操作都是事务中的一部分，并且不作修改地提交给数据库，直到使用 CommitTrans 方法为止。如果执行 CommitTrans，或使用 RollbackTrans 方法之前连接失败，就取消这个操作－回滚。

注意 当使用远程服务器时，如果该服务器象 Microsoft SQL Server 那样支持分布式的事务协调程序 (DTC)，就可以初始化和控制跨越多个服务器的事务。也就是，如果在调用一个远程过程的远程服务器上调用一个过程，则 DTC 可以保证该操作被包括在初始化的事务中。详细信息，

一般来说，当必须更新两个或多个表中的行，并确保在所有的表中所作的改变或者都被完成（提交）、或者一点也不变（回滚）时，使用事务维护数据的完整性。例如，当将钱从一个帐户转到另一个帐户时，需要从一个帐户上减去一个数并将其加到另一个帐户上。如果其中有一个修改失败，帐户就不会平衡。在修改第一行之前，先使用 BeginTrans 方法，然后，只要再有修改失败，就可以使用 RollbackTrans 方法撤消所有的修改。在成功地修改了最后一行之后，就使用 CommitTrans 方法。

注意 在一个 rdoEnvironment 对象内，对于该 rdoEnvironment，事务总是全局的，并不只限于一个数据库，或一个结果集。如果在一个 rdoEnvironment 事务内、在多个数据库或结果集上完成操作，则 RollbackTrans 方法还原所有的在那些数据库和结果集上的操作。

一旦使用 CommitTrans，就不能取消在该事务中所作的改变，不过若该事务嵌套在另一个要回滚的事务中除外。除非使用动作查询直接执行 SQL 事务管理语句，否则事务不能嵌套。如果想模拟覆盖的、无嵌套的范围的事务，可以建立另外的 rdoEnvironment 对象包含并发的事务。

注意 可以使用包含事务语句的 SQL 动作查询。例如，对于 Microsoft SQL Server，可以使用 SQL 语句，如，BEGIN TRANSACTION, COMMIT TRANSACTION 或 ROLLBACK TRANSACTION。这个技术支持 ODBC 驱动程序所不支持的嵌套事务。

如果不保存或者要回滚任何挂起的事务，就关闭 rdoEnvironment 对象，则事务会自动回滚。

如果不先使用 BeginTrans 方法就使用了 CommitTrans 或 RollbackTrans 方法，那么不会产生错误。

有些数据库不支持事务，在这些情况下，rdoConnection 对象或 rdoResultset 对象的 Transactions 属性为 False。为了保证数据库能支持事务，在使用 BeginTrans 方法之前，先检查 rdoConnection 对象的 Transactions 属性的值。如果对多个数据库使用 rdoResultset 对象，则先检查该 rdoResultset 对象的 Transactions 属性。如果 rdoConnection 或 rdoResultset 不支持事务，则这些方法将被忽略并且不产生错误。


Cancel 方法（远程数据）

取消以异步模式运行的查询处理，或取消依赖于指定的 RDO 对象的任何挂起的结果。

语法

object.Cancel

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

Cancel 方法要求远程数据源对挂起的异步查询停止工作，或取消任何挂起的结果。在某些情况下，一旦操作开始，就不可能取消；而在另外一些情况下，取消操作则是可能的，但它的部分步骤可能已经完成了。

当遇到需要建立结果集但不希望等到查询引擎完成操作后才建立时，可以使用带有 OpenResultset 或 Execute 方法的 rdAsyncEnable 选项。该选项在操作的初始化完成后、在准备处理第一行之前，就将控件返回到应用程序。这样，当执行查询可以执行其它的代码。如果需要在操作完成之前将其停止，对所建立的对象使用 Cancel 方法。

当使用 rdAsyncEnable 选项要求一个异步连接时，Cancel 方法还可用于 rdoConnection 对象。在这种情况下，试图与远程服务器连接是被废弃的。

也可以对异步的 rdoResultset 或 rdoQuery 对象使用 Cancel 方法，以刷新剩余的结果集行，并释放提交给查询和 rdoResultset 的资源。

如果对已有多个被挂起的结果集的 rdoResultset 对象使用 Cancel 方法，则刷新所有的结果集。为了简单地取消当前结果集并开始处理下一个集合，可使用 MoreResults 方法。

注意 对一个正在执行的动作查询使用 Cancel 方法，会产生不可预料的结果。如果该查询正在执行会影响很多行的操作，则一些行可能被改变而另外一些行还未被改变。例如，正在执行一个含有 SQL UPDATE 语句的动作查询，如果在该操作还未完成之前使用了 Cancel 方法，已修改的行数是不可确定的－剩下的则还未改变。如果要对这种类型的动作查询使用 Cancel 方法，建议使用事务方法回滚、或提交已完成的操作部分。


CancelBatch 方法（远程数据）

取消所有未提交的在本地游标行（用于批模式）中的修改。

语法

object.CancelBatch (SingleRow)

CancelBatch 方法的语法有如下部分:

部分 | 描述
object | 一个对象表达式，其值为“应用于”列表中的一个对象。
SingleRow | 只对当前行取消行动时为 True ，而对此批的所有行都取消行动时为 False 的布尔 值，缺省值为 False。

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

CancelBatch 方法取消所有在本地游标中所作的未提交的修改，并将数据回复到刚从数据库取得时的原始状态。注意这个方法并不象 Refresh 方法那样，重新查询服务器以刷新数据－而是代之以放弃在本地游标所作的、在批更新操作中还未发送的修改。

当使用 CancelUpdate 方法，只将当前行的修改回滚到执行最后一个 Update 方法之前时的状态。

无论何时使用客户批游标库 (rdUseClientBatch) 打开连接，都要使用批更新。在这种情况下，每次使用 Update 或 UpdateRow 方法，都更新本地的 rdoResultset，但不改变基本数据库表。由于 rdoResultset 是最后建立的，或者与 BatchUpdate 命令同步，BatchUpdate 方法将修改的信息用于更新基本数据库表。

BatchUpdate 方法将 BatchCollisionRows 属性更新为每个未能更新的行都包含一个书签—与已存在的行发生冲突，因为它更新了在 rdoResultset 对象中第一次读取的数据。BatchCollisionCount 属性指示处理批更新过程中发生了多少冲突。


CancelUpdate 方法（远程数据）

取消 rdoResultset 对象中所有挂起的更新。

语法

object.CancelUpdate

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

CancelUpdate 方法刷新复制缓冲区以及取消 Edit 或 AddNew 操作中所有挂起的更新。例如，调用了 Edit 或 AddNew 方法，但还未调用 Update 方法时，CancelUpdate 会取消调用 Edit 或 AddNew 方法时所作的改变。在复制缓冲区的任何信息都被丢失－也就是，调用 Edit 或 AddNew 方法对行所作的改变都被刷新。

使用 EditMode 属性确定是否取消挂起的更新操作。

如果在使用 Edit 或 AddNew 方法之前、或当 EditMode 属性设为 rdEditNone 时，使用 CancelUpdate 方法，则该方法被忽略。

注意 除非当前行没有改变，并且各种象 BOF 和 EOF那样的属性没有被更新，否则，在未使用 Update 方法时移动到另一行与使用 CancelUpdate 方法有同样的作用。


Clear 方法（远程数据）

清除 rdoErrors 集合的所有成员。

语法

object.Clear

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

使用该方法从 rdoErrors 集合删除所有的 rdoError 对象。

一般来说，不必清除 rdoErrors 集合，因为当产生一个错误之后，初始化一个新的操作，它是自动清除的。在需要手工清除 rdoErrors 集合的情况下，使用 Clear 方法，例如，希望将已经处理了的错误清除。


Close 方法（远程数据）

关闭一个打开的远程数据对象。

语法

object.Close

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

关闭一个打开的对象，即从对象集合中将它删除－但 rdoConnection 对象除外。例如，对一个 rdoResultset 使用 Close 方法，即是从 rdoResultsets 集合中将其删除。不过，如果对 rdoConnection 对象使用 Close 方法，则只是简单地关闭和废弃其附属的对象（象 rdoResultset 或 rdoQuery 对象），而并不从 rdoConnections 集合将其删除。

关闭 rdoConnection 对象也释放其父 rdoEnvironment 对象。任何要关闭缺省环境 rdoEnvironments(0) 的试图都被忽略。与 DAO不同，RDO 集合成员不能用 Delete 方法删除。

如果当 rdoResultset 对象打开时，想关闭 rdoConnection 对象，或是属于 rdoEnvironment 对象的 rdoConnection 对象打开时，而想关闭 rdoEnvironment 对象，则那些 rdoResultset 对象被关闭，所有挂起的更新和编辑将被回滚。

如果 rdoConnection 对象被定义在过程的范围之外，并且该过程还未关闭时就要退出，在没有被直接关闭或该对象定义所在的模块没有超出范围时，该 rdoConnection 对象就一直处于打开状态。任何依赖 rdoConnection 而打开的 rdoResultset 或 rdoQuery 对象，直到被显式地关闭之前一直处于打开状态。对不在范围内的 rdoConnection，关闭其所有的结果集时，该 rdoConnection 也被关闭。

如果 object 已经关闭，使用 Close 时，就会触发一个可以捕获的错误。

注意 对一个正在执行的动作查询使用 Cancel 方法，可能会产生不可预料的结果。如果影响很多行的查询操作正在执行，则一些行已经被改变而另外一些行尚未改变。例如，正在执行一个含有 SQL UPDATE 语句的动作查询，如果在该操作还未完成之前使用了 Cancel 方法，则不可确定的行数已经更新—剩下的行尚未改变。如果要对这种类型的动作查询使用 Cancel 方法，建议使用事务方法回滚、或提交已完成的操作部分。


ColumnSize 方法（远程数据）

返回在一个具有 rdTypeLONGVARBINARY 或 rdTypeLONGVARCHAR 数据类型的 rdoColumn 对象内的字节个数。

语法

varname = object ! column.ColumnSize( )

ColumnSize 方法的语法有下列部分：

部分 | 描述
varname | Long 或 Variant 的变量名。
object | 对象表达式，其值是含有 rdoColumns 集合的 rdoResultset 对象。
column | ChunkRequired 属性为 True 的 rdoColumn 对象名。

说明

根据所使用的驱动程序，ColumnSize 方法可以返回大的二进制对象 (BLOB) 列的数目，或者当其大小不可变时，返回 -1。如果 BLOB 列的数目是不可变的，还可以使用 GetChunk 方法从 BLOB 列读取大块的数据。当由 GetChunk 返回的值，比所需要的（二进制数据）大小小时，比缓冲区（字符数据）小至少两个字节时，或返回 NULL 值时，则最新块已经取得。

当使用的数据类型跨越多个数据库数据页时，应使用大块方法管理数据－但这也不是非用不可的。当 ChunkRequired 属性为 True 时，也应该使用 GetChunk 和 AppendChunk 方法管理大块数据。注意当 BLOB 数据列的大小比 BindThreshold 小时，不必使用大块方法。

使用 ColumnSize 方法确定大块列的大小。

因为大块数据列的大小可以超过 64K，所以也可以将由 GetChunk 方法返回的值赋给一个足以保存返回数据的大变量，该数据的大小由 ColumnSize 方法返回。

注意 为了确定非大块 rdoColumn 对象的大小，可使用 Size 属性。


CreatePreparedStatement 方法（远程数据）

建立一个新的 rdoPreparedStatement 对象。

语法

Set prepstmt = connection.CreatePreparedStatement(name, sqlstring)

CreatePreparedStatement 方法的语法有下列部分：

部分 | 描述
prepstmt | 对象表达式，其值是要建立的 rdoPreparedStatement 对象。
connection | 对象表达式，表示打开 rdoConnection 对象。
name | 新的 rdoPreparedStatement 名字的String。这一部分是必须的，但也可以是一个空字符串 ("")。
sqlstring | 定义 rdoPreparedStatement 的 Variant 表达式（一个有效的 SQL 语句）。这一部分是必须的，但可以是一个空字符串－如果这样的话，则在执行新的 rdoPreparedStatement 之前，必须先置 SQL 属性定义该 rdoPreparedStatement。

说明

注意 在这个 Visual Basic 版本提供支持 rdoPreparedStatement 对象是为了与以前的版本兼容。rdoQuery 对象可直接用来代替该对象。因此，建议停止使用 CreatePreparedStatement 方法，而推荐使用 CreateQuery 方法。


CreateQuery 方法（远程数据）

建立一个新的查询对象，并将其添加到 rdoQueries 集合中。

语法

object.CreateQuery Name, SQLString

CreateQuery 方法的语法有下列部分：

部分 | 描述
object | 对象表达式，其值是 rdoConnection 对象。
Name | 必需的。字符串表达式，其值是新对象的名称。
SQLString | 可选的。为新准备语句的 SQL 查询。

说明

CreateQuery 方法为连接建立一个新的 rdoQuery 对象，并将其添加到 rdoQueries 集合中。也可以使用如下 Dim 语句，声明独立方式的 rdoQuery 对象：

Dim myQuery as New rdoQuery

在设置 ActiveConnection 属性之前，独立方式的 rdoQuery 对象不与连接关联。

rdoQuery 与 ODBC 准备好的语句对应，用于定义含有参数的、可重新使用的查询。可以任意次地执行 rdoQuery，并在运行之前传递将代入 SQL 语句之中的参数。参数存在 rdoParameters 集合中。一般来说，如果打算在程序中多次执行查询，使用 rdoQuery 对象，比在不是 rdoQuery 的对象上使用 Execute 或 OpenResultset 方法，更为有效。

为 Name 参数传递的值，可以用于 Item 方法，将新的对象在其集合中定位。如果不提供 Name，就将 rdoQuery 添加到 rdoQueries 集合中，并且 rdoQuery 可用于引用查询变量或 rdoQuery 对象的序号值。如果名称指定的对象已经是 rdoQueries 集合（包含空字符串）的成员，就产生一个可以捕获的错误。所有的 rdoQuery 对象都是临时的－当 rdoConnection 对象关闭时，它们被废弃。

为了从 rdoQueries 集合删除一个 rdoQuery 对象，对该 rdoQuery 使用 Close 方法。

SQLString 参数是可选的，但是如果不提供参数，必须在执行之前先设置产生 rdoQuery 对象的 SQL 属性。

使用 Execute 方法，运行不返回（一个动作查询）行的 rdoQuery 对象中的一个 SQL 语句。使用 OpenResultset 方法运行返回行的 rdoQuery。

如果有一个未移居的 rdoResultset 挂起在只支持 rdoConnection 对象的单个操作的数据源上，除非该 rdoResultset 被刷新、关闭、或全部移居，否则就不能建立另外的 rdoQuery 及 rdoResultset 对象，或对 rdoTable 对象使用 Refresh 方法。例如，当使用 SQL Server 4.2 作为数据源，在移到当前 rdoResultset 对象的最后一行之前，就不能建立另外的 rdoResultset 对象。为了移居结果集，使用 MoreResults 方法移居所有挂起的结果集，或对 rdoResultset 使用 Cancel 或 Close 方法刷新所有挂起的结果集。


Delete 方法（远程数据）

删除可更新的 rdoResultset 对象中的当前行。

语法

object.Delete

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

Delete 是删除当前行使其不可访问。所删除的行从 rdoResultset 游标处及数据库中删除。从 rdoResultset 中删除某行，使用 Delete之前，在该 rdoResultset 中它必须是当前行，否则，触发一个可以捕获的错误。

一旦从 rdoResultset 中删除一行，那么在执行访问当前行的操作之前，必须将当前行指针重新定位到该 rdoResultset 中的另一行。虽然对所删除的行不能编辑或使用，在重新定位到另一行之前，它仍然是当前行。不过一旦重新定位到另一行，就不能将所删除的行再认为是当前行了。

当在已被其它用户删除了的 rdoResultset 中定位行时，或者在另一 rdoResultset 中删除一个公共行时，产生一个可以捕获的错误指示该行已被删除了。此时，当前行是非法的，必须将其重新定位到另一有效行上。例如，如果使用书签定位到一个已删除的行上，就产生一个可以捕获的错误。

如果使用事务和 RollbackTrans 方法，可以取消行删除－假定在使用 Delete 方法之前使用了 BeginTrans。

在下列任一条件下使用 Delete 会产生错误：

  • 不是当前行。

  • 连接或 rdoResultset 是只读的。

  • 行中没有可更新的列。

  • 行已被删除。

  • 另一个用户已经锁定含有该行的数据页。

  • 用户没有执行该操作的权限。


Edit 方法（远程数据）

允许改变可更新的 rdoResultset 对象的当前行中的数据值。

语法

object.Edit

object 所在处代表一个对象表达式，其值为“应用于”列表中的一个对象。

说明

在使用 Edit 方法之前，rdoResultset 的数据列是只读的。为了进行其后的编辑，对 rdoResultset 对象执行 Edit 方法，将当前行 复制到复制缓冲区中。对当前行中的列所作的改变被复制到复制缓冲区。在对行作了必要的修改后，使用 Update 方法保存这些修改，或者使用 CancelUpdate 方法废弃它们。在使用了 Edit 之后原当前行仍是当前行。

注意 如果编辑了一行，没有使用 Update，又执行任何将当前行指针重新定位到另一行的操作，则对编辑行所作的改变将全部丢失而没有警告。另外，如果关闭 object ，或结束声明结果集或父 rdoConnection 对象的过程，则编辑行也全部废弃而没有警告。

如果 rdoResultset 对象的 EditMode 属性指出 Edit 或 AddNew 操作正在进行，则不能使用 Edit 方法。

当 rdoResultset 对象的 LockEdits 属性被设为 True（保守式锁定）时，只要游标被打开，rdoResultset 对象行集中的所有行就被锁定，并且在该游标被关闭之前，一直为锁定状态。在行集中的行数由 RowsetSize 属性确定。由于很多远程数据源使用页锁定机制，保守式锁定也锁定表的所有数据页，由 rdoResultset 取得的行包含在该页中。

如果 LockEdits 属性设为 False（开放式锁定），某些个别的行或含有行的那些数据页将被锁定，并且在数据库中更新行之前，将新行与预编辑的行比较。如果在最后用 Edit 方法修改了该行，Update 操作失败，并产生一个可以捕获的错误。

注意 不是所有的数据源都使用数据页锁定机制来管理数据并发性。在某些情况下，由于数据被逐行锁定，因此锁定只影响指定的编辑行集。

在下列任一条件下使用 Edit 会产生错误：

  • 不是当前行。

  • 连接或 rdoResultset 是只读的。

  • 行中没有可更新的列。

  • EditMode 属性指出 AddNew 或 Edit 正在进行。

  • 另一个用户已经锁定该行，或含有该行的数据页的 LockEdits 属性为 True。


EstablishConnection 方法（远程数据）

建立一个与 ODBC 服务器相连的物理连接。

语法

object.EstablishConnection prompt, readonly, options

EstablishConnection 方法的语法有下列部分：

部分 | 描述
object | 对象表达式，其值是 rdoConnection 对象。
prompt | 可选的。表明 ODBC 提示特征的整数值（参看 rdoEnvironment 对象的 OpenConnection 方法）。
readonly | 可选的布尔值。如打算使用连接为只读的，该值为 True。
options | 是可选的。表明连接选项的整数值。这个参数与在 rdoEnvironment 对象的 OpenConnection 方法中具有同样的规则、限制及可能的取值。

说明

在没有与服务器建立连接时，这个方法使 rdoConnection 对象与服务器建立物理连接。在建立独立方式的 rdoConnection 对象，或重新连接已使用 Close 方法断开连接的 rdoConnection 对象时，使用这个方法。

与 OpenConnection 方法不同，EstablishConnection 方法不是自动地将 rdoConnection 对象添加到 rdoConnections 集合中。如想将新建立的连接添加到 rdoConnections 集合中，必须使用 Add 方法。可以使用 Remove 方法从 rdoConnections 集合删除一个成员。

当使用客户批游标库时，只要 rdoResultset 或 rdoQuery 对象的 ActiveConnection 已被设为 Nothing，EstablishConnection 方法就可以用于建立一个连接。

同 OpenConnection 方法一样，当缺少建立连接所必须的参数时，prompt 参数要求 ODBC 驱动程序管理器给用户以提示。也可以使用 rdAsyncEnable 选项要求异步地生成连接。

一般来说，在试图与远程服务器建立连接之前，必须先设置 Connect 属性和 rdoConnection 对象的其它相关属性。

关于在使用 EstablishConnection 方法之前如何设置 rdoConnection 属性的详细内容，请参阅 OpenConnection 方法。


Execute 方法（远程数据）

运行动作查询或执行 SQL 语句，它们都不返回行。

语法

connection.Execute source[, options]

query.Execute [options]

Execute 方法的语法有下列部分：

部分 | 描述
connection | 对象表达式，其值是查询将运行的 rdoConnection 对象。
query | 为 rdoQuery 对象求值的对象表达式，其中 rdoQuery 对象的 SQL 属性设置为指定的 SQL 语句将要执行。
source | 字符串表达式，含有要执行的动作查询或 rdoQuery 的名字。
options | Variant 或常数，确定查询如何运行，设置值如下面所述。

设置值

可以为 options 参数可使用下列常数：

常数 | 值 | 描述
rdAsyncEnable | 32 | 异步地执行操作。
rdExecDirect | 64 | (缺省)不创建保存过程而执行查询。使用 SQLExecDirect 代替 SQLPrepare 和 SQLExecute。

说明

推荐只对动作查询使用 Execute 方法。因为动作查询不返回任何行，所以 Execute 不返回 rdoResultse。可以对执行多语句的查询使用 Execute 方法，这些批语句都不能返回行。为了执行组合操作和 SELECT 查询的多结果集查询，使用 OpenResultset 方法。

使用 rdoConnection 或 rdoQuery 对象的 RowsAffected 属性，确定受最新 Execute 方法影响的行数。RowsAffected 含有当执行动作查询时所删除的、更新的、或插入的行数。当使用 Execute 方法运行一个 rdoQuery 时，该 rdoQuery 对象的 RowsAffected 属性就被设为受影响的行数。

选项

为了异步地执行查询，可使用 rdAsyncEnable 选项（它被缺省设置）。如果设置了该选项，数据源查询处理器立即开始查询，且在该查询完成之前就返回应用程序。使用 StillExecuting 属性确定查询处理器何时准备从查询返回结果。使用 Cancel 方法中止异步查询的处理。

为了不建立临时的保存过程就执行查询，使用 rdExecDirect 选项。当查询含有对事务、或对只存在于单个操作的上下文的临时表的引用时，需要这个选项。例如，如果查询或引用临时表中含有 Begin Transaction TSQL 语句,则必须使用 rdExecDirect 以确保当结束查询挂起这些对象时，远程引擎不拒绝。

建议不要使用 Execute 方法执行保存过程，因为过程的返回值及输出参数会被，并且过程也不能返回行。对 rdoQuery 使用 OpenResultset 方法执行存储过程。

注意 当执行不需要参数的保存过程时，不要在 SQL 语句中包含括号。例如，执行 "MySP" 过程，使用下列语法：{ Call MySP }。

同样，与下列类似的调用:

   rCn.Execute SqlStatement, rdAsyncEnable +
   rdExecDirect

仅允许一个未完成请求并允许 Visual Basic 代码与 SQL Server 过程重叠，但是不允许多个未完成 SQL Server 请求。


GetChunk 方法（远程数据）

返回 rdoColumn 对象的所有的、或部分的内容，该对象具有 rdTypeLONGVARBINARY 或 rdTypeLONGVARCHAR 数据类型。

语法

varname = object ! column.GetChunk(numbytes)

GetChunk 方法的语法有下列部分：

部分 | 描述
varname | Variant 名字，从名为 column 中接收数据 rdoColumn 对象。
object | 对象表达式，其值是含有 rdoColumns 集合的 rdoResultset 对象。
column | 对象表达式，其值是 ChunkRequired 属性为 True 的 rdoColumn 对象。
numbytes | 数值表达式，是要返回的字节。

说明

大块数据列设计用于保存二进制值及大小范围从几个字符直到 1.2GB 的文本值，数据列被保存在数据库的连续的数据页中。在大多数情况下，大块数据不能由单个操作管理，因此每次必须使用大块方法保存和写一片数据。如果列的 ChunkRequired 属性为 True，应使用 GetChunk 和 AppendChunk 方法操作列数据。BindThreshold 属性确定最大尺寸的自动绑定块，而不需要chunk 方法。

如果列的 ChunkRequired 属性为 True，则必须使用 GetChunk 方法检索数据。GetChunk 方法将数据的一部分从一个大块列移动到变量中。列中字节的总数通过执行 ColumnSize 方法确定。

反复使用 GetChunk 方法，每次将列数据复制到一个变量、一个段或大块中。大块的大小由 numbytes 设定。复制操作的起始点初始化时是 0，使得数据从所读列的第一个字节开始读出。以后的调用 GetChunk 则是从上次读大块之后的初始位置得到数据。

由 GetChunk 返回的字节被赋给 varname。由于返回数据和临时存贮需要内存，所以 numbytes 会受限制，但对于 32 位的系统，该限制值大于 1.2GB，或是更为实际的内存和虚拟内存系统的磁盘容量。

如果 numbytes 大于列中的字节数，就返回列中实际的字节数。在 GetChunk 结果赋给 Variant 变量之后，可以使用 Len 函数确定返回字节数。

使用 AppendChunk 方法将连续的数据块写到列中，以及使用 GetChunk 方法从列中抽取数据。某些操作（例如，复制）包含临时字符串。如果字符串空间被限制，则需要较小的大块列代替整个的列。

使用 BindThreshold 属性指定要自动限定的列大小的最大值。

注意 因为大块数据列的大小会超过 1.2GB，所以应该将由 GetChunk 方法返回的值赋给一个足以保存返回数据的大变量，该数据的大小由 ColumnSize 方法返回。


GetClipString 方法

GetClipString 方法返回一个隔开的、结果集中的 'n' 行字符串。

语法

ResulsetString = object.GetClipString (NumRows, [ColumnDelimiter],[RowDelimiter], NullExpr])

GetClipString 方法的语法有下列部分：

部分 | 描述
ResultsetString | 用于引用将整个结果集作为隔开的字符串的变量。
Object | 对象表达式，其值是 rdoResultset 对象。
NumRows | 必需的 Long 值。复制到剪裁字符串中的行数。
ColumnDelimiter | 可选的 Variant (String) 表达式，用于按下面的设置值隔开数据列。缺省值是 Tab (VbTab)。
RowDelimiter | 可选的 Variant (String) 表达式，用于按下面的设置值隔开数据行。缺省值是回车符 (VbCr)。
NullExpr | 可选的 Variant (String) 表达式，当遇到 NULL 值时按下面的设置值使用。缺省值是一个空的字符串。

设置值

行和列的分割符可以是任意长度，但一般是一两个字节的长度。一般情况下，ResultsetString 分割符由目标对象的 Clip 属性确定。例如，如果字符串是用于网格控件，列是用 tab 分割，行是用回车符分割（缺省的设置值）。

NullExpr 被用来代替查询返回的、NULL 值的合适的值。一般来说，是一个空字符串或是 "<null>"。

说明

GetClipString 方法返回一个隔开的、基于 NumRows 参数的结果集中的、'n' 行的字符串。如果所需要的行比可用的行多，只能返回可用的行。使用 RowCount 属性确定实际取得了多少行。可以取得的行数受限于可用的内存，应选用适合应用程序的行数－如果表很大，不要希望使用 GetClipString 将整个表或结果集都放入数组。

一般情况下，GetClipString 与 GetRows 方法相同，只是其返回的数据是一个字符串，而不是一个两维数组。GetClipString 可用于填充网格控件，或任何具有 Clip 属性的控件。它也用于将结果集的数据格式化输出到一个连续的文件中。

调用 GetClipString 之后，将当前行定位在下一个未读的行上。也就是，GetClipString 与使用 Move (rows) 方法是等效的。

如果想多次使用 GetClipString 调用取得所有的行，使用 EOF 属性确定是否还有可用的行。如果 GetClipString 返回的比需要的数小，可能是已经到了 rdoResultset 的尾部，也可能无法在所需的范围内取得一行。例如，10 行的组就无法检索用以取得 50 行，GetClipString 返回 4 行，而将造成问题的行留下。这并不产生运行时错误。

ColumnDelimiter 可选参数可用于代替不同于缺省 tab (Chr$(9)) 字符的列分割符，而 RowDelimiter 可选参数可用于代替不同的行分割符。当使用一个接受剪贴格式的控件，列及行的分割符需要不同字符时（众所周知，有些网格的行分割符既需要回车符又需要换行符），这是有用的。


GetClipString 示例（远程数据）

下面示例从 Publishers 表内含有被选的行集的结果集中建立剪贴字符串，并将其用于填充由 Clip 属性决定的字符串 Grid 控件

Dim rs As rdoResultset
Set rs = MyConnection.OpenResultset( _
"Select * from Publishers Where State = 'WA'", _
   rdOpenNone)
MyGrid.Rows = rs.RowCount
MyGrid.Cols = rs.rdoColumns.Count
MyGrid.SelStartRow = 1
MyGrid.SelEndRow = MyGrid.Rows
MyGrid.SelStartCol = 0
MyGrid.SelEndCol = MyGrid.Cols - 1
MyGrid.Clip = rs.GetClipString(rs.RowCount)


GetRows 方法（远程数据）

检索 rdoResultset 的多行并放入一个数组中。

语法

array = object.GetRows (rows)

GetRows 方法的语法有下列部分：

部分 | 描述
array | Variant 类型变量名，保存返回的数据。
object | 对象表达式，其值为“应用于”列表中的一个对象。
rows | Long 值，用以指示检索的行的个数。

说明

使用 GetRows 方法将从 rdoResultset 中的一个或多个整行复制到一个二维数组。数组的第一维标识列，第二维指示行数，如下所示：

avarRows(intColumn)(intRow)

为了得到第二行的第一列，使用如下方法：

col1 = avarRows(0,1)

为了得到第一行的第二列，使用如下方法：

col2 = avarRows(1,0)

如果需要的行比可用的行还大，就只返回可用行。使用 Ubound 确定实际可取得多少行，并根据返回的行数重新调整数组。例如，将结果返回到名为 varA 的 Variant 中，可以确定可实际返回多少行供使用：

numReturned = Ubound(varA,2) + 1

使用 "+ 1" 是因为返回的第一个数据是在数组的第 0 个元素中。可以取得的行数受限于可用的内存，应选用适合应用程序的行数－如果表很大，不要希望使用 GetRows 将整个表或结果集都放入数组。

GetRows 不从 ChunkRequired 属性为 True 的列返回数据－这些列返回的是含有 ODBC S-code 的变体型值。

调用 GetRows 之后，将当前行定位在下一个未读的行上。也就是，GetRows 与使用 Move (rows) 方法是等效的。

如果想多次使用 GetRows 调用取得所有的行，使用 EOF 属性确定是否还有可用的行。如果 GetRows 返回的比需要的数还小，可能是已经在 rdoResultset 的尾部，也可能无法在所需的范围内取得一行。例如，10 行的组就无法检索用以取得 50 行，GetRows 返回 4 行，而将造成问题的行的当前值留下。这并不产生一个运行时的错误。

GetRows 从基于 RowsetSize 属性的 ODBC 缓冲区取得数据。RDO 从当前行向结果集的结束方向取得数据－返回所需要的行的个数。如果当前行集已经结束，RDO 调用另一个 SQLExtendedFetch 函数从数据库中取得后续的行集。这个技术适用于各种类型的游标。


MoreResults 方法（远程数据）

将任何挂起行的结果集清空，并返回一个布尔值，指定是否还有一个或多个另外的结果集被挂起。

语法

variable = object.MoreResults

MoreResults 方法的语法有下列部分：

部分 | 描述
variable | 布尔变量，指示是否发现有另外的结果集，见返回值中所述。
object | 对象表达式，其值是一个打开的 rdoResultset 对象。

返回值

variable 的返回值是：

值 | 描述
True | 准备处理另外的结果集。
False | 在 rdoResultset 中的所有结果集都已经处理完毕。

说明

调用这个方法刷新当前结果集，调用 ODBC API SQLMoreResults 函数查看在同一语句上是否还有另外的结果集，以及是否加载了新的结果集，将当前行指针定位到第一行，并返回 True。如果没有多个结果集，该方法返回 False，并且 EOF 和 BOF 属性均为 True。

如果结果集被异步建立（开发人员在 Options 参数中使用 rdAsyncEnable），MoreResults 方法也将异步执行。应该使用 StillExecuting 属性确定下个结果集什么时候有效。MoreResults 方法的异步执行，与异步打开一个结果集遵循同样的规则。

当用于建立 rdoResultset 的查询返回多个结果集时，使用 MoreResults 方法结束当前结果集的处理，并测试其后的结果集。如果没有另外的结果集需要处理，MoreResults 方法返回 False，同时 BOF 和 EOF 都被设置为 True。在任何情况下，都使用 MoreResults 方法刷新当前的 rdoResultset。

也可以使用 Cancel 方法刷新 rdoResultset 的内容。不过，Cancel 还刷新任何尚未处理的另外的结果集。

不是所有的游标库都支持多结果集查询。例如，除非要求一个仅向前的、只读的、且其 RowsetSize 属性为 1 的游标来禁用游标处理器，否则服务器端游标库不支持这种类型的查询。


Move 方法（远程数据）

重新定位 rdoResultset 对象中的当前行指针。

语法

object.Move rows[, start]

Move 方法的语法有下列部分：

部分 | 描述
object | 对象表达式，其值为“应用于”列表中的一个对象。
rows | 有符号的 Long 值，指示其位置将按设置值 (Setting) 中所述的那样移动的行数。
start | 是一个 Variant 值，按设置值 (Setting) 中所述，标识一个书签。

设置值

如果 rows 大于 0，则位置就向前移动（朝游标的前进方向）。如果 rows 小于 0，则位置就返回移动（朝游标的开始方向）。如果 rows 等于 0，则废弃任何挂起的编辑，并且按数据源刷新当前行。在低层上，当使用 0 作为 rows 的参数时，RDO 就执行 ODBC SQLExtendedFetch 重新从数据库取得当前行集（象 RowsetSize 属性确定的那样）。

如果指定 start，则移动的开始与书签有关。如果未指定 start，则 Move 从当前行开始。

说明

如果使用 Move 将当前行重新定位到第一行之前的位置，那么该位置就移到文件的起始点 (BOF) 位置。如果 rdoResultset 中一行也没有，并且其 BOF 属性被设为 True，使用这个方法返回移动则会触发一个可以捕获的运行错误。如果 BOF 或 EOF 属性为 True，并且又没有一个有效的书签，此时使用 Move 方法，就触发一个可以捕获的错误。

如果使用 Move 将当前行重新定位到最后一行之后的位置，那么该位置就移到文件的结束 (EOF) 处。如果 rdoResultset 中一行也没有，并且其 EOF 属性被设为 True，使用这个方法向前移动，就会产生一个可以捕获的运行错误。

如果在基于 SQL 专用查询或 rdoQuery 的 rdoResultset 对象中使用 Move，则查询被迫完成，并且该 rdoResultset 对象被全部移居。

如果在使用 Edit 或 AddNew 方法之后，使用 Update 方法之前，使用任何方法将当前行指针重新定位，那么复制缓冲区中所作的任何修改全部丢失。

为了将 rdoResultset 中的第一行、最后一行、下一行、或前一行作为当前行，分别使用 MoveFirst、MoveLast、MoveNext 或 MovePrevious 方法。为了将当前行指针按绝对行数定位，使用 AbsolutePosition 属性。为了将当前行指针按结果集中已访问的行数的百分比定位，使用 PercentPosition 属性。

当使用 Move 方法或其它任何方法将当前行指针重新定位时，就引发 RowCurrencyChange 事件。

当使用只能向前的 rdoResultset 时，只能使用 MoveNext 方法将当前行重新定位。不能使用 MoveLast、MovePrevious、MoveFirst 和 Move 方法，也不能使用 PercentPosition 和 AbsolutePosition 属性，将当前行指针重新定位。


MoveFirst、MoveLast、MoveNext、MovePrevious 方法（远程数据）

将当前行指针重新定位到指定的 rdoResultset 对象的第一行、最后一行、下一行、或前一行，使该行成为当前行。

这些方法的语法有下列部分：

object.{MoveFirst | MoveNext | MovePrevious}

object. MoveLast ([Options as Variant])

部分 | 描述
object | 对象表达式，其值是 rdoResultset 对象。
options | Variant 或常数，确定如何执行操作，按下面的设置值 (Setting) 指定。

设置值

可以将 options 参数设定为下列常数：

常数 | 值 | 描述
rdAsyncEnable | 32 | 异步执行操作。

说明

使用 Move 方法不需要应用条件就能将当前行指针从一行移动到另一行。

如果为 MoveLast 方法指定 rdAsyncEnable 选项，就异步执行移动操作。也就是，控件立即返回到应用程序－这常常是在完成移动操作之前。这样可以避免应用程序在操作完成之前被阻塞。为了检查操作是否完成，则可以等待 QueryComplete 或 RowCurrencyChange 事件，又可以定期检查 StillExecuting 属性，该属性当移动操作完成时，返回为 False。

注意 如果编辑了当前行，要保证在移动到另一行之前，先使用 Update 方法保存修改的内容。如果没有更新就移到另一行，则所作的修改将丢失，并且没有警告。

当打开名为 object 的结果集时，其第一行就是当前行，并且 BOF 属性被设为 False。如果结果集中一行也没有时，BOF 属性被设为 True，并且没有当前行。

如果第一行或最后一行就是当前行，当使用 MoveFirst 或 MoveLast 时，当前行不会改变。

如果第一行是当前行，那么再使用 MovePrevious 时，BOF 属性被设为 True，并且没有当前行。如果再次使用 MovePrevious，则产生一个错误；BOF 仍为 True。

如果最后一行是当前行，再使用 MoveNext 时，EOF 属性被设为 True，并且没有当前行。如果再次使用 MoveNext，产生一个错误；EOF 仍为 True。

如果对基于 SQL 专用查询或 rdoQuery 的 rdoResultset 对象使用 MoveLast，则查询被迫完成，并且该 rdoResultset 对象被全部移居。

如果在使用 Edit 或 AddNew 方法之后，在使用 Update 方法之前，使用任何方法重新定位当前行指针，则在复制缓冲区中所作的任何修改将全部丢失。

为了在 rdoResultset 对象中按指定行数向前或向后移动当前行位置，使用 Move 方法。

为了将当前行指针按绝对行数定位，使用 AbsolutePosition 属性。为了将当前行指针按结果集中已访问行数的百分比定位，使用 PercentPosition 属性。

当使用 Move 方法或任何其它方法将当前行指针重新定位时，就引发 RowCurrencyChange 事件。

当使用仅向前类型 rdoResultset 时，只能使用 MoveNext 方法将当前行重新定位。不能使用 MoveLast、MovePrevious、MoveFirst 或 Move 方法，或者 PercentPosition 或者 AbsolutePosition 属性将当前行指针重新定位。如果对只能向前的结果集使用了不允许的 Move 方法，程序就引发一个 ODBC “取类型越界”错误。


OpenConnection 方法（远程数据）

打开一个与 ODBC 数据源的连接，并返回对指定数据库 的 rdoConnection 对象的引用。

语法

Set connection = environment.OpenConnection(dsName[, prompt[, readonly[, connect[, options]]]])

OpenConnection 方法的语法有下列部分：

部分 | 描述
connection | 对象表达式，其值是要打开的 rdoConnection 对象。
environment | 对象表达式，其值是已存在的 rdoEnvironment 对象。必须提供一个 rdoEnvironment 对象。。
dsName | 字符串表达式，登录的 ODBC 数据源的名称，或是一个零长度字符串 ("")，按下面的设置值取值。
prompt | Variant 或常数，确定操作如何执行，按下面设置值取值。
readonly | 布尔 值，如果连接打开为只读访问时，取 True；如果连接打开为读 / 写访问时，取 False。如果忽略这个参数，连接打开为读 / 写访问。
connect | 字符串表达式，用于将参数传递到 ODBC 驱动器管理器以便打开数据库－如下面设置值中所述的 connect string。
options | Variant 或常数，确定操作如何执行，如下面设置值中所述。

设置值

connect 参数构成 ODBC 连接参数，并取决于 ODBC 驱动程序。关于语法和一般的设置值，请参阅 Connect 属性。如果 connect 参数是一个空字符串 ("")，用户名及密码从 rdoEnvironment 对象的 UserName 和 Password 属性中获得，同时必须提供 dsName 参数。

如果提供的 dsName 不是指向一个有效的 ODBC 数据源名称，并且数据源名称 (DSN) 参数未出现在 connect 参数中，若 prompt 为 rdDriverNoPrompt 就产生一个错误；否则提示用户从已登录的数据源名称列表中选择。如果 dsName 是一个零长度的字符串，则连接字符串就必须指定驱动程序和服务器名称。

根据 prompt 的值，ODBC 驱动程序管理器 展示一个提示用户连接信息的对话，如，DSN 用户名，以及密码。使用下列常数之一，确定如何提示：

prompt 常数 | 值 | 描述
rdDriverPrompt | 0 | 驱动程序管理器显示“ODBC 数据源”对话框。用于建立连接的连接字符串，借助对话框用户从 DSN 中选择并完成的，或者，如果未选取 DSN 并且 DataSourceName 属性为空，（在 RemoteData 控件的情况下）就使用缺省的 DSN。
rdDriverNoPrompt | 1 | 驱动程序管理器使用在 dsName 和 connect 中提供的连接字符串。如果未提供足够的信息，则 OpenConnection 方法返回一个可以捕获的错误。
rdDriverComplete | 2 | （缺省值）如果所提供的连接字符串包含 DSN 关键字，则驱动程序管理器使用 connect 中提供的字符串。否则，当指定 rdDriverPrompt 时，便按该设置操作。
rdDriverCompleteRequired | 3 | 除了驱动程序对控件禁止任何与完成连接无关的信息外，其它与 rdDriverComplete 一样。如果控件被禁止，就不能选择或指定缺少的参数。

options 参数可使用下列常数：

options 常数 | 值 | 描述
rdAsyncEnable | 32 | 异步地执行操作。

说明

当成功地执行了 OpenConnection 方法，就实例化一个新的 rdoConnection 对象，将其添加到 rdoConnections 集合中，并与远程服务器建立了网络连接。如果不能建立连接，则对象也不能建立，并且引发一个可以捕获的错误。

注意 如何处理孤立的引用 rdoConnection 对象，RDO 2.0 和 RDO 1.0 是不同的。当用另一个使用 OpenConnection 方法的 rdoConnectio，设置已分配给 rdoConnection 对象的变量时，则已存在的 rdoConnection 对象被关闭，并从 rdoConnections 集合中将其放弃。在 RDO 1.0 中，已存在的对象仍为打开状态，并留在 rdoConnections 集合中。

如果设置 options 参数为 rdAsyncEnable 时，就异步执行连接操作。也就是，在连接完成之前就返回到应用程序，以免完成作连接时应用程序阻塞。可以通过检查 rdoConnection 对象的 StillConnecting 属性来检查连接是否完成，当连接操作完成时，StillConnecting 属性为 False。也可以为 Connect 事件编写一个事件过程，当连接完成时将其引发。如果等待建立异步连接时使用了 Cancel 方法，该连接被放弃。

在开始建立连接处理之前，就引发 BeforeConnect 事件。这个事件过程允许检测并修改所需的连接字符串及提示等级。

有各种原因，不能建立连接。以下所列只是其中一部分：

  • 缺少合适的用户 ID 及密码。

  • 不正确的驱动程序或选项配置。

  • 缺少正确的网络或服务器权限。

  • 在网络上找不到远程服务器，或不能操作。

  • 远程服务器没有足够的资源或连接，不允许另一用户连接。

无 DSN 的连接

在某些情况下，在打开数据源连接之前，不必建立和登录数据源名字 (DSN)。如果远程服务器使用命名的管道 LAN 协议和缺省的 OEMTOANSI 设置，就只需简单地提供在连接字符串中的服务器和 ODBC 驱动程序的名字。不必在连接字符串中或在 dsName 参数中，例如 last 参数中，提供空的 DSN 项。除非已经确定了驱动程序和服务器值，否则，在 ODBC 驱动程序管理器找到一个 null DSN 项，将其定位。下面显示的连接字符串是用于建立一个名为 "BETAV486" 的 SQL 服务器的无 DSN 的连接：

Connect = "UID=;PWD=;Database=WorkDB;" _
& "Server=BETAV486;Driver={SQL Server}" _
& "DSN='';"

连接字符串的其它选项

建立 rdoConnection 可能需要由用户 UserName 属性的指定、或具有访问网络的权限的 UID 连接字符串参数，指定的数据源服务器，以及在服务器上选取的数据库。不能满足这些条件可能会导致连接失败。

如果未通过 connect 参数中的 DATABASE 参数或数据源项，来指定数据库，当建立由缺省的数据库确定的连接时，就打开那个数据库，该缺省的数据库是由数据库管理员分配给用户的。在某些情况下，可以执行含有 SQL命令的动作查询，比如 Transact SQL USE database 语句，来改变缺省的数据库。

注意 OpenConnection 方法的 connect 部分的编程，与用于 DAO 的 OpenDatabase 方法的 source 部分不同。connect 部分既不需要也不支持在连接字符串的开始部分使用 "ODBC;" 关键字。另外，connect 部分也不支持使用 LOGINTIMEOUT 参数 可用 rdoEnvironment 对象的 LoginTimeout 属性代替。

在对象上使用 Close 方法关闭一个与 rdoConnection 相关的数据库，则从 rdoConnections 集合删除该连接，并与数据源断开连接。

也可以使用 Dim 语句声明一个新的 rdoConnection 对象，如下所示：

Dim myCn as New rdoConnection

一旦在这种方式实例化，则可以按需要设置 rdoConnection 属性，并使用 EstablishConnection 方法打开连接。

关于 ODBC 驱动程序和指定需要的连接字符串参数的详细内容，请参阅驱动程序提供的帮助文件。


OpenResultset 方法（远程数据）

建立一个新的 rdoResultset 对象。

语法

Set variable = connection.OpenResultset(name [,type [,locktype [,option]]])

Set variable = object.OpenResultset([type [,locktype [, option]]])

OpenResultset 方法的语法有下列部分：

部分 | 描述
variable | 对象表达式，其值是 rdoResultset 对象。
connection | 对象表达式，其值是已存在的 rdoConnection 对象，该对象将用于建立新的 rdoResultset。
object | 对象表达式，其值是已存在的 rdoQuery 或 rdoTable 对象，该对象将用于建立新的 rdoResultset。
name | String，为新的 rdoResultset 指定行源。这个参数可以指定 rdoTable 对象的名称，rdoQuery 的名称，或一个可以返回行的 SQL 语句。
type | Variant 或常数，指定要建立的游标 的类型，由下面设置值中指定。
locktype | Variant 或常数，指定并发控件的类型。如果不指定 locktype，就设定它为 rdConcurReadOnly。
option | Variant 或常数，指定新 rdoResultset 的特性。

设置值

  • name

    当对 rdoConnection 对象使用 OpenResultset 方法，并且查询没有被预定义时，使用 name 参数。在这种情况下，名字一般包含一个返回行的 SQL 查询。该查询可以含有多个 SELECT 语句，或是动作查询和 SELECT 语句的组合，但不能只是动作查询，那样会导致一个可以捕获的错误。关于更为详细的内容，请参阅 SQL 属性。

  • 游标 type

    注意 不是每个 ODBC 数据源驱动器都支持所有类型的游标或并发。关于更多的信息，请参阅 rdoResultset。另外，不是所有类型的游标驱动器都支持返回多个结果集的 SQL 语句。例如，服务器端的游标不支持含有多个 SELECT 语句的查询。

    type 参数指定用于管理结果集的游标类型。如果不指定类型，OpenResultset 就建立一个只能向前的 rdoResultset。不是所有的 ODBC 数据源或驱动程序都能执行各种游标类型。如果驱动程序不能执行选取的类型，就产生一个警告信息，并放入 rdoErrors 集合中。使用一个下列结果集中的类型常数，定义新的 rdoResultset 对象的游标类型。关于游标类型更为详细的内容，请参阅 CursorType 属性。

type 常数 | 值 | 描述
rdOpenForwardOnly | 0 | （缺省值）打开一个仅向前类型 rdoResultset 对象。
rdOpenKeyset | 1 | 打开一个键集类型 rdoResultset 对象。
rdOpenDynamic | 2 | 打开一个动态类型 rdoResultset 对象。
rdOpenStatic | 3 | 打开一个静态类型 rdoResultset 对象。

  • 并发的 LockType

    为了在被更新的数据上支持足够的控件，RDO 提供了大量的并发选项，控制其它用户如何授权，或者不许访问正在更新的数据。在大多数情况下，当使用 LockType 的一个设置锁定一特定行时，远程引擎可能锁定含有该行的整个页面。如果锁定的页面太多，远程引擎就将页面锁定升级到表锁定，以提高综合系统性能。

    不是所有的数据源都支持各种锁定类型。例如，对于 SQL Server 和 Oracle 服务器，静态类型 rdoResultset 对象只能支持 rdConcurValues 或 rdConcurReadOnly。关于并发类型更为详细的内容，请参阅 LockType 属性。

locktype 常数 | 值 | 描述
rdConcurReadOnly | 1 | （缺省值）只读的。
rdConcurLock | 2 | 保守式并发。
rdConcurRowVer | 3 | 基于行 ID 的开放式并发。
rdConcurValues | 4 | 基于行值的开放式并发。
rdConcurBatch | 5 | 使用批模式更新的开放式并发。每一成功地更新了的行返回 Status 值。

  • 其它的 options

    如果使用 rdAsyncEnable 选项，只要开始查询，在结果集产生之前控制就返回到应用程序。为了测试查询是否完成，使用 StillExecuting 属性。在 StillExecuting 返回 False之前，rdoResultset 对象是无效的。也可以使用 QueryComplete 事件确定何时准备处理查询。在 StillExecuting 属性返回 True 之前，不能引用未初始化的 rdoResultset 对象的其它属性，并且只有 Cancel 和 Close 方法是有效的。

    如果使用 rdExecDirect 选项，RDO 使用 SQLExecDirect ODBC API 函数执行查询。在这种情况下，没有建立临时保存的过程来执行查询。如果不希望在应用程序过程中，花费太多的时间执行查询，使用这个选项可以节约时间。另外，如果不是由保存过程运行而是直接执行的查询时，这个选项是必须的。例如，在为后续的查询建立临时表的查询中，必须使用 rdExecDirect 选项。

    对 options 参数可以使用下列常数：

常数 | 值 | 描述
rdAsyncEnable | 32 | 异步地执行操作。
rdExecDirect | 64 | （缺省的。）不创建保存过程而执行查询。使用 SQLExecDirect 代替 SQLPrepare 和 SQLExecute。

说明

如果 OpenResultset 方法成功，RDO 实例化一个新的 rdoResultset 对象，并将其添加到 rdoResultsets 集合中 - 即使查询并没有返回行。如果查询由于编译错误，或语法错误、权限错误及其它错误而不能执行，就不能建立 rdoResultset，并且会引发一个可以捕获的错误。rdoResultset 主题包含有关于 rdoResultset 及管理 rdoResultset 集合的详细细节。

注意 如何处理孤立的引用 rdoConnection 对象，RDO 2.0 和 RDO 1.0 是不同的。当用另一个使用 OpenConnection 方法的 rdoConnection，设置已分配给 rdoConnection 对象的变量时，关闭已存在的 rdoConnection 对象，并从 rdoConnections 集合中将其放弃。而在 RDO 1.0 中，已存在的对象仍为打开状态，并留在 rdoConnections 集合中。

注意 在使用 name 参数中的基本表的名字之前，必须先对 rdoTables 集合使用 Refresh 方法将其移居。也可以通过序号引用其中的一个成员来移居 rdoTables 集合。例如，引用 rdoTables(0) 将移居整个集合。

在连接上执行多操作

如果有一个未移居的 rdoResultset 挂起在只支持 rdoConnection 对象的单个操作的数据源上，除非该 rdoResultset 被刷新、关闭、或全部移居，否则就不能使用 OpenResultset 方法建立另外的 rdoQuery 及 rdoResultset 对象，对 rdoTable 对象也不能使用 Refresh 方法。例如，当使用 SQL Server 4.2 作为数据源，在移到当前 rdoResultset 对象的最后一个结果集的最后一行之前，不能建立另外的 rdoResultset 对象。为了移居结果集，使用 MoreResults 方法移过所有挂起的结果集，或对 rdoResultset 使用 Cancel 或 Close 方法刷新所有挂起的结果集。


rdoCreateEnvironment 方法（远程数据）

建立一个新的 rdoEnvironment 对象。

语法

Set variable = rdoCreateEnvironment(name, user, password)

rdoCreateEnvironment 方法的语法有下列部分：

部分 | 描述
variable | 对象表达式，其值是 rdoEnvironment 对象。
name | String 变量，唯一地命名新 rdoEnvironment 对象。关于 rdoEnvironment 的有效命名请参阅 Name 属性。
user | String 变量，指定新 rdoEnvironment 对象的所有者。有关更详细的信息请参阅 UserName 属性。
password | String 变量，新 rdoEnvironment 对象的密码。该密码最多可以有 14 个除 ASCII 字符 0 (null) 之外的任意字符。

说明

rdoEnvironment 对象定义一个事务、用户、以及密码上下文。当初始化 rdoEngine 时，自动地用 rdoDefaultUser 和 rdoDefaultPassword 为用户名和密码建立一个缺省的 rdoEnvironments (0)。如果需要定义交互的、含有指定的 rdoConnection 对象或指定的用户事务的范围，使用 rdoCreateEnvironment 方法并为环境指定用户。然后可对这个新的环境打开连接。

与其它的用于建立远程数据对象的方法不同，rdoCreateEnvironment 需要提供各个部分。如果没有提供各个部分，该对象将不能被添加到集合。另外，rdoEnvironment 对象不是参数，也不能被保存。一旦建立了 rdoEnvironment 对象，就只能修改 UserName 和 Timeout 属性的设置。

在使用它之前，不必将新的 rdoEnvironment 对象添加到集合中－ 它是被自动添加到 rdoEnvironments 集合中的。

如果 name 引用一个已经是 rdoEnvironments 集合中成员的对象，就产生一个可以捕获的错误。

一旦使用 rdoCreateEnvironment 建立一个新的 rdoEnvironment 对象，就开始一个 rdoEnvironment 会话，并且可以在应用程序中引用该对象。

为了从 rdoEnvironments 集合删除 rdoEnvironment 对象，可对该 rdoEnvironment 使用 Close 方法。但不能删除 rdoEnvironments(0)。


rdoRegisterDataSource 方法（远程数据）

为 ODBC 数据源输入连接信息到 Windows Registry 中。

语法

rdoRegisterDataSource DSN, driver, silent, attributes

rdoRegisterDataSource 方法的语法有下列部分：

部分 | 描述
DSN | 字符串表达式，是在引用数据源描述信息块的 OpenConnection 方法中使用的名字。例如，如果数据源是一个 ODBC 远程数据库，这就是服务器的名字。
Driver | 字符串表达式，表示 ODBC 驱动程序的名称。它并不是 ODBC 驱动程序动态连接库 (DLL) 文件名。例如，SQL Server 是驱动程序名，而 SQLSRVR.DLL 是 DLL 文件名。必须安装有 ODBC 及相应的驱动程序。
Silent | 布尔 值，如果不想显示 ODBC 驱动程序对话框，用以提示指定驱动程序的信息，该值就为 True；否则，如果希望显示 ODBC 驱动程序对话框，该值就为 False。如果 silent 为 True，attributes 必须包含所有必需的指定驱动程序的信息，否则，对话框会随时出现。
Attributes | 字符串表达式，它是一个要添加到 ODBC.INI 文件中的关键字列表。各关键字是在用回车作分割符的字符串中。

说明

当使用 OpenConnection 或 EstablishConnection 方法时，可以使用已登录的数据源项提供连接信息。

如果当使用 rdoRegisterDataSource 方法时，数据源已经在 Windows Registry 中登录了，就更新该连接信息。如果 rdoRegisterDataSource 方法由于某种原因，未能改变 Windows Registry，就产生一个错误。

关于 ODBC 驱动程序，象 SQL Server，更为详细的信息，请参阅驱动程序提供的帮助文件。

注意 鼓励使用 Windows 控制面板 32 位的 ODBC 数据源对话框添加新的数据源，或修改已有的项。

Microsoft SQL 服务器属性

当为从 Drvssrvr.Hlp 文件抽取的 Microsoft SQL Server 驱动程序，设置 DSN 入口时，可使用下列属性。其它代理商的驱动程序会有他们自己的属性设置，可能符合也可能不符合这些设置。有关附加的细节，请参阅驱动程序提供的文件。

关键字 | 描述
ADDRESS | SQL Server 数据库管理系统的网络地址，驱动程序从此处检索数据。
DATABASE | SQL Server 数据库的名称。
DESCRIPTION | 数据源中数据的描述。
LANGUAGE | SQL Server 使用的区域语言。
NETWORK | 与常驻 SQL Server 及 SQL Server 驱动程序的平台连接的网络库。
OEMTOANSI | 如果 SQL Server 客户机和 SQL Server 正在使用同一个非 ANSI 字符集，允许将 OEM 字符集转换为 ANSI 字符集。ON（允许转换）的有效值是 YES，OFF 则是 NO。
SERVER | 常驻数据源的网络计算机的名称。
TRANSLATIONDLL | 翻译在应用程序和数据源之间传递数据的 DLL 的名字。
TRANSLATIONNAME | 翻译在应用程序和数据源之间传递数据的翻译器的名称。
TRANSLATIONOPTION | 允许翻译在应用程序和数据源之间传递的数据。
USEPROCFORPREPARE | 不允许为 SQLPrepare 产生保存过程。OFF（不允许产生）的有效值是 NO，ON 则是 YES。缺省值（在安装对话框中设置的）是 YES。

设置 OEMTOANSI 选项

如果 SQL Server 客户计算机和 SQL Server 正在使用同一个非 ANSI 字符集，就选择该选项。例如，如果 SQL Server 使用代码页 850，并且客户计算机为 OEM 代码页也使用代码页 850，选择该选项，将确保保存在数据库中的字符能正确地转换为 ANSI，以供基于 Windows 的应用程序使用。

当该选项被设为 YES，并且 SQL Server 客户机和 SQL Server 正在使用不同的字符集时，必须指定一个字符翻译器。

设置 Server 选项

Server 选项是设置服务器的名称。如果 DSN 打算引用本地系统上的服务器，可以输入 "(local)" 作为在 Microsoft Windows NT 计算机上的服务器。然后即使当运行不是网络版本的 SQL Server 时，也可以使用 SQL Server 的本地复制件（取之于命名管道）。注意当 16 位的 SQL Server 驱动程序正在使用没有网络的 "(local)" 时，必须安装了有 MS Loopback Adapte。

关于不同类型的网络服务器命名的详细信息，请参阅 Microsoft SQL Server Setup。

设置 Address 选项

Address 选项设置 SQL Server 数据库管理系统 (DBMS) 的网络路径名地址，驱动程序从此处检索数据。对于 Microsoft SQL Server，设为（缺省值）时通常省略此参数。

设置 Network 选项

Network 属性设置 32 位的、SQL Server 驱动程序用于网络软件通讯的 SQL Server Net-Library DLL 的名称。如果不提供该选项，SQL Server 驱动程序就使用客户计算机缺省为 Net-Library，它是在SQL Server 客户配置实用程序的 Net-Library 标签的 Default Network 对话框中指定的。

如果使用 Network Library 和可选的 Network Address 建立一个数据源，ODBC SQL Server Setup 将建立一个服务器项，这可以在 SQL Server 客户配置实用程序的 Advanced 标签中看到。DB-Library 应用程序也使用这些服务器名输入项。


Refresh 方法（远程数据）

关闭并重新建造由 RemoteData 控件建立的 rdoResultset 对象，或刷新“应用于”列表集合的成员。

语法

object.Refresh

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

如果描述结果集的属性已经有了改变，可以对 RemoteData 控件使用 Refresh 方法关闭并重新打开 rdoResultset。当使用 Refresh 方法，将该属性及当前行位置，复位到查询刚开始运行时的状态设置。

一旦对 RemoteData 控件执行了 Refresh 方法，那么所有保存的 rdoResultset 书签就无效了。

如果 rdoResultset 对象的 BOF 和 EOF 属性设置都为 True，或者在使用 Refresh 方法之后 RowCount 属性被置为 0，则查询不返回任何行，新的 rdoResultset 中没有数据。

在数据库机制从属于改变检索当前表定义的多用户环境中，可使用 Refresh 方法。对 rdoTables 集合使用 Refresh 方法，可从数据库中的基本表取得表名。对指定 rdoTable 对象的 rdoColumns 集合使用 Refresh 方法，可从基本表取得含有列名及数据类型的表结构。

注意 在使用 OpenResultset 方法的 name 参数中的基本表名之前，必须先对 rdoTables 集合使用 Refresh 方法进行移居。也可以通过序号引用其中的一个成员来移居 rdoTables 集合。例如，引用 rdoTables(0) 将移居整个集合。


Remove 方法 （远程数据）

从 Remote Data Collection 对象中删除一个特定的成员。

语法

object.Remove index

Remove 方法的语法包括下列几部分:

部分 | 描述
Object | 对象表达式，用来计算“应用于”列表中的对象。
Index | 整数或字符串，唯一地识别集合中的对象。用一个整数指明 Index 属性的值；用一个字符串指明 Key 属性的值。

说明

要删除集合中的所有成员，请使用 Clear 方法。


Requery 方法（远程数据）

通过重新执行基于对象的查询，更新 rdoResultset 对象中的数据。

语法

object.Requery [options]

Requery 方法的语法有下列部分：

部分 | 描述
object | object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。
options | Variant 或常数，确定如何按设置值中指定的参数运行查询。

设置值

options 部分可以使用下列常数：

常数 | 值 | 描述
rdAsyncEnable | 32 | 异步地执行操作。

说明

使用这个方法确保 rdoResultset 包含最新的数据。当使用 Requery 时，所有由你和其它用户对下一级表中数据的修改，都显示在这个 rdoResultset 中，并且 rdoResultset 中的第一行就成为当前行。

如果使用 rdAsyncEnable 选项，在开始查询后结果集产生之前控制就立即返回到应用程序。为了测试查询是否完成，使用 StillExecuting 属性。在 StillExecuting 返回 False之前，rdoResultset 对象是无效的。也可以使用 QueryCompleted 事件指示查询何时完成。

如果 rdoParameter 对象已经改变，则它们的新值将用于产生新的 rdoResultset 的查询中。

一旦执行了 Requery 方法，所有以前保存的 rdoResultset 书签就都无效了。

如果 rdoResultset 对象的 BOF 和 EOF 属性设置都为 True，或者在使用 Requery 方法之后 RowCount 属性被置为 0，查询不返回任何行，新的 rdoResultset 中没有数据。

不能对 Restartable 属性为 False 的 rdoResultset 对象使用 Requery 方法。


Update 方法（远程数据）

将复制缓冲区行的内容保存到一个指定的可更新的 rdoResultset 对象中，并废弃复制缓冲区。

语法

object.Update

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

使用 Update 保存当前行以及对于基本数据库表所作的任何修改。在使用 AddNew 或 Edit 方法之后，如果在应用程序结束之前不使用 Update 方法，对 rdoResultset 所作的修改将会丢失。

注意 当使用 ClientBatch 游标库，在未使用 BatchUpdate 方法之前，对基本表的所有修改将被延迟。在这种情况下，Update 方法更新本地的 rdoResultset，但不更新基本表。如果应用程序在完成 BatchUpdate 方法之前就结束，这些修改就会丢失。

如遇下列情况，会丢失对当前行的修改：

  • 使用了 Edit 或 AddNew 方法之后，没有首先使用 Update，就将当前行指针重新定位到另一行。

  • 使用了 Edit 或 AddNew 之后，没有首先使用 Update，又使用 Edit 或 AddNew。

  • 使用 CancelUpdate 方法取消修改。

  • 将 Bookmark 属性设置到另一行上。

  • 没有先使用 Update 就关闭 object 引用的结果集。

  • 应用程序在执行 Update 方法之前就结束了，比如象系统掉电。

为了编辑一行，使用 Edit 方法将当前行的内容复制到复制缓冲区中。如果没有先使用 AddNew 或 Edit，当使用 Update 或添加一个新行时，产生一个错误。

为了添加一个新行，使用 AddNew 方法初始化并激活复制缓冲区。

在下列任一条件下使用 Update 会产生错误：

  • 不是当前行。

  • 连接或 rdoResultset 是只读的。

  • 行中没有可更新的列。

  • 没有挂起 Edit 或 AddNew 操作。

  • 另一个用户已经锁定该行或含有该行的数据页。

  • 不具有执行该操作的权限。

  • 由于依赖所使用的驱动程序和游标类型，所以不能使用游标更新主键。


UpdateControls 方法（远程数据）

从 RemoteData 控件的 rdoResultset 对象中得到当前行，并在绑定于 RemoteData 控制的控件中显示相应的数据。

语法

object.UpdateControls

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

使用这个方法将被绑定的控件的内容恢复到它们原来的值，比如对数据作了改变，然后又决定取消这个改变。

这个方法与将当前行再次定义为当前行是等效的，只是不产生事件。由于不调用任何事件，这个方法被用于简化更新操作，因为它不必触发另外的确认或改变事件的过程。


UpdateRow 方法（远程数据）

将被绑定的控件的当前值保存到数据库中。

语法

object.UpdateRow

object 所在处代表对象表达式，其值为“应用于”列表中的一个对象。

说明

在 Validate 事件的过程中，使用这个方法将绑定控件的当前内容保存到数据库中，但是不再触发 Validate 事件。使用该方法可以避免层叠事件。

UpdateRow 方法与执行 Edit 方法具有相同的效果，修改一个列，然后执行 Update 方法，只是不产生事件。

注意 当使用 ClientBatch 游标库，在未使用 BatchUpdate 方法之前，对基本表的所有修改将被延迟。在这种情况下，Update 方法更新本地的 rdoResultset，但不更新基本表。如果应用程序在完成 BatchUpdate 方法之前结束，这些修改就会丢失。

无论何时更新数据库中的行，当该行写到数据库之前，必须满足所有的有效性规则。在 Microsoft SQL Server 的情况下，这些规则是由：Transact SQL 的缺省值、规则、及触发器建立的，该触发器是为了强制引用和数据的完整性而编写的。

由于以下的原因，可能不产生更新，只会触发一个可以捕获的错误：

  • 含有行的数据页或行本身被锁定。

  • 数据库及 rdoResultset 对象是不可更新的。

  • 没有执行该操作的权限。


rdoColumn 对象

rdoColumn 对象表示具有普通数据类型和普通属性集合的数据列。

说明

一个 rdoTable、或 rdoResultset 对象的 rdoColumns 集合，代表一个数据行中的 rdoColumn 对象。可使用 rdoResultset 中的 rdoColumn 对象来读取和设置该对象当前行中的各数据列的值。然而，在大多数情况下，对 rdoColumn 对象的引用只能是隐含的，因为 rdoColumns 集合是 rdoResultset 对象的缺省集合。

rdoColumn 对象的名称是由以下两种名称定义的，一种名称用于定义数据源表中的列，另一种名称在 SQL 查询中被赋值。例如，一个 SQL 查询给该列取了别名，则把这个名称赋值给 Name 属性；否则，就使用该列的名称。

可使用 rdoColumn 对象及其方法和属性来操作数据库列。例如，可以：

  • 使用 rdoColumn 的 Value 属性从指定列中抽取数据。

  • 使用 Type 和 Size 属性设置来确定数据类型和数据尺寸。

  • 使用 Updatable 属性来查看列是否可以改变。

  • 使用 SourceColumn 和 SourceTable 属性设置来定位数据的初始源。

  • 使用 OrdinalPosition 属性来取得某个 rdoColumns 集合中的 rdoColumn 对象的表示顺序。

  • 使用 Attributes 和 Required 属性设置来确定可选特征以及列中是否允许为 null。

  • 使用 AllowZeroLength 属性来确定如何处理零长度字符串。

  • 使用 BatchConflictValue 和 OriginalValue 属性来解决优化批处理更新冲突。

  • 使用 KeyColumn 来确定该列是否为主键的一部分。

  • 使用 Status 属性来确定列是否被修改过。

  • 如同由 ChunkRequired 属性所确定的那样，使用 AppendChunk、ColumnSize 和 GetChunk 方法来操作要求使用这些方法的列。

当需要从一个 rdoResultset 列上引用数据时，可通过以下方法来引用 rdoColumn 对象的 Value 属性：

  • 使用以下语法来引用 Name 属性设置：
    ' 引用 Au_Fname 列 rdoColumns("Au_Fname")
rs.rdoColumns("Au_Fname")

    -或-

    ' 引用 Au_Fname 列
rs.rdoColumns!Au_Lname
  • 使用以下语法来引用它在 rdoColumns 集合中的顺序位置：
    rs.rdoColumns(0)

rdoTable 对象的 rdoColumns 集合包括数据列的规范。可以用 rdoTable 对象的 rdoColumn 对象来映射一个基本表的列结构。不能使用 RDO属性和方法来对一个数据库表的结构直接进行改动。但可使用数据定义语言(DDL)动作查询来对数据库结构描述进行修改。

当 rdoColumn 对象作为 rdoResultset 对象的一部分被访问时，当前行中的数据在 rdoColumn 对象的 Value 属性中是可见的。要操作 rdoResultset 中的数据，不能象通常情况下那样直接引用 rdoColumns 集合。而应该代之以引用作为 rdoResultset 缺省集合 rdoColumns 集合的语法。

dim rs As rdoResultset
Set rs = cn.OpenResultset("Select * from Authors" _
   & "Where Au_Lname = 'White'",rdOpenForwardOnly)
debug.print rs!Au_Fname
   '引用 rdoRecordset object's rdoColumns 集合.


rdoColumn 对象、rdoColumns 集合示例

下面的示例将对一个 SQL 服务器数据库打开一个连接，并且创建一个返回两个列的 rdoResultset：一个常规列和一个由表达式导出的列。然后，该示例映射从结果集上返回的 rdoColumn 对象。

Private Sub rdoColumnButton_Click()
Dim cl As rdoColumn
Dim rs As rdoResultset
Dim sSQL As String
Dim cn As rdoConnection
Dim connect As String

connect = "uid=;pwd=;database=pubs;"

Set cn = rdoEnvironments(0).OpenConnection(workdb, _
             rdDriverNoPrompt, False, connect)

sSQL = "Select Pub_ID, Max(Price) BestPrice " _
    & " from Titles Group by Pub_ID"

Set rs = cn.OpenResultset(sSQL, rdOpenForwardOnly, _
    rdConcurReadOnly)

With rs
    For Each cl In .rdoColumns
        Print cl.Name; "-"; cl.Type; ":"; cl.Size, _
         cl.SourceTable, cl.SourceColumn
    Next cl
    Print
    Do Until .EOF
        For Each cl In .rdoColumns
            Print cl.Value,
        Next cl
        Print
        .MoveNext
    Loop
End With
End Sub


rdoColumns 集合

rdoColumns 集合包括一个 rdoResultset 或 rdoTable 对象的所有 rdoColumn 对象。

说明

rdoTable 或 rdoResultset 对象的 rdoColumns 集合表示一个数据行中的 rdoColumn 对象。使用 rdoResultset 中的 rdoColumn 对象来读取和设置此对象的当前行中的各数据列的值。

在下列情况时，RDO 也自动创建 rdoColumn 对象：

  • 创建一个 rdoTable 或 rdoResultset 对象。

  • 引用一个 rdoTable 对象。

  • 通过 OpenResultset 来创建一个 rdoResultset。


rdoConnection 对象

rdoConnection 对象表示到一个远程数据源和该数据源上的一个指定数据库的打开的连接，或表示一个已经分配但却尚未连接的对象（该对象可随后用于建立一个连接）。

说明

一般来说，rdoConnection 对象表示一个到远程数据源上的物理连接，并对应唯一的 ODBC hDbc 句柄。在访问远程数据源上的数据之前，要求建立一个到远程数据源上的连接。使用 RemoteData 控件或 rdoEnvironment 对象的 OpenConnection 方法可打开一个到远程 ODBC 数据源的连接，并创建 rdoConnection 对象。

为了使用 rdoConnection 对象来建立一个到远程服务器上的连接，可以使用 OpenConnection 方法来收集 connect, dsname, readonly 和 prompt 参数并打开此连接。然后这些参数可应用到最新创建的 rdoConnection 对象上。也可以使用 RemoteData 控件来建立连接。

创建独立 rdoConnection 对象

也可以创建一个新的 rdoConnection 对象，该对象不立即与某个指定的到数据源上的物理连接相链接。例如，下面代码创建一个新的独立 doConnection 对象：

Dim X As New rdoConnection.

一旦创建，就可以设置独立 rdoConnection 对象的属性，随后使用 EstablishConnection 方法。该方法确定基于 prompt 参数，用户将得到何种提示，并且基于 readonly 参数将连接设置为只读状态。

在使用该技术时，RDO 基于 rdoEngine 的缺省值来设置以下属性：CursorDriver、LoginTimeout、UserName、Password 和 ErrorThreshold。CursorDriver 和 LoginTimeout 属性可在 rdoConnection 对象中设置，而 UserName 和 Password 可通过连接串中的参数来设置。一旦打开连接，所有的这些属性都为只读。

在声明一个独立 rdoConnection 对象或使用 EstablishConnection 方法时，该对象不会自动地追加到 rdoConnections 集合中。可使用 Add 或 Remove 方法来向 rdoConnections 集合中添加，或从 rdoConnections 集合中删除独立 rdoConnection 对象。然而在使用该对象建立一个连接之前，不必向 rdoConnections 集合中添加一个独立 rdoConnection 对象。

注意 RDO 1.0 集合与数据访问对象(DAO)集合的特性不尽相同。当设置一个包含某个 RDO 对象（如 rdoResultset）的引用的变量时，不关闭现存的对象，也不从 rdoResultsets 集合中删除它。现存对象保持打开状态，并且还是其相应的集合的一个成员。

对比而言，RDO 2.0 集合则不是这种特性。当使用设置语句来给一个包含有某个 RDO 对象的引用的变量赋值时，现存的对象被关闭，并且从关联的 rdoResultsets 集合中删除它。这个改变是为了使 RDO 与 DAO 更好地兼容。

异步操作

EstablishConnection 和 OpenConnection 方法都支持同步、异步及事件管理操作。通过设置 rdAsyncEnable 选项，控制将在建立连接之前返回到应用程序。一旦 StillConnecting 属性返回 False 并且 Connect 事件引发，则表明此连接或已经建立、或是没有成功地完成。可以通过检查 rdoErrors 集合返回的错误，来检验该操作成功与否。

打开没有数据源名的连接

在许多情况下，难以保证目标系统上存在一个已注册的数据源名(DSN)，并且在一些情况下，创建这样一个名称也是不适当的。实际上，如果使用缺省的网络协议（命名管道）来建立连接，并且也知道服务器和 ODBC 驱动器的名称时，就不需要一个 DSN。如果是这种情况，可按照以下步骤来建立无 DSN 的连接：

  1. 将连接字符串的 DSN 参数设置为空字符串(DSN='')。

  2. 将服务器名包含在连接字符串中。

  3. 将 ODBC 驱动器名包含在连接字符串中。因为许多驱动器的名称会多于一个字，所以应将这个名称附在花括号{}中。

注意 如果需使用其它非命名管道的网络协议或其它任意 DSN-设置的选项（如 OEMTOANSI 转换），则不能使用该选项。

例如，下面的代码对 SQL 服务器"SEQUEL"打开一个只读状态的 ODBC 游标连接，并包含一个简单的错误处理程序：

Sub MakeConnection()
Dim rdoCn As New rdoConnection
On Error GoTo CnEh
With rdoCn
    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=SEQUEL;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .CursorDriver = rdUseODBC
    .EstablishConnection rdDriverNoPrompt, True
End With
Exit Sub
CnEh:
Dim er As rdoError
    Debug.Print Err, Error
    For Each er In rdoErrors
        Debug.Print er.Description, er.Number
    Next er
    Resume Next
End Sub

选择一个指定的数据库

一旦建立了一个连接，就可以使用 rdoConnection 对象及其方法和属性来操作与此 rdoConnection 关联的一个数据库。对那些支持每一连接可有多于一个以上数据库的服务器，缺省的数据库为：

  • 由数据库系统管理员给用户名指定。

  • 当创建 rdoConnection 时，用所用的 DATABASE 连接参数来指定。

  • 由已注册的 ODBC 数据源输入项来指定。

  • 使用 SQL 语句来选择，如随一个动作查询而提交的 USE <database>。

如果 SQL 查询中没有专门引用另外的数据库，则所有对此服务器执行的查询都将被认为是针对这个缺省的数据库进行的。

为连接时发生的错误做准备

不能连接到远程数据库，有着各种各样的原因。考虑以下的这些情况，

它们可能是致使连接不能完成的典型情况：

  • 由于管理设置或所发许可证的限制，服务器可能没有足够的连接资源。

  • 用户可能不具备密码所提供的访问网络、服务器或数据库的权限。

  • 服务器、网络或 WAN 网桥可能关闭了，或者只是运行得比所期望的要慢。

关闭 rdoConnection

在对 rdoConnection 对象使用 Close 方法时，将关闭所有打开的 rdoResultset 或 rdoQuery 对象。然而，若此 rdoConnection 对象仅是失去作用域，那么这些对象将继续保持打开状态，直到显式地关闭此 rdoConnection 或这些对象为止。当存在未完成的查询或未提交的事务时，不推荐关闭一个连接。

关闭一个连接也会从 rdoConnections 集合中删除此连接。然而，此时并没有破坏 rdoConnection 对象本身。如果需要，用同样的设置，使用 EstablishConnection 方法可以将它重新连接到同一个服务器上；或改变此 rdoConnection 对象的属性，然后再使用 EstablishConnection 来连接到另外一个服务上。

关闭一个连接时还将指令远程服务器遗弃与此连接相关联的任何指定实例对象。例如，服务器方的游标、临时表或在 SQL 服务器上的 TempDB 数据库中所创建的其它任何对象都会被遗弃。

使用 rdoConnection 的方法和属性进行工作

使用 rdoConnection 对象的方法和属性可以操作与之关联的连接、数据库和查询。例如，可以：

  • 该连接创建的结果集所请求的游标类型，由 CursorDriver 属性确定。

  • 使用 OpenResultset 方法来创建一个新的 rdoResultset 对象。

  • 使用 LastQueryResults 来引用该连接创建的最后一个 rdoResultset 。

  • 使用 QueryTimeout 或 LoginTimeout 属性，指定在取消一个查询或连接的企图前 ODBC 驱动程序管理器将等待多久。

  • 使用 RowsAffected 属性来确定最后一个动作查询将影响多少行。

  • 使用 Execute 方法来运行一个动作查询或向数据库传递一个要执行的 SQL 语句。

  • 使用 CreateQuery 方法来创建一个新的 rdoQuery 对象.

  • 使用 Close 方法来关闭一个连接、从 rdoConnections 集合中删除 rdoConnection 对象、释放连接句柄、以及终止连接。

  • 使用 Transactions 属性来确定该连接是否支持事务，这些事务可以使用 BeginTrans、CommitTrans 和 RollbackTrans 方法来实现。

  • 使用 AsyncCheckInterval 属性，确定 RDO 将隔多长时间来轮询一个已完成的异步操作情况。

  • 使用具有 hDbc 属性的 ODBC API 来设置连接选项。

  • 使用 Connect 属性，确定 OpenConnection 方法或 RemoteData 控件的 Connect 属性中用到的 connect 参数。

rdoConnection 事件

当操作 rdoConnection 对象时，将引发以下事件。这些事件可以用来对连接过程和解除连接过程进行宏观管理，并在查询超时的情况下提供额外的重试处理。

事件名称 | 描述
BeforeConnect | 该事件是在调用 ODBC 来建立连接之前引发。
Connect | 该事件是在连接建立之后引发。
Disconnect | 该事件是在连接关闭之后引发。
QueryComplete | 该事件是在连接的查询运行完成之后引发。
QueryComplete | 该事件是在查询超时(QueryTimeout)周期用完之后引发。

对 rdoConnection 对象寻址

rdoConnection 的 Name 属性的设置，指定了用来打开该连接的数据源名 (DSN)参数。因为在建立无 DSN 的连接时不使用它，所以这个属性常为空。在指定不同的 DSN 来打开每一个连接的情况下，可使用以下的语法，通过它的 Name 属性设置来引用任何 rdoConnection 对象。这段代码引用对 Accounting DSN 打开的连接。

rdoConnections("Accounting")

也可以使用如下语法形式，由它的顺序号来引用该对象（以下这个语句引用 rdoConnections 集合的第一个成员）：

rdoConnections(0)


rdoConnections 集合

rdoConnections 集合包含所有在远程数据库引擎的 rdoEnvironment 对象中所打开或创建的 rdoConnection 对象，或是使用 Add 方法来进行分配并添加到 rdoConnections 集合中的 rdoConnection 对象。

说明

rdoConnections 集合用于管理 rdoConnection 对象。然而，只有使用 OpenConnection 方法或使用 RemoteData 控件所创建的 rdoConnection 对象才会自动地添加到该集合中。当分配一个独立 rdoConnection 对象时，只有使用 Add 方法才能把它添加到 rdoConnections 集合中。

注意 RDO 1.0 集合与数据访问对象(DAO)集合的特性不尽相同。当Set 包含某个 RDO 对象（如 rdoResultset）的引用的变量时，不关闭现存的对象，也不从关联的 rdoResultsets 集合上删除它。现存对象保持打开状态，并且仍旧是其对应的集合的一个成员。

相比而言，RDO 2.0 集合则不具有这种特性。当使用设置(Set)语句来给包含有某个 RDO 对象的引用的变量赋值时，将关闭现存的对象并且从关联的 rdoResultsets 集合上删除它。这个改变是为了使 RDO 与 DAO 更好地兼容。

关闭 rdoConnection 对象

在对 rdoConnection 对象使用 Close 方法时，将关闭任何打开的 rdoResultset 或 rdoQuery 对象，并且还会从 rdoConnections 集合中删除此 rdoConnection 对象。然而，若此 rdoConnection 对象仅仅是失去作用域，这些对象将继续保持打开状态，直到显式地关闭此 rdoConnection 或这些对象。


rdoConnection 对象，rdoConnections 集合示例

这个示例建立一个独立 rdoConnection 对象，然后设置其属性，并使用 EstablishConnection 方法来打开此连接。

Option Explicit

Dim cn As New rdoConnection

Private Sub rdoConnectionButton_Click()
WorkingLight.Caption = "Connecting"
With cn
    .Connect = "DSN=BadServerName;" _
     & "UID=;PWD=;DATABASE=WorkDB;"
    .LoginTimeout = 20
    .CursorDriver = rdUseOdbc
    .EstablishConnection _
      prompt:=rdDriverNoPrompt, _
      Option:=rdAsyncEnable
End With
While .StillConnecting
  ToggleLight      ' 状态指示器闪烁
  DoEvents
Wend
WorkingLight = True      ' 显示状态标记
WorkingLight.Caption = "Connected"
End Sub

Sub ToggleLight()   '“打开”灯闪烁
WorkingLight = Not WorkingLight
End Sub


rdoEngine 对象

rdoEngine 对象表示远程数据源。作为顶层对象，它包含远程数据对象(RDO)分层结构中的其它所有对象。

说明

rdoEngine 对象可以表示一个远程数据库引掣，或者表示作为数据库并由 ODBC 驱动程序管理器管理的数据源。rdoEngine 对象是一个预定义的对象，因此不能再创建附加的 rdoEngine 对象，并且它不能是任何集合的成员。

rdoEngine 对象用来引用 rdoEnvironments 集合，或者用来为新创建的 rdoEnvironment 对象建立缺省值。当创建 rdoEnvironment 对象时，用基于 rdoEngine 中所设置的缺省值来初始化它的属性。在第一次引用它时，就已创建了一个缺省的 rdoEnvironments(0)对象。

当一条信息性消息从远程数据源返回时，rdoEngine 对象将引发 InfoMessage 事件。信息性消息由 ODBC SQL_SUCCESS_WITH_INFO 的返回码来指示。这些消息放置在 rdoErrors 集合中。在几条消息同时到达的情况下，当最后的消息到达并把它添加到 rdoErrors 集合之后，只引发一个 InfoMessage事件。

设置缺省的 rdoEnvironment 属性

下列属性给所有新创建的 rdoEnvironment 对象建立缺省的设置。还使用它们来实例化独立 rdoConnection 对象：

  • 使用 rdoDefaultLoginTimeout 属性来确定 rdoEnvironment 对象的缺省 LoginTimeout 属性，该属性用于连接超时管理。

  • 使用 rdoDefaultCursorDriver 属性来确定 rdoEnvironment 对象缺省的 CursorDriver 值。这个属性确定 ODBC 驱动程序管理器是否创建客户批处理式的、本地的或服务器端的游标，或者是根本就无游标。

  • 使用 rdoDefaultUser 和 rdoDefaultPassword 属性来确定缺省的 rdoEnvironment 对象的 UserName 和 Password 属性。如果在打开连接时没有提供指定的内容，则由这两个属性来确定用户的名称和密码。

使用其它的 rdoEngine 属性和方法来工作

可以使用 rdoEngine 对象的方法和属性建立新的 rdoEnvironment 对象的缺省配置和新的 ODBC 数据源条目。例如，可以：

  • 使用 rdoEnvironments 集合来检查已经添加到该集合中的 rdoEnvironment 对象。注意 rdoEnvironment 对象可以被分配为独立对象。

  • 使用 rdoLocaleID 属性来确定加载哪一种本地化 语言的DLL。

  • 使用 Version 属性来检查正在使用中的 RDO 的版本。

  • 使用 rdoErrors 集合来检查有关由 ODBC 接口产生的错误的信息。Visual Basic 产生的错误保留在一个单独的 Errors 集合中。

  • 使用 rdoRegisterDataSource 方法在 Windows 系统注册(Windows System Registry)中创建一个新的数据源条目。

  • 使用 rdoCreateEnvironment 方法来创建一个新的 rdoEnvironment 对象。也可以用以下的代码来分配一个新的 rdoEnvironment 对象：
Dim MyEnv as New rdoEnvironment


rdoEngine 对象示例

该示例设置 rdoEngine 的许多属性，并且在这些新的缺省设置的基础上创建一个自定义的 rdoEnvironment 对象。注意：虽然程序代码可在 rdoEnvironment 对象中设置密码，但设置了密码之后，将不能读取它。

Dim en As rdoEnvironment
Private Sub Form_Load()
With rdoEngine
    .rdoDefaultLoginTimeout = 20
    .rdoDefaultCursorDriver = rdUseOdbc
    .rdoDefaultUser = "Fred"
    .rdoDefaultPassword = ""
End With
Set en = rdoEnvironments(0)
'
'   转储当前的 rdoEnvironments 集合，并在可能的地方
'  显示当前的属性。
'
For Each en In rdoEnvironments
    Debug.Print "LoginTimeout:" & en.LoginTimeout
    Debug.Print "CursorDriver:" & en.CursorDriver
    Debug.Print "User:" & en.UserName
   ' （只写） Debug.Print "Password:" & en.Password
Next
End Sub


rdoEnvironment 对象

rdoEnvironment 对象定义一个连接的逻辑集合，并为一个特殊的用户名定义事务作用域。它包括打开的和已分配但尚未打开的连接，为同步事务提供处理机制，还为数据库上的数据操作语言(DML)操作提供安全机制上下文。

说明

一般来说， rdoEnvironment 对象对应一个可由 rdoEnvironment 对象的 hEnv 属性来引用的 ODBC环境。然而，如果在使用 rdoCreateEnvironment 方法来创建 rdoEnvironment 对象时，未提供 Name 参数，那么所创建的独立 rdoEnvironment 就不会添加到 rdoEnvironments 集合中。除非指定为公用，独立 rdoEnvironment 对象不会遗弃给其它在处理中的 DLL。对任意专用的 rdoEnvironment，如果引用计数减至零，那么所有的与该 rdoEnvironment 相关的 rdoConnections 都将关闭。

一旦设置了 rdoEnvironment 对象的属性，就可以使用 Add 方法来把它添加到 rdoEnvironments 集合中或者使用 Remove 方法来分离并释放该对象。名称属性是只读的并由特定的远程数据对象确定。

当 RemoteData 控件初始化时，或者是在代码中引用第一个远程数据对象时，会自动创建缺省的 rdoEnvironment。rdoEnvironments(0)的 Name 属性为 Default_Environment。rdoEnvironments(0)的用户名和密码都为""。

rdoEnvironment 对象可以用 rdoEngine 对象的 rdoCreateEnvironment 方法来创建，且该方法能自动地将新创建的对象添加到 rdoEnvironments 集合中。对所有以这种方式创建的 rdoEnvironment 对象，将基于在 rdoEngine 对象中设置的缺省属性集进行赋值。

如果 OpenConnection 方法的 connect 参数中或者是RemoteData 控件的 Connect 属性中没有提供用户名和密码的值，那么 rdoEnvironment 中的用户名和密码信息将用来建立该连接。

所有的 rdoEnvironment 对象共享一个公共的 hEnv 值，该值是在应用程序中创建的。使用 rdoEnvironment 对象可以管理当前的 ODBC 环境，或者启动附加的连接。在一个 rdoEnvironment 中可以打开多个连接、管理事务、以及基于用户名和密码建立安全机制。例如，可以：

  • 创建 rdoEnvironment 对象，并使用 Name、Password 和 UserName 属性来建立一个已命名的且受密码保护的环境。在该环境创建的范围内，可以打开多个连接以及处理并列事务的一个示例。

  • 使用 CursorDriver 属性来确定使用哪一个游标驱动程序库来建立 rdoResultset 对象。可选择四种游标类型中的一种，或者将 CursorDriver 属性设置为 rdUseNone，以表明不使用游标来管理结果集。

  • 使用 OpenConnection 方法来打开 rdoEnvironment 中现存的一个或多个连接。

  • 使用 LoginTimeout 属性来确定 ODBC 驱动程序在放弃此连接企图之前将等待多长时间。

  • 使用 BeginTrans、CommitTrans 和 RollbackTrans 方法来管理在 rdoEnvironment 中的跨越几个连接的事务处理。

  • 要处理多重的、同时的、独立的和重叠的事务，需使用多个 rdoEnvironment 对象。

  • 使用 Close 方法来终止环境和连接，并从 rdoEnvironments 集合中删除 rdoEnvironment 对象。同时将关闭所有与该对象关联的连接。

管理事务

rdoEnvironment 也可以确定事务作用域。提交 rdoEnvironment 事务时，将提交所有打开的 rdoConnection 数据库以及它们所对应的打开的 rdoResultset 对象。这里并没有隐含两阶段提交操作，只是指令单个 rdoConnection 对象一次提交一个任何挂起的操作。

对于 Microsoft SQL 服务器数据库，通过简单的带 BEGIN DISTRIBUTED TRANSACTION 语句的 SQL 查询，分布式事务协调器（Distributed Transaction Coordinator (DTC) ）就可用来管理事务块。DTC 通过它自身的两阶段提交协议可以方便地创建网络范围的数据库更新。

无论 SQL 服务器何时提交一个事务，DTC 都会确保所有相关的资源也提交该事务。如果该事务的某一部分失败，DTC 将确保在所有在册的服务器上恢复整个事务。

在使用事务时，即使该 rdoEnvironment 中打开了几个 rdoConnection 对象，在这个指定的 rdoEnvironment 中的所有数据库也都将会受到影响。例如，假如对一个在该连接中可见的数据库使用 BeginTrans 方法，更新该数据库中的几行，然后又在另外一个 rdoConnection 对象的数据库中删除几行。当使用 RollbackTrans 方法时，这些更新和删除操作都会恢复。为了避免上述问题，可以通过 rdoConnection 对象创建附加的 rdoEnvironment 对象来管理事务。注意：由多个 rdoEnvironment 对象来执行的事务是串行的并且不是原子操作。因此，它们的成功与失败是相互独立的。这是一个批处理事务的示例。

仅当数据源支持嵌套的事务时，才能执行这些事务。例如，在单个连接上，可执行一个 BEGIN TRANS SQL 语句，执行几个 UPDATE 查询，再执行另外一个 BEGIN TRANS 语句。任何在第二个 BEGIN TRANS SQL 语句后执行的操作都可以恢复，而不依赖于在第一个 BEGIN TRANS SQL 语句后执行的语句。这是一个嵌套事务的示例。为了提交 UPDATE 语句的第一个集合，必须为每一个所执行的 BEGIN TRANS 执行一个 COMMIT TRANS 或 ROLLBACK TRANS语句。

rdoEnvironment 事件

在操作 rdoEnvironment 对象时，下列事件引发。这些事件可用于与 rdoEnvironment 相关联的宏观管理 RDO 事务，或使其它一些过程与该事务同步。

事件名称 | 描述
BeginTrans | 该事件是在 BeginTrans 方法完成之后引发。
CommitTrans | 该事件是在 CommitTrans 方法完成之后引发。
RollbackTrans | 该事件是在 RollbackTrans 方法完成之后引发。

对 rdoEnvironment 对象寻址

rdoEnvironment 对象的 Name 属性由传递给 rdoCreateEnvironment 方法的 name 参数来设置。可以通过指定它的 Name 属性设置来引用其它任何的 rdoEnvironment 对象，语法如下：

rdoEnvironments("MyEnvName")

或用简单的形式：

rdoEnvironments!MyEnvName

使用以下语法，可以用 rdoEnvironments 集合中 rdoEnvironment 对象的位置来引用它们（其中 n 为零基的 rdoEnvironments 集合中的第 n 个成员）：

rdoEngine.rdoEnvironments(n)

或用简单的形式：

rdoEnvironments(n)


rdoEnvironments 集合

rdoEnvironments 集合包含 rdoEngine 对象的所有活动的 rdoEnvironment 对象。

说明

用 rdoEnginegin 对象的 rdoCreateEnvironm方法可创建 rdoEnvironment 对象。除非在使用 doCreateEnvironment 方法时不给新创建的对象提供名称或仅在代码中简单地声明一个新的 rdoEnvironment 对象，否则新创建的 rdoEnvironment 对象将自动地添加到rdoEnvironmentsonm集合中。

rdoEnvironments 集合将以基于 rdoEngine 对象的缺省属性集的缺省rdoEnvironment 对象来自动地初始化。

如果对一个 rdoEnvironment 对象使用 Close 方法，则所有它所包含的 rdoConnections 都将关闭，并且将从 rdoEnvironments 集合中删除该对象。


rdoEnvironment 对象、rdoEnvironments 集合示例

以下示例列举 rdoEnvironment 对象的创建过程及其随后如何用它来打开一个 rdoConnection 对象。

Private Sub rdoEnvironmentButton_Click()
Dim en As rdoEnvironment
Dim cn As rdoConnection
Set en = rdoEngine.rdoEvironments(0)
With en
    en.CursorDriver = rdUseOdbc
    en.LoginTimeout = 5
    en.Name = "TransOp1"
    Set cn = en.OpenConnection(dsname:="", _
        prompt:=rdDriverNoPrompt, _
        Connect:="UID=;PWD=;" _
        driver={SQL Server};Server=SEQUEL;", _
        Options:=rdAsyncEnable)
End With
Print "Connecting ";
While cn.StillConnecting
    Print ".";
    DoEvents
Wend
Print "done."

End Sub


rdoError 对象

该对象包含关于远程数据访问错误的详细情况。

说明

任何涉及到远程数据对象的操作都可能产生一个或多个潜在的 ODBC 错误或信息性消息。当每一个错误发生或消息产生时，将会把一个（或多个） rdoError 对象放置到 rdoEngine 对象的 rdoErrors 集合中。当后继 RDO 操作产生错误时，将清除当前 rdoErrors 集合，并且把新的 rdoError 对象的集合放置到 rdoErrors 集合中。未产生错误的 RDO 操作对 rdoErrors 集合没有影响。为使得错误处理变得更为容易，可在操作之间使用 Clear 方法来清除 rdoErrors 集合。

一般来说，所有的 ODBC 错误都会产生一个某种类型的可捕获的 Visual Basic 错误。在检查最后那个操作所产生的任何或所有的错误时，这将成为检查 rdoErrors 集合的内容，提供有关该错误原因具体细节的线索。

并非所有的由 ODBC 所产生的错误都是致命性的。在正常的使用连接、缺省数据库、被保存的过程打印语句以及其它操作工作时，该远程服务器常常返回警告或消息，而忽略这些警告或消息通常是安全的。当一个信息性消息到达时，rdoEngine 的 InfoMessage 事件引发。在该事件过程中应当检查 rdoErrors 集合。

如果错误编号的严重性级别低于由 rdoDefaultErrorThreshold 或 ErrorThreshold 属性所指定的错误阈值，则当检测到错误时激发一个可捕获的错误。否则，仅有一个 rdoError 对象添加到 rdoErrors 集合中。为了控制 Microsoft SQL 服务器上的可捕获的错误，应该使用与一个适当的 Severity 参数相耦合的事务 SQL RAISERROR 语句来指明错误或者其它信息。

可使用 rdoError 对象来确定任何由 RemoteData 控件或 RDO 操作所产生的错误的类型及严重性级别。例如，可以：

  • 使用 Description 属性来显示描述该错误的一条文本信息。

  • 使用 Number 属性来确定本地数据源错误编号。

  • 使用 Source 属性来确定错误源和引起该错误的对象类。

  • 使用 SQLRetCode 和 SQLState 属性来确定 ODBC返回码和 SQLState 标志。

  • 使用 rdoErrors 集合上的 Clear 方法来删除所有的 rdoError 对象。因为当一个新的错误发生时，会自动地清除 rdoErrors 集合，所以在大多数情况下并不需要使用 Clear 方法。

添加 rdoErrors 集合的成员的情形不同于其它集合中的典型情况。最为一般的错误会放置到该集合(Count -1)的尾部，而最为详细的错误则会放置到索引 0 处。由于这种实现，往往可以通过检查 rdoErrors(0)来确定失败的根本原因。

rdoErrors 集合中的 rdoError 对象集合描述一个错误。第一个 rdoError 对象具有最低的错误级别，第二个为次低级，并依此类推。例如，当 RemoteData 控件在试图创建一个 rdoResultset 对象时产生了一个 ODBC 错误，最后的那个 rdoError 对象则包含了指明该对象不能打开的 RDO 错误。第一个错误对象包含了级别最低的 ODBC 错误。随后的错误包含了由 ODBC 各层所返回的 ODBC 错误。在这种情况下，驱动程序管理器，也可能是驱动程序本身，将返回产生 rdoError 对象的各个独立的错误。

也可用 rdoError 集合管理由数据资源返回的信息。例如，把 PRINT 语句返回的信息、展示计划的需求或 SQL 服务器中的 DBCC 操作都当作 rdoError 集合的 rdoError 对象返回。这种类型的信息使 InfoMessage 事件被启动，但不会导致可以捕获的错误。因此，必须检查 rdoError 集合的 Count 属性，查看是否造成新的错误。


rdoErrors 集合

该集合包含所有的与涉及远程数据对象(RDO)的单一操作有关的且已被保存的 rdoError 对象。

说明

任何涉及远程数据对象的操作都可能产生一个或多个错误。每当一个错误发生时，将会把一个或多个 rdoError 对象放置到 rdoEngine 对象的 rdoErrors 集合中。当另外一个 RDO 操作产生错误时，则会清除 rdoErrors 集合，并且把新的 rdoError 对象的集合放置到 rdoErrors 集合中。未产生错误的 RDO 操作对 rdoErrors 集合没有影响。

  • 可使用 rdoErrors 集合上的 Clear 方法来删除所有的 rdoError 对象。因为当一个新的错误发生时，会自动地清除 rdoErrors 集合，所以在大多数情况下并不需要使用 Clear 方法。

添加 rdoErrors 集合的成员的情形不同于其它集合中典型的情况。最为一般的错误会放置到该集合(Count -1)的尾部，而最为详细的错误则会放置到索引 0 处。由于这种实现，往往可以通过检查 rdoErrors(0)来确定失败的根本原因。

rdoErrors 集合中的 rdoError 对象集合描述一个错误。第一个 rdoError 对象具有最低的错误级别，第二个为次低级，并依此类推。例如，当 RemoteData 控件在试图创建一个 rdoResultset 对象时产生了一个 ODBC 错误，最后的 rdoError 对象则包含了指明该对象不能打开的 RDO 错误。第一个错误对象包含了最低级别的 ODBC 错误。随后的错误包含了由 ODBC 各层所返回的 ODBC 错误。在这种情况下，驱动程序管理器，也可能是驱动程序本身，将返回产生 rdoError 对象的各个独立的错误。


rdoError 对象、rdoErrors 集合示例

以下这段代码列举了一个简单的设计时 RDO 错误处理程序。注意：该处理程序只是在立即窗口中显示 rdoErrors 集合中的错误。

Dim er as rdoError
On Error GoTo CnEh
.
.
.

CnEh:
Dim er As rdoError
    Debug.Print Err, Error
    For Each er In rdoErrors
        Debug.Print er.Description, er.Number
    Next er
    Resume Next


远程数据对象和集合

远程数据对象和集合为使用代码来创建和操作一个远程 ODBC数据库系统的各个部件提供了一个框架。对象和集合都具有描述数据库的各个部件特征的属性以及用来操作这些部件的方法。使用包含框架，可以在对象和集合之间建立起关系，这些关系就代表了数据库系统的逻辑结构。

对象和集合提供了各种不同类型的包含关系：对象包含零个或多个不同类型的集合；而集合包含了零个或多个同一类型的对象。尽管对象和集合是相类似的实体，但它们之间的差异区分了这两类不同的关系。

注意 RDO仅被 32 位操作系统支持，如 Windows 95 和 Windows NT。要使用这种远程数据对象，必须在 Visual Basic“引用”对话框中设置对 Microsoft Remote Data Object 2.0 对象库的一个引用。

在下表中，第一栏中的集合类型包含第二栏中的对象类型。第三栏描述每一个对象类型所代表的内容。

集合 | 对象 | 描述
rdoConnections | rdoConnection | 打开的或已分配的连接。
无 | rdoEngine | 远程数据库引擎。
rdoErrors | rdoError | ODBC 错误的信息。
rdoEnvironments | rdoEnvironment | 具有普通用户名和密码的 rdoConnection 对象的逻辑集合。
rdoColumns rdoColumn 一列，是
rdoResultset 的一部分。
rdoParameters | rdoParameter | rdoQuery 或rdoPreparedStatement 的一个参数。
rdoPreparedStatements | rdoPreparedStatement | 一个被保存的查询定义（已经过时）。
rdoQueries | rdoQuery | 一个被保存的查询定义。
rdoResultsets | rdoResultset | 一个查询所产生的行。
rdoTables | rdoTable | 一个表定义。


rdoParameter 对象

rdoParameter 对象代表一个与 rdoQuery 对象关联的参数。

说明

当使用被保存的过程或 SQL 查询工作，且要求参数在执行之间做改变时，应当创建一个 rdoQuery 对象来管理该查询及其参数。例如，如果提交一个包含有用户提供的参数（如日期范围或成分编号）的信息的查询，RDO 和 ODBC 接口可以在该查询的某个具体位置上的 SQL 语句中自动地插入这些值。

提供参数

查询的参数可用多种方式来提供：

  • 作为 SQL 查询串中硬代码的参数。
    "Select Name from Animals Where ID = 'Cat'"
  • 作为从 TextBox，Label 或其它控件中抽取出来的已串接的文本或数字值。
    "Select Name from Animals Where ID = '"  _
& IDWanted.Text & "'"
  • 作为问号(?)参数保留区。
    "Select Name from Animals Where ID = ?"
  • 作为被保存的过程调用中的问号(?)参数占位符，它们可以接受输入、输出和/或返回状态参数。
    "{ ? = Call MySP (?, ?, ?) }"

注意 使用 Call 语法（如上所示）的被保存的过程调用，按其“本地”格式来执行，因此，它们不要求进行语法分析，也不要求 ODBC 驱动程序管理器来做数据转换。由于这个原因，Call 语法会比其它的语法执行得更快一些。

使用参数标记

仅当执行要求输入、输出或返回状态参数的被保存的过程时，才必须使用参数标记。如果被保存的过程仅要求输入参数，则这些参数可作为串接到查询中的嵌入值而在线提供（如下所示）。

当第一次引用 rdoParameter 集合时（不在引用之前），RDO 和 ODBC 接口将预处理此查询，并且为每一个被标记的参数创建一个 rdoParameter 对象。还可以用多个参数来创建查询，在这种情况下，可标记某些参数，而由硬代码或以任何组合方式的串接来提供其它的参数。但是，所有被标记的参数都必须出现在其它参数的左边。如果不这样，将会产生一个可捕获的错误指明“参数个数错误”。

注意 考虑到创建和管理 rdoQuery 对象及其 rdoParameters 集合时的额外系统开销，对那些在执行之间不变的 SQL 语句，尤其对那些仅执行一次或不常执行的，尽量不使用参数查询。

标记参数

每一个具有 RDO 管理的查询参数都必须由一个在 SQL 语句的文本中的问号(?)来指明，并对应于一个以零开始记数（从左到右）的顺序编号所引用的 rdoParameter 对象。例如，要执行一个有唯一输入参数的查询，SQL 语句必须象以下这样：

SQL$ = "Select Au_Lname, Au_Fname where Au_ID Like ? "
Dim qd as rdoQuery, rd as rdoResultset
Set qd = CreateQuery ("SeekAUID", SQL$)
qd(0) = "236-66-%"
set rd = qd.OpenResultset(rdOpenForwardOnly)

注意 也可以使用查询连接设计程序来创建一个 rdoQuery 对象，并为单个参数命名并设置数据类型和方向。

可接受的参数

并非所有的数据类型都可以作为参数来传递。例如，不能总是把文本(TEXT)和图象(IMAGE)数据类型作为输出(OUTPUT)参数。另外，如果查询不要求参数或者该查询的一个具体的调用中无参数，就不能在查询中使用括弧。例如，对一个不要求参数的被保存的过程编码如下：

"{ ? = Call MySP }"

当提交返回输出参数的查询时，这些参数必须在查询参数表的尾部提交。在可能提供被标记的和未被标记的（在线）参数时，输出参数仍必须出现在参数表的尾部。

所有提供的在线参数都必须在被标记的参数的右边。如果不是这种情况，RDO 将返回一个错误指明“参数个数错误”。

RDO 2.0 支持 BLOB 数据类型的参数，也可使用 rdoParameter 对象的 AppendChunk 方法把 TEXT 或 IMAGE 数据类型的参数传递给一个过程。

识别参数的数据类型

当 ODBC 处理参数查询时，它会通过执行向远程服务器查询有关该查询的指定信息的 ODBC 函数来试图识别每一个参数的数据类型。在一些情况下，数据类型不能正确地确定。此时，使用 Type 属性来设置正确的数据类型或使用连接用户设计程序创建一个自定义查询。

例如，在下列的查询中，传递给 TSQL Charindex 函数的参数的类型为整型。虽然这对该函数本身来说是正确的，但因为该参数引用 TSQL 函数的一个字符串参数，所以为了能正常工作，它必须设置为一个 ODBC 字符类型。

Dim SQL as string, qd as rdoQuery
SQL = "Select * From Titles " _
    & "Where Charindex( ?,  Title) > 0
Set qd = cn.CreateQuery("FindTitle", SQL)
qd(0).Type = rdTypeChar

注意 不必把文本参数用引号括起来，因为这是由 ODBC API 接口来自动进行处理的。

处理输出和返回状态参数

在一些情况下，被保存的过程返回一个输出或返回状态参数，替代或附加到

由 SELECT 语句返回的一些行。这些参数中的每一个也必须在该 SQL 语句中用一个问号来标记。使用这个办法，可以在包含输入、输出或输入/输出的 SQL 查询中标记任意个参数的位置。

无论何时，当查询返回输出或状态参数，在设置 rdoQuery 对象的 SQL 属性时，都必须使用 ODBC CALL 语法。在这种情况下，一个典型的被保存的过程调用形式如下：

Dim qd as rdoQuery, rd as rdoResultset, SQL as String
SQL = "{ ? = Call master..sp_password (?, ?) }"
Set qd = CreateQuery ("SetPassword", SQL)
qd.rdoParameters(0).Direction = rdParamReturnValue
qd(1) = "Fred"      ' 旧密码
qd(2) = "George"   ' 新密码
set rd = qd.Execute
if qd(0) <> 0 then _
   MsgBox "Operation failed"

提示 一定要专门指定没有驻留在当前（缺省）数据库中的被保存的过程的地址。在这个例子中，缺省的数据库不是保留 sp_password 过程的主数据库，所以必须专门指定这个过程的地址。

在该过程执行完毕，控制返回到应用程序中时，rdoParameter 对象被指定为 rdParamReturnValue、rdParamOutput 或 rdParamInputOutput，且包含返回的参数值。以上所示的示例中，在查询完成之后，通过检查 qd(0)，可以得到返回状态。

使用其它属性

使用 rdoParameter 对象的属性，可以设置在查询运行之前能改变的查询参数。可以：

  • 使用 Direction 属性设置来确定参数是否是一个输入、输出或输入/输出参数、或者是返回值。在 RDO 2.0 中，常常自动地设置 Direction 属性，所以不必设置这个值。也不必为是缺省值的输入参数设置这个值。

  • 使用 Type 属性设置来确定 rdoParameter 的数据类型。 数据类型与那些由 rdoColumn.Type 属性所指定的相同。在某些情况下， RDO 也许不能够确定正确的参数数据类型。在这些情况下，可以通过设置 Type 属性来强制为指定的数据类型。

  • 使用 Valu 属性（rdoParameter 的缺省属性）来向包含有在 rdoQuery .Execute 或 rdoQuery.OpenResultset 方法中使用的参数标记的 SQL查询传递值。例如：
    MyQuery(0) = 5

注意 RDO 要求 ODBC 驱动程序支持一些 Level II可塑的选项和 SQLNumParams、SQLProcedureColumns 和 SQLDescribeParam ODBC API 函数，这是为了能够创建 rdoParameters 集合和对 SQL 语句中的参数标记符做语法分析。虽然某些驱动程序可以用来创建和执行查询，但如果驱动程序不支持创建 rdoParameters 集合，RDO 将失败并且不创建这个集合。因此，任何对该集合的引用都将导致一个可捕获的错误。

对参数寻址

rdoParameters 集合成员的缺省名称为 Parametern（其中的 n 是 rdoParameter 对象的序号）。例如，如果一个 rdoParameters 集合有两个成员，它们就分别命名为 Parameter0 和 Parameter1。但是，如果使用连接用户设计程序(Connection Query Designer)，就可以将名称指定为指定参数。

因为 rdoParameters 集合是 rdoQuery 对象的缺省集合，所以对参数寻址是件容易的事。假定已经创建了一个由 rdoQo 引用的 rdoQuery 对象 ，就可以象下面这样来引用它的 rdoParameter 对象的 Value 属性 ：

  • 使用以下的语法来引用 Name 属性设置：
    ' 引用 PubDate 参数
rdoQo("PubDate")

    -或者-

    ' 引用 PubDate 参数
rdoQo!PubDate
  • 使用以下的语法来引用它在 rdoParameters 集合中的顺序位置：
    ' 引用第一个参数标记
rdoQo(0)


rdoParameters 集合

rdoParameters 集合包含 rdoQuery 对象的所有的 rdoParameter 对象。

说明

rdoParameters 集合仅提供有关 rdoQuery 对象或被保存的过程中的被标记的参数的信息。不能向 rdoParameters 集合中添加对象或从中删除对象。

当第一次引用 rdoParameter 集合时，RDO 和 ODBC 接口将对此查询进行语法分析，并搜寻参数标记 — 问号(?)。每找到一个标记，就创建一个 rdoParameter 对象，并把它放到 rdoParameters 集合中。然而，如果此查询不能被编译或不能用其它方法处理，将不能创建 rdoParameters 集合，而且代码将触发一个可捕获的错误，指明该对象不存在。在这种情况下，可以检查此查询中的错误语法、基本对象的权限以及参数标记放置的位置。


rdoParameter 对象、rdoParameters 集合、Direction 属性示例

这个示例对 SQL Server 'Pubs’ 数据库执行一个保存的过程。这个过程的文本也附在这里，这样你可以在你自己的机器安装这个示例。这个被保存的过程要求代码提供三个输入参数：一个用于表达式中选择标题的字符串，以及两个用来为这些书选择一个价格范围的数字。该过程返回在此价格范围内的书的本数，以及这些书的最高价格。它也返回一个行集，此集合中包含着有关这些书的详细信息。

为了建立连接，假定此服务器的名称为“SEQUEL”，它是一个 Microsoft SQL 服务器，这还是一个非 DSN 连接。接下来，使用 ODBC CALL 语法来准备查询。注意：每一个参数都用一个问号做了标记。一旦被做了标记，rdoParameters 集合就用来给输出和返回值参数设置方向，以及为输入参数设置初始值。虽然看不到此 rdoParameters 集合被指定调用，但要理解它是 rdoQuery 对象的缺省集合，由于不包含一个到 rdoParameters 集合自身的引用，所以引用变得更为简单。

Sub RunQuery_Click()
Dim rs As rdoResultset
Dim cn As New rdoConnection
Dim qd As New rdoQuery
Dim cl As rdoColumn
Const None As String = ""

cn.Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"
cn.CursorDriver = rdUseOdbc
cn.EstablishConnection rdDriverNoPrompt

Set qd.ActiveConnection = cn
qd.SQL = "{ ? = Call ShowOutputRS (?,?,?,?,?) }"
qd(0).Direction = rdParamReturnValue
qd(4).Direction = rdParamOutput
qd(5).Direction = rdParamOutput
qd(1) = "c"
qd(2) = 5
qd(3) = 50

Set rs = qd.OpenResultset(rdOpenForwardOnly, _
    rdConcurReadOnly)

For Each cl In rs.rdoColumns
    Debug.Print cl.Name,
Next
Debug.Print

Do Until rs.EOF
    For Each cl In rs.rdoColumns
        Debug.Print cl.Value,
    Next
    rs.MoveNext
Debug.Print
Loop

Debug.Print "Output from SP="; qd(3)
Debug.Print "Return Status from SP="; qd(0)

rs.Close
qd.Close
cn.Close

End Sub

以下是由上面所示的示例来执行的保存的过程。

CREATE PROCEDURE ShowOutputRS
(
   @Ser varChar(128),
   @PriceLow Integer,
   @PriceHigh Integer,
   @Hits Integer OUTPUT,
   @MaxPrice integer OUTPUT
)
AS
Select @MaxPrice = Max(Price) from Titles
where Charindex(@Ser, title) > 0
and price between @priceLow and @priceHigh

Select * from Titles
where Charindex(@Ser, title) > 0
and price between @priceLow and @PriceHigh

Select @Hits = @@RowCount

return @@ROWCOUNT


rdoPreparedStatement 对象

rdoPreparedStatement 对象是一个准备好的查询定义。

说明

注意 rdoPreparedStatement 对象已经过时，仅为向后兼容而保留它。它将被 rdoQuery 对象所替代。rdoQuery 对象支持 rdoPreparedStatement 对象的所有属性和方法。相比之下，rdoPreparedStatement 只是 rdoQuery 对象的属性和方法的一个子集且不包括其任一事件。


rdoPreparedStatements 集合

rdoPreparedStatements 集合包含 rdoConnection 中所有的 rdoPreparedStatement 对象。

说明

注意 rdoPreparedStatements 集合对象已经过时了，保留它仅是为了兼容。它将被 rdoQueries 集合所替代。rdoQuery 对象和 rdoQueries 集合支持 rdoPreparedStatement 对象的所有属性和方法。相比之下，rdoPreparedStatement 仅支持 rdoQuery 对象的属性和方法的子集且不支持其任一事件。

注意 RDO 要求 ODBC 驱动程序支持许多 Level II 选项和 SQLNumParams、SQLProcedureColumns 和 SQLDescribeParam ODBC API 函数，这是为了能够创建 rdoParameters 集合和对 SQL 语句中的参数标记符做语法分析，。虽然某些驱动程序可以用来创建和执行查询，但如果驱动程序不支持创建 rdoParameters 集合，RDO 将失败并且不创建这个集合。


rdoQueries 集合

该集合包含由 CreateQuery 方法自动地、或使用 Add 方法添加到 rdoQueries 集合中的 rdoQuery 对象。

说明

当使用 rdoConnection 对象的 CreateQuery 方法时，一个 rdoQuery 对象自动地添加到 rdoQueries 集合中。也可以对 rdoQueries 集合使用 Add 方法，以一个独立 rdoQuery 对象作为参数。

当对一个 rdoQuery 对象使用 Close 方法时，将从 rdoQueries 集合中删除它，但是该对象仍然保持实例化。通过重新设置 ActiveConnection 属性，可以把该 rdoQuery 对象与另外的连接关联起来，并使用 Add 方法把它添加到 rdoQueries 集合中。

一个 rdoQuery 对象在它与一个 rdoConnection 对象关联之前，或使用 Execute 或 OpenResultset 方法之前，它不必一定是 rdoQueries 集合的成员。


rdoQuery 对象

rdoQuery 对象是一个能包括零个或多个参数的查询定义。

说明

rdoQuery 对象用来管理那些要求使用输入、输出或输入/输出参数的 SQL 查询。rdoQuery 函数基本上与一个已编译的 SQL 语句相同。当使用被保存的过程或需要在执行之间改变参数的查询时，可以创建一个 rdoQuery 对象来管理查询参数。如果被保存的过程返回输出参数或一个返回值，或者希望使用 rdoParameter 对象来处理这些参数，就必须使用一个 rdoQuery 对象来管理它。例如，如果提交一个包含由用户提供的信息（如日期范围和成分编号）的查询，当执行该查询时，RDO 会把这些值自动地替换到 SQL 语句中。

注意 rdoQuery 对象取代了已经过时的 rdoPreparedStatement 对象。在其接口上，rdoQuery 对象保持与 rdoPreparedStatement 的一致。但是它增加了被保留进入一个 Visual Basic 工程的功能，允许在设计时来创建和操作它。此外，rdoQuery 对象可以是准备好的，也可以不是，这将允许选择该查询最合适的用法。

创建 rdoQuery 对象

为了创建 rdoQuery 对象，要使用 CreateQuery 方法，该方法把 rdoQuery 与某个指定的 rdoConnection 对象关联起来，并把 rdoQuery 添加到 rdoQueries 集合中。一旦创建了该 rdoQuery 对象，就必须使用 rdoParameters 集合来填写所要求的参数，然后再使用 OpenResultset 方法来从此查询创建结果集，或者如果该查询不返回行，则仅使用 Execute 方法来运行此查询。

也可以使用连接查询设计器 (CQD) 在工程中创建 rdoQuery 对象。CQD 接受 SQL 查询并允许为每一个参数指定数据类型。然后它在应用程序中插入合适的代码来遗弃这些过程，这十分象方法从该 rdoQuery 对象上分离。

注意 由于涉及在创建和管理 rdoQuery 对象和 rdoParameters 集合时的额外系统开销，所以尽量不对那些在执行之间不做改变的 SQL 语句使用参数查询，尤其是那些仅执行一次或不经常执行的语句。

独立 rdoQuery 对象

可使用如下的 Dim 语句来声明一个独立 rdoQuery 对象：

Dim MyQuery as New rdoQuery

独立 rdoQuery 对象不是赋值给一个具体的 rdoConnection 对象，所以在试图执行该查询之前必须设置 ActiveConnection 属性，或对它使用 OpenResultset 对象。CursorType 和 ErrorThreshold 属性设置为由rdoEngine 缺省设置所建立的缺省值。此外，除非使用 Add 方法，否则新的 rdoQuery 对象不会自动地添加到 rdoQueries 集合中。

例如，下列所示的代码创建一个 rdoQuery 对象，把它同一个连接关联起来，然后执行它。接着，此 rdoQuery 对象又与另外一个不同的连接关联，并再次执行。该查询对象将能封装各种类型的查询，可以对任何类型的连接执行它，提供对该连接来说是合适的 SQL 语句。

Dim MyQuery As rdoQuery '
MyQuery.SQL = "Update customers " _
   & " Set LastTouched = GetDate()"
MyQuery.Prepared = False    'Prepared 属性为假
                           '仅对 SQLExecDirect
'假定 cnSomeConnection
'是一个 rdoConnection 对象或独立对象。
MyQuery.ActiveConnection = cnSomeConnection
MyQuery.Execute

MyQuery.ActiveConnection = cnOtherConnection
' cnOtherConnection 超出了一个 WAN 的范围，所以增加
' 查询超时来补偿。
MYQuery.QueryTimeout = 120
MyQuery.Execute

选择正确的 SQL 语法

在编制 rdoQuery 对象的 SQL 属性的代码时，可在以下三种语法风格选择一种来编制参数查询的代码：

  • 被串接的字符串：使用 Visual Basic 串接操作符(&)来建立 SQL 语句的代码及其参数。该语句可传递给 OpenResultset 方法的 SQL 参数或 rdoQuery 对象的 SQL 属性。在这种情况下，一个参数查询可形如：
sSQL = "Select Name, Age From Animals " _
   & " Where Weight > " & WeightWanted.Text _
   & " and Type = ' & TypeWanted.Text & "'"
  • 本地 SQL 语法：远程服务器使用此 SQL 语法。在这种情况下，用户可执行自己的查询或被保存的过程，并通过串接或使用保留区、或者同时采用两种方法传递参数。用保留区做标记的参数被 RDO 当作 rdoParameter 对象来管理。其参数查询可形如：
    sSQL = "Select Au_LName from Authors" _
    & " Where Au_Fname = ?"

    - 或 -

    sSQL = "Execute MyStoredProc 'Arg1', 450, '"  _
    & Text1

    - 或 -

    sSQL = "Execute MyStoredProc ?, ?, ?"
  • ODBC CALL 语法：专门用来调用返回一个状态或输出参数的被保存的过程。在这种情况下，可为每一个自动地映射成的 rdoParameter 对象的输入、输出或输入/输出参数定义一个保留区。如需要，还可加入已串接的操作符。在这种情况下，参数查询可形如：
    sSQL = "{call ParameterTest (?,?,?) }"

    - 或-

sSQL = "{? = call ParameterTest (?,?,?) }"

- 或 -

sSQL = "{? = call CountAnimals (?, ?, 14, 'Pig')}

通过以下属性方法来管理该 rdoQuery 对象。

  • 使用 SQL属性来指定一个要执行的参数化的 SQL 语句。CreateQuery 方法的 name 参数也可以用来提供 SQL 查询字符串。

  • 使用 rdoQuery 对象的 rdoParameters 集合来设置查询参数。

  • 使用 Prepared 属性来指明是否将由 ODBC SQLPrepare 函数来准备 rdoQuery 对象。如果 Prepared 属性为 False，则使用 SQLExecDirect 函数来执行该查询。

  • 使用 Type 属性来确定该查询是否从现存的一个表（选定查询）中选择行、执行一个动作（一个动作查询）、包括动作和选择操作、或表示一个被保存的过程。

  • 使用 RowsetSize 属性设置来确定在建立一个游标及使用保守加锁来锁住时在内部要缓冲多少行。

  • 使用 KeysetSize 属性来指明创建游标时键集 缓冲区的大小。

  • 使用 MaxRows 属性来指明将由一个查询返回的最大的行号。

  • 使用 RowsAffected 属性来指明一个动作查询将影响多少行。

  • 使用 QueryTimeout 属性来指明在中止一个查询并引发 QueryTimeout 事件之前，驱动程序管理器需等待多久。

  • 使用 BindThreshold 属性来指明将被自动绑定的最大列。

  • 使用 ErrorThreshold 属性来指明构成一个可捕获错误的错误级别。

  • 使用 Updatable 属性查看是否可以更新由 rdoQuery 所产生的结果集。

  • 使用 OpenResultset 方法，创建一个基于 rdoQuery 的属性和 OpenResultset 参数的 rdoResultset。

  • 使用 Execute 方法，执行一个使用 SQL 和其它 rdoQuery 的属性（包括在 rdoParameters 集合中指定的任何值）的动作查询。

  • 使用 LogMessages 属性来激活 ODBC跟踪。

rdoQuery 对象事件

在操作 rdoQuery 对象时，会引发以下事件。这些事件可用来对与该 rdoQuery 相关联的查询进行宏观控制，或者对应用程序中的其它处理进行协调。

事件名称 | 描述
QueryComplete | 该事件是在查询完成时引发。
QueryTimeout | 该事件是在 QueryTimeout 周期已用完而查询还没有开始返回行时引发。
WillExecute | 该事件是在查询执行之前引发，这样可容许在最后一刻改变 SQL，或者禁止该查询执行。

关闭 rdoQuery 对象

可使用 Close 方法来关闭一个 rdoQuery 对象，把它的 ActiveConnection 属性设置为 Nothing，并把它从 rdoQueries 集合中删除。但是，通过把它的 ActiveConnection 属性设置成另外一个 rdoConnection 对象，仍然可以把此 rdoQuery 对象与另外一个 rdoConnection 对象重新关联起来。对将其 ActiveConnection 属性设置成 Nothing 的 rdoQuery 对象或无效的 rdoConnection 使用 Execute 或 OpenResultset 方法时，会引起一个可捕获的错误。

对 rdoQuery 对象寻址

rdoQuery 对象是将参数查询提交给外部服务器的首选方法。例如，可创建一个参数化的事务 SQL 查询（如同在 Microsoft SQL 服务器上所使用的）并且把它保存在一个 rdoQuery 对象中。

使用以下语法，由 rdoQuery 对象的 Name 属性来引用一个 rdoQuery 对象。因为 rdoParameters 集合是 rdoQuery 对象的缺省集合，所以所有对该 rdoQuery 对象不合格的引用都是引用 rdoParameters 集合。在这些例子中，假定已经创建了一个命名为“rdoQo”的using the syntax Dim rdoQo as rdoQueries rdoQuery 对象。前两个引用 rdoQuery 对象的例子命名为“MyQuery”。

rdoQo("MyQuery")

- 或 -

rdoQo!MyQuery

也可以使用以下语法由 rdoQuery 对象（和 rdoPreparedStatements 集合）在 rdoQueries 集合中的位置来引用它们（其中 n 为零基 rdoQueries 集合的第 n 个成员）：

rdoQo(n)


rdoQuery 对象、rdoQueries 集合示例

这个示例影响 RDO 设置查询的各个参数数据类型的能力。在这种情况下，CHARINDEX 函数参数作为参数来传送。因为 ODBC 驱动程序不能正确地识别这种数据类型，所以在给该参数赋值之前要把它转变成 CHAR 类型。该查询本身使用了 TSQL 语法，因此，当它不执行基于参数的被保存的进程时，不必使用 ODBC CALL 语法。这个示例还创建一个到 Microsoft SQL 服务器上的非 DSN 连接，并使用了示例 Pubs 数据库。

Private Sub Query1_Click()
Dim rs As rdoResultset
Dim cn As New rdoConnection
Dim qd As New rdoQuery
Dim cl As rdoColumn
Const None As String = ""

cn.Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"
cn.CursorDriver = rdUseOdbc
cn.EstablishConnection rdDriverNoPrompt

Set qd.ActiveConnection = cn
qd.SQL = "Select * From Titles" _
    & " Where CharIndex( ?, Title) > 0"

qd(0).Type = rdTypeCHAR
qd(0) = InputBox("Enter search string", , "C")

Set rs = qd.OpenResultset(rdOpenForwardOnly, rdConcurReadOnly)

For Each cl In rs.rdoColumns
    Debug.Print cl.Name,
Next
Debug.Print

Do Until rs.EOF
    For Each cl In rs.rdoColumns
        Debug.Print cl.Value,
    Next
    rs.MoveNext
Debug.Print
Loop
End Sub


rdoResultset 对象

rdoResultset 对象代表由正在执行的查询所产生的行。

说明

当使用远程数据对象时，几乎完全使用 rdoResultset 对象来同数据进行交互。rdoResultset 对象由RemoteData 控件创建，或者由 rdoQuery、rdoTable 或 rdoConnection 对象的 OpenResultset 方法来创建。

在执行包含一个或多个 SQL SELECT 语句的查询时，数据源在 rdoResultset 对象中返回零行或多行。所有的 rdoResultset 对象都使用行和列来构造。

单个 rdoResultset 可包含零个或任意多个结果集，即所谓的“多重”结果集。完成了处理 rdoResultset 对象中的第一个结果集后，使用 MoreResults 方法来遗弃当前的 rdoResultset 行，并激活下一个 rdoResultset。同处理第一个 rdoResultset 一样处理新的结果集的各行。可以重复这样做，直到 MoreResults 方法返回 False 为止。

当打开一个新的 rdoResultset 对象时，它将自动地添加到 rdoResultsets 集合中，而关闭它时则自动地删除。

注意 RDO 1.0 集合的特性与数据访问对象(DAO)集合不尽相同。当 Set（设置）一个包含某个 RDO 对象（如 rdoResultset ）的引用的变量时，现存的对象不会关闭，也不从关联的 rdoResultsets 集合中删除。现存对象保持打开状态，并且还是其对应的集合的一个成员。

相比而言，RDO 2.0 集合则不是这种特性。当使用设置(Set)语句来给一个包含有某个 RDO 对象的引用的变量赋值时，现存的对象关闭并且从关联的 rdoResultsets 集合中删除。这种改变是为了使 RDO 与 DAO 更好地兼容。

处理多重结果集

当执行包含多于一个 SELECT 语句的查询时，必须使用 MoreResults 方法来遗弃当前的 rdoResultset 各行，并激活随后的每一个 rdoResultset。必须在处理完并遗弃了 rdoResultset 的每一行之后，才能处理随后的结果集。为了处理结果集的行，可使用 Move 方法来定位到一行，或使用 MoveLast 方法来定位到该 rdoResultset 的最后那一行。可以对还没有完全被处理的 rdoResultset 对象使用 Cancel 方法或 Close 方法。

选择游标类型

可以对想使用 OpenResultset 方法的 type 参数来创建的 rdoResultset 对象的类型进行选择。对 RDO 来说，缺省的 Type 为 rdOpenForwardOnly，而对 RemoteData 控件来说，缺省的 Type 为 rdOpenKeyset。如果将 CursorDriver 属性指定为 rdUseNone，就创建了一个只能向前的只读结果集。每种类型的 rdoResultset 都能包含来自某个数据库中的一个或多个表的一些列。

基于所创建的用来访问数据的游标的类型，可以有四种 rdoResultset 对象：

  • 只能向前 —rdoResultset 类型－ 该结果集中的各行都可以被访问并能进行更新（当使用服务器端的游标时），但当前行指针只能使用 MoveNext 方法来朝着 rdoResultset 的尾部移动，除此之外不支持其它方法。

  • 静态类型 rdoResultset－ 是一个可用来查找数据或产生报表的行集的静态拷贝。当使用 ODBC游标库或服务器端的游标时，静态游标可能是可以被更新的，这取决于支持哪种驱动程序以及源数据是否可以被更新。

  • 键集类型 rdoResultset－ 是具有可更新的行的查询的结果。在键集中的移动是不受限制的。键集类型 rdoResultset 是一个动态的行集，可以用来给一个或几个基本数据库表添加、改变或删除行。键集类型 rdoResultset 的成员是固定的。

  • 动态类型 rdoResultset－ 是具有可更新的行的查询的结果。动态类型 rdoResultset 是一个动态的行集，可以用来给一个或几个基本表数据库添加、改变或删除行。键集类型 rdoResultset 的成员是不固定的。

解除 rdoResultset 对象的关联

在使用客户批处理游标库时，通过把 ActiveConnection 属性设置为Nothing，RDO 允许从用来移居它的行的 rdoConnection 对象上解除一个 rdoResultset 对象的连接。当连接解除后，rdoResultset 对象就变成某个本地游标的临时静态快照。它可以更新，还可以向这个 rdoResultset 中添加新的行以及从其中删除行。通过把 ActiveConnection 属性设置为另外一个（或同一个）rdoConnection 对象，可以重新关联。一旦重新连接之后，可以使用 BatchUpdate 方法使该 rdoResultset 和一个远程数据库同步。

要执行这种解除连接的更新操作，可使用 rdOpenStatic 游标来打开这个 rdoResultset，并把 rdConcurBatch 作为并发选项。

管理 rdoResultset 对象的属性和方法

可以使用 rdoResultset 对象的属性和方法来操作数据及定位一个结果集的各行。例如，可以：

  • 使用 Type 属性来指明所创建的 rdoResultset 的类型，并用 Updatable 属性来指明是否可以改变该对象的行。

  • 使用 BOF 和 EOF 属性来查看当前行指针定位是否超出了该 rdoResultset 的两端或者不包含行。

  • 使用 MoveNext 方法对只向前类型 rdoResultset 对象中的当前行重新定位。

  • 使用 Bookmarkable、Transactions 和 Restartable 属性来决定该 rdoResultset 是否支持书签或事务，或是否能够重启动。

  • 使用 LockEdits 属性来决定更新 rdoResultset 时所使用的锁定类型。

  • 使用 RowCount 属性来决定该 rdoResultset 中有多少行可以用。如果 RowCount 属性返回 -1，RDO 就不能决定有多少行已经处理过。只有为 EOF 时，RowCount 属性才反映出由查询所返回的行数。并非所有的游标类型都支持这个功能。如果 RowCount 属性不可用，则它返回 -1。

  • 使用 AddNew、Edit、Update 和 Delete 方法来添加新的行或修改可更新的 rdoResultset 对象。使用 CancelUpdate 方法来取消挂起的编辑。

  • 使用 Requery 方法来重新启动用来创建 rdoResultset 对象的查询。这个方法可用来重新执行一个参数化的查询。

  • 使用 MoreResults 方法来完成当前 rdoResultset 的处理，并开始处理下一个由某个查询所产生的结果集。当查询包含多于一个的 SQL 操作时，使用 Cancel 方法来终止对所有挂起的查询的处理。在对 rdoResultset 使用 Close 方法时，所有挂起的查询都将刷新，并且该 rdoResultset 将自动地从 rdoResultsets 集合中删除。

  • 使用 Close 方法来终止并重新分配该 rdoResultset，并从 rdoResultsets 集合中删除它。

rdoResultset 事件

在操作 rdoResultset 对象时，下列事件被引发。这些事件可用来对结果集进行宏观控制或使其它处理和在 rdoResultset 对象上执行的操作同步化。

事件名称 | 描述
Associate | 该事件是在一个新的连接与对象关联之后引发。
ResultsChange | 该事件是在当前行集改变（多重结果集）之后引发。
Dissociate | 该事件是在将连接设置为空之后引发。
QueryComplete | 该事件是在一个查询完成之后引发。
RowStatusChange | 该事件是在当前行状态（编辑、删除 、插入）发生改变之后引发。
RowCurrencyChange | 该事件是在当前行指针重定位之后引发。
WillAssociate | 该事件是在一个新的连接与对象发生关联之前引发。
WillDissociate | 该事件是在将连接设置为空之前引发。
WillUpdateRows | 该事件是在对服务器进行一次更新之前引发。

在一个连接上执行多重操作

如果一个未移居的 rdoResultset 正在一个数据源上挂起，且该数据源仅支持 rdoConnection 对象上的单个操作，那么除非该 rdoResultset 被刷新、关闭或完全移居，否则就不能创建另外的 rdoQuery 或 rdoResultset 对象，也不能在该 rdoTable 对象上使用 Refresh 方法。例如，当使用 SQL Server 4.2 作为数据源时，在移到当前 rdoResultset 对象最后的那一个结果集的最后一行之前，不能创建另外一个 rdoResultset 对象。为移居结果集，使用 MoreResults 方法来移动所有挂起的结果集，或在该 rdoResultset 上使用 Cancel 或 Close 方法来刷新所有挂起的结果集。

处理文件条件的开始和结束

在创建一个 rdoResultset 时，如果有一些行，则当前行定位到第一行。如果没有行，则 RowCount 属性设置为 0，并且 BOF 和 EOF 属性设置也都为 True。

注意 即使请求一个可更新的 rdoResultset，也可能不能更新 rdoResultset。如果基本的数据库、表或列是不可更新的，或者用户没有更新权限，则整个或部分 rdoResultset 可能是只读的。可以检查 rdoConnection、rdoResultset 和 rdoColumn 对象的 Updatable 属性来确定代码是否可以改变这些行。

关闭 rdoResultset 对象

使用 Close 方法来从 rdoResultsets 集合中删除一个 rdoResultset 对象，解除它的连接，并且释放所有关联的资源。当使用 Close 方法时，不引发任何事件。

把 ActiveConnection 属性设置为 Nothing 将会从 rdoResultsets 集合中删除 rdoResultset 对象，并引发事件，但并不释放该对象的资源。把 rdoResultset 对象的 ActiveConnection 属性设置为一个有效的 rdoConnection 对象，将会使该 rdoResultset 对象重新添加到该 rdoConnection 对象的 rdoResultsets 集合中。

对rdoResultset 对象寻址

rdoResultset 的缺省集合为 rdoColumns 集合，rdoColumn 对象的缺省属性为 Value 属性。可以利用这些缺省值来使代码简化。例如，以下所有的代码行都能设置一个 rdoResultset 当前行中 PubID 列的值：

MyRs.rdoColumns("PubID").Value = 99
MyRs("PubID") = 99
MyRs!PubID = 99
' 这是由 SELECT 语句
' 返回的第一列...
MyRs(0) = 99

rdoResultset 对象的 Name 属性包含用来创建该结果集的查询的头 255 个字符，所以它往往并不适合于作为 rdoResultsets 集合中的一个索引—尤其多个查询可能是由同一个 SQL 查询建立的。

使用以下语法，可以由 rdoResultset 对象在 rdoResultsets 集合中的位置来引用它们（其中 n 为零基 rdoResultsets 集合的第 n 个成员）：

rdoResultsets(n)


rdoResultset 对象、rdoResultsets 集合示例

下面的示例例举了一个多结果集查询的执行过程。虽然该查询使用了三个 SELECT 语句，但只有两个返回行到应用程序中。用来替代一个连接的子查询不会把行传递到该查询作用域之外。这也是一个简单参数查询的示例，该查询对参数做串接，而不是使用一个 rdoQuery 来管理该查询。这个 OpenResultset 也可异步地运行。这段代码通过轮询 StillExecuting 属性来检查该操作完成的情况。

Private Sub ShowResultset_Click()
Dim rs As rdoResultset
Dim cn As New rdoConnection
Dim cl As rdoColumn
Dim SQL As String
Const None As String = ""

cn.Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"

cn.CursorDriver = rdUseOdbc
cn.EstablishConnection rdDriverNoPrompt

SQL = "Select Au_Lname, Au_Fname" _
    & " From Authors A" _
    & " Where Au_ID in " _
    & " (Select Au_ID" _
    & "     from TitleAuthor TA, Titles T" _
    & "     Where TA.Au_ID = A.Au_ID" _
    & "     And TA.Title_ID = T.Title_ID " _
    & "     And T.Title Like '" _
    & InputBox("Enter search string", , "C") & "%')" _
    & "Select * From Titles Where price > 10"

Set rs = cn.OpenResultset(SQL, rdOpenKeyset, _
    rdConcurReadOnly, rdAsyncEnable + rdExecDirect)

Debug.Print "Executing ";
While rs.StillExecuting
    Debug.Print ".";
    DoEvents
Wend

Do
    Debug.Print String(50, "-")  _
   & "Processing Result Set " & String(50, "-")
    For Each cl In rs.rdoColumns
        Debug.Print cl.Name,
    Next
    Debug.Print

    Do Until rs.EOF
        For Each cl In rs.rdoColumns
            Debug.Print cl.Value,
        Next
        rs.MoveNext
    Debug.Print
    Loop
    Debug.Print "Row count="; rs.RowCount

Loop Until rs.MoreResults = False
End Sub


rdoResultsets 集合

rdoResultsets 集合包含一个 rdoConnection 中所有打开的 rdoResultset 对象。

说明

打开 rdoResultset 对象时，将向 rdoResultsets 集合中自动地添加一个新的 rdoResultset，而在关闭此对象时，从 rdoResultsets 集合中自动地删除它。在任何时候，都可能有几个活动的 rdoResultset 对象。

使用 Close 方法从 rdoResultsets 集合中删除一个 rdoResultset 对象，解除和它相连的连接，并释放所有关联的资源。当使用 Close 方法时，不引发任何事件。

把 ActiveConnection 属性设置为 Nothing 将会从 rdoResultsets 集合中删除 rdoResultset 对象，并引发事件，但并不释放该对象的资源。把 rdoResultset 对象的 ActiveConnection 属性设置为一个有效的 rdoConnection 对象时，将会使该 rdoResultset 对象重新添加到该 rdoConnection 对象的 rdoResultsets 集合中。

注意 RDO 1.0 集合的特性与数据访问对象(DAO)集合不尽相同。当 Set 一个包含某个 RDO 对象（如 rdoResultset）的引用的变量时，现存的对象不关闭，也不从关联的 rdoResultsets 集合上删除。现存对象保持打开状态，并且还是其对应的集合的一个成员。

相比而言，RDO 2.0 集合则不是这种特性。当使用设置(Set)语句来给一个包含有某个 RDO 对象的引用的变量赋值时，现存的对象关闭并且从关联的 rdoResultsets 集合中删除。这种改变是为了使 RDO 更好地与 DAO 兼容。

管理 rdoResultsets 集合

在对一个 rdoConnection 或 rdoQuery 使用 OpenResultset 方法，并把结果赋给一个现存的 rdoResultset 对象时，现存的对象会被保留，并把一个新的 rdoResultset 对象添加到 rdoResultsets 集合中。当使用 Microsoft Jet 数据库引擎和数据访问对象(Data Access Object (DAO))来执行相似的操作时，在该变量赋值之后，现存的记录集对象将自动关闭，不会存在具有同一名称的两个 Recordsets 集合成员。例如，使用 RDO：

Dim rs as rdoResultset
Dim cn as rdoConnection
Set cn = OpenConnection....
Set rs = cn.OpenResultset("Select * from Authors", _
    rdOpenStatic)
Set rs = cn.OpenResultset("Select * from Titles", _
    rdOpenDynamic)

这段代码打开两个独立的 rdoResultset 对象；这两个对象都保存在 rdoResultsets 集合中。运行完这段代码后，保存在 rdoResultsets(1)中的第二个查询赋值给 rdoResultset 变量 rs。第一个查询仍然可用，而且通过引用 rdoResultsets(0)，还可以使用它的游标。由于这种实现，rdoResultsets 集合中可以有多于一个的成员具有相同的名称。

这允许把现存的 rdoResultset 对象保留起来，将它们保留在 rdoResultsets 集合中，或在需要时把它们关闭。换句话说，必须显式地关闭任何不再需要的 rdoResultset 对象。简单地把另外一个 rdoResultset 赋值给 rdoResultset 类型的变量时，将不会对现存的、以前被该变量引用过的 rdoResultset 产生影响。注意：只要该 rdoResultset 保持打开，则为了管理该 rdoResultset 而创建的过程和其它的临时对象都将被保留在远程服务器上。

如果编写一个应用程序，该应用程序在打开附加的 rdoResultset 对象之前不关闭每一个 rdoResultset，则每次打开另外一个 rdoResultset 对象时，保留在 TempDB 中或服务器上的其它地方的过程的个数就加一。此外，这些结果集可能会要求重要的客户或服务器资源来保存键集或行的值。多次之后，这种行为可能会使该服务器的能力或工作站的资源溢出。


rdoTable 对象

rdoTable 对象表示基本表或 SQL 视图的被保存的定义。

说明

注意 不鼓励使用 rdoTable 对象和 rdoTables 集合来管理或检查数据库表的结构。这个对象是为了向后兼容而保留的，可能在将来的 Visual Basic 或 RDO 版本中将不再支持它。

可以使用一个 rdoTable 对象来映射一个表定义，并使用这个 rdoTable 对象的方法和属性来确定它的特征。例如，可以：

  • 检查一个 ODBC数据库中的任何表的列属性（注意：所有的 rdoTable 对象的属性都为只读）。

  • 使用 OpenResultset 来创建一个基于基本表的所有行的 rdoResultset 对象。

  • 使用 Name 属性来确定表或视图的名称。

  • 使用 RowCount 属性来确定表或视图中行的个数。引用这个 RowCount 属性会引起查询的完成，就如同已经使用了 MoveLast 方法一样。

  • 使用 Type 属性来确定表的类型。ODBC 数据源驱动程序决定所支持的表的类型。

  • 使用 Updatable 属性来确定表是否支持对其数据进行改变。

在移居 rdoTables 集合之前，不能引用这个 rdoTable 对象，因为当连接到一个数据源时，它不会自动地移居。为移居这个 rdoTables 集合，使用 Refresh 方法或由该集合各个成员的序号来引用它们。

当对一个 rdoTable 对象使用 OpenResultset 方法时，RDO执行返回一个表的所有行的“SELECT * FROM table”的一个查询，这个表是由游标类型指定的。在缺省情况下，将创建一个只能向前的游标。

不能使用 RDO 或RemoteData 控件来定义新的表或改变现存的表的结构。为了改变一个数据库的结构，或执行其它管理性功能，可使用 SQL查询或使用同数据库一起提供的管理性工具。

rdoTable 对象的缺省集合是 rdoColumns 集合，而rdoTable 的缺省属性是 Name 属性。通过使用这些缺省值，可以简化编码。例如，在这一点上下列两个语句是相同的—即它们都使用一个RemoteData 控件来打印与一个 rdoTable 中的一列的列数据类型相对应的编号：

Print RemoteData1.Connection.rdoTables _
   ("Publishers").rdoColumns("PubID").Type
Print RemoteData1.Connection("Publishers"). _
   ("PubID").Type

rdoTable 对象的 Name 属性同它所赋值的对象变量的名称（由该数据库中的基本表的名称派生出来）不一样。

使用以下语法，可以由 rdoTable 对象的 Name 属性设置来引用它：

rdoTables("Authors")   '引用“Authors”表

- 或-

rdoTables!Authors      '引用“Authors”表

使用以下语法，也可以由 rdoTable 对象在 rdoTables 集合中的位置来引用它们（其中 n 为零基 rdoTables 集合的第 n 个成员）：

rdoTables(n)


rdoTables 集合

rdoTables 集合包含一个数据库中所有的被保存的 rdoTable 对象。

说明

注意 不鼓励使用 rdoTable 对象和 rdoTables 集合来管理或查看数据库表的结构。这个对象是为了向后兼容而保留的，可能在将来的 Visual Basic 版本中不再支持它。

由于性能的原因，在首次移居 rdoTables 集合中之前，不能引用一个 rdoTable 对象，因为当连接到一个数据源时，它不会自动地移居。为移居该 rdoTables 集合，可使用 Refresh 方法或由该集合成员的序号来引用它们。这取决于数据库中表的数目的多少，可能要花上一些时间。


AbsolutePosition 属性（远程数据）

返回或设置 rdoResultset 对象的当前行的绝对行号。

语法

object.AbsolutePosition [= value]

AbsolutePosition 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 长数据类型值，其范围从 -1 到 rdoResultset 中的最大行号 。与由 object 指定的 rdoResultset 中的当前行的顺序位置对应。缺省值是 -1。

说明

使用 AbsolutePosition 属性将当前行指针定位到一个特定行，该行以其在 rdoResultset 中的有序位置为准，rdoResultset 为键集类型，或静态类型。不支持动态类型或仅向前类型的 rdoResultset 对象。当为动态游标返回一个值时，该值不必很准确。一般来说，在支持 AbsolutePosition 值之前，rdoResultset 对象的 Bookmarkable 属性必须为 True 。

也可以通过检查 AbsolutePosition 属性的设置值，确定当前行号。例如，在 50 行的 rdoResultset 中移动了 10 行， AbsolutePosition 属性返回 10 。对该结果集执行 MoveLast 方法后， AbsolutePosition 返回 50。 然后设置 AbsolutePosition 属性为 1 和 50 之间的任意值，将当前行指针定位到那行。

AbsolutePosition 属性的值是基于 -1 ，因此，设置为1即是指 rdoResultset 中的第一行。如果设置一个大于移居行数的值，会造成 RDO 定位到结果集的最后一行 (EOF)。

如果没有当前行，比如当 rdoResultset 中一行也没有时，就返回-1。如果当前行被删除， AbsolutePosition 属性值就没有定义，再引用该属性值会产生一个可以捕获的错误。如果游标的类型包括动态成员，将新行添加到序列的尾部。

注意 该属性不是打算用来代替行号的。建议仍使用书签方法保留及返回游标给定的位置。而且，如果重新创建 rdoResultset，由于在执行过程中 rdoResultset 中各行的顺序和成员会发生变化，所以给定的行会有相同的绝对位置，因此也是不可靠的。


AbsolutePosition 属性示例

下面的例子使用 SQL Server Pubs 数据库，说明如何使用 AbsolutePosition 属性作为一组行的次级字母索引。该程序一开始就将所有出版人的姓名和 ID 号取到下拉 ComboBox 控件。并且当从 ComboBox 中选取一个特定的出版人时，就从题目表取得这个出版人的标题集。使用连接方法创建一个查询并为这个查询设置 RemoteData 控件的 SQL 属性，可实现以上要求。DataGrid 控件被绑定到 RemoteData 控件，因此，它反映的是基于所选的出版人的当前标题集。在移居该结果集的过程中，每个标题的第一个字母和该行的 AbsolutePosition 值一起被放在一个数组中。当选取一个字母并且单击 MoveToRow 按钮时，该 RemoteData 控件的 AbsolutePosition 属性就置成与那个字母关联的值。

Dim cn As rdoConnection
Dim en As rdoEnvironment
Dim rs As rdoResultset
Dim LetterIndex() As Long

Private Sub Form_Load()
Dim Li As Integer
'
'   打开该连接。这是一个无 DSN 的连接
'
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsName:="", _
    Prompt:=rdDriverNoPrompt, _
    Connect:="uid=;pwd=;driver={SQL Server};" _
        & "server=SEQUEL;database=pubs;")

MsRdc1.Connect = cn.Connect

'
'   填写出版人列表组合框。
'
Set rs = cn.OpenResultset _
    ("Select distinct Pub_Name, Pub_ID" _
   & " from Publishers",  _
   rdOpenStatic, rdConcurReadOnly)
Do Until rs.EOF
    If rs(0) = Null Then
    Else
        PubList.AddItem " " _
         & rs!Pub_ID & ":" & rs!Pub_Name
    End If
    rs.MoveNext
Loop
PubList.ListIndex = 1
rs.Close

PubList_Click ' 构造第一个查询

End Sub

Sub GetLetterIndexes()
'
'   为标题列表中第一次出现的一个字母建造一个索引数组。
'   为每个字母保存一个 AbsolutePosition。

ReDim LetterIndex(122) As Long
Screen.MousePointer = vbHourglass

Set rs = MsRdc1.Resultset
Do Until rs.EOF
    Li = Convert(Left$(rs!Title, 1))
    If LetterIndex(Li) = 0 Then
        LetterIndex(Li) = rs.AbsolutePosition
    End If
    rs.MoveNext
Loop

Screen.MousePointer = vbDefault
End Sub
'
'   将 RemoteData 控件的 rdoResultset 定位到基于 AbsolutePosition 的所选字母的第一行。
'
Private Sub MoveToRow_Click()
Dim i
i = Convert(LetterWanted)
If LetterIndex(i) > 0 Then
    MsRdc1.Resultset.AbsolutePosition = LetterIndex(i)
Else
    LetterWanted = "(Not Found)"
    Beep
    For i = i + 1 To Asc("z")
        If LetterIndex(i) > 0 Then
            MsRdc1.Resultset.AbsolutePosition = _                   LetterIndex(i)
            LetterWanted = Chr(i + 64)
            Exit For
        End If
    Next i
End If
End Sub

Private Function Convert(Li As String) As Integer
Dim i As Integer
i = Asc(Li) ' 只引用第一个字母
Select Case i
    Case Is < 65: Convert = 0
    Case Is > 122: Convert = 58
    Case Else: Convert = i - 64
End Select
End Function
'
'   为这个出版人取得标题列表
'
Private Sub PubList_Click()
Dim PubWanted As String
'   逐个挑选 PUB_ID
'
'   构造基于所选的出版人的 SQL 查询
'
PubWanted = Trim(Left(PubList,
   InStr(PubList, ":") - 1))
Screen.MousePointer = vbHourglass

MsRdc1.SQL = "select * from Titles" _
    & " where Pub_ID = '" _
    & PubWanted & "'" _
    & " order by Title"
MsRdc1.Refresh
Screen.MousePointer = vbDefault
If MsRdc1.Resultset.EOF Then
    MoveToRow.Enabled = False
Else
    MoveToRow.Enabled = True
    GetLetterIndexes
    MsRdc1.Resultset.MoveFirst
End If
End Sub


ActiveConnection 属性

返回或设置一个对象引用，用以指示与本查询相关的连接。

语法

object.ActiveConnection [= value]

ActiveConnection 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 表达式，其值是一个有效的 rdoConnection 或派生的对象。Value 缺省为用于创建对象的 rdoConnection 或 Nothing。

说明

ActiveConnection 属性保存着与 rdoQuery 或 rdoResultset 对象相关连接的引用。由该对象执行的所有数据库语句都依靠该连接执行。

当与 rdoQuery 对象一起工作时，ActiveConnection 属性可被设为 Nothing，将该对象与指定的连接分开。随后可以通过设置 ActiveConnection 对象，将 rdoQuery 对象与另一个 rdoConnection 对象重新关联。使用这个技术，可对一组连接执行查询。

当与 rdoResultset 对象及客户批游标库一起工作时，可以设置 ActiveConnection 属性为 Nothing。在这种情况下，如果结果集被创建为静态游标和 rdConcurBatch 并发选项，rdoResultset 数据仍然可用，并且可以对该结果集任意改变或添加。一旦设置 ActiveConnection 为一个开放的 rdoConnection 对象，可以使用 BatchUpdate 方法，将这些改变传递到远程数据库。


ActiveConnection 属性示例

下例是说明使用 ActiveConnection 属性选择一个 rdoConnection。在这种情况下，应用程序打开两个独立的连接，并对每个连接使用同一个 rdoQuery。

Dim rdoCn As New rdoConnection
Dim rdoCn2 As New rdoConnection
Dim rdoQy As New rdoQuery
Dim rdoRs As rdoResultset
Dim rdoCol As rdoColumn
Dim rdoEn As rdoEnvironment

Private Sub Form_Load()
On Error GoTo CnEh

Set rdoEn = rdoEnvironments(0)

With rdoCn

    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=Betav486;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .EstablishConnection rdDriverNoPrompt, True
    rdoEn.rdoConnections.Add rdoCn
End With

With rdoCn2
    .Connect = "UID=;PWD=;Database=Pubs;" _
        & "Server=Betav486;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .EstablishConnection rdDriverNoPrompt, True
    rdoEn.rdoConnections.Add rdoCn2
End With

With rdoQy
    Set .ActiveConnection = rdoCn
    .SQL = "Select Name, refDate " _
      & " from Sysobjects where type = 'U' "
    .LockType = rdConcurReadOnly
    .RowsetSize = 1
    .CursorType = rdUseServer
End With

For Each rdoCn In rdoEn.rdoConnections
    Set rdoQy.ActiveConnection = rdoCn
    Set rdoRs = rdoQy.OpenResultset(rdOpenForwardOnly)
    With rdoRs
        For Each rdoCol In rdoRs.rdoColumns
            Debug.Print rdoCol.Name,
        Next
        Debug.Print
        Do Until rdoRs.EOF
                For Each rdoCol In rdoRs.rdoColumns
                    Debug.Print rdoCol
                Next
            rdoRs.MoveNext
        Loop
    End With
Next                    '下一个连接

Exit Sub
CnEh:
Dim er As rdoError
    Debug.Print Err, Error
    For Each er In rdoErrors
        Debug.Print er.Description, er.Number
    Next er
    Resume Next
End Sub


AddNew、Update、CancelUpdate 方法示例

下面的示例用以说明使用 AddNew 方法在基本表中添加一个新行。该例假定有权对这个表进行读写访问，所提供的列数据符合与该表相关的规则及其它的约束条件，并且该表有唯一的索引。用于操作的数据值从窗体的三个 TextBox 控件中获得。注意这个表的唯一的关键字不在这儿提供，而自动提供的是—一个标识列。

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn

Private Sub AddNewJob_Click()
On Error GoTo ANEH

With rs
   .AddNew
   !job_desc = JobDescription
   !min_lvl = MinLevel
   !max_lvl = MaxLevel
   .Update
End With
Exit Sub

UpdateFailed:
MsgBox "Update did not suceed."
rs.CancelUpdate
Exit Sub
A
NEH:
Debug.Print Err, Error
For Each er In rdoErrors
   Debug.Print er
Next
Resume UpdateFailed

End Sub

Private Sub Form_Load()

cn.CursorDriver = rdUseOdbc
cn.Connect = "uid=;pwd=;server=sequel;" _
   & "driver={SQL Server};database=pubs;dsn='';"
cn.EstablishConnection
With qy
   .Name = "JobsQuery"
   .SQL = "Select * from Jobs"
   .RowsetSize = 1
   Set .ActiveConnection = cn
   Set rs = .OpenResultset(rdOpenKeyset, _
      rdConcurRowver)
   Debug.Print rs.Updatable
End With

Exit Sub
End Sub


AllowZeroLength 属性（远程数据）

返回一个值，用以指示零长度字符串 ("")是否是 rdoColumn 对象的 Value 属性的一个有效设置，其数据类型为 rdTypeCHAR、rdTypeVARCHAR 或 rdTypeLONGVARCHAR。

语法

object.AllowZeroLength

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

AllowZeroLength 属性的返回值是：

值 | 描述
True | 零长度的字符串是有效值。
False | 零长度的字符串不是有效值。

说明

如果某列的 AllowZeroLength 为 False ，则必须使用 Null 表示"未知" 状态 － 而不能使用空字符串。


AppendChunk、GetChunk 方法示例

下面示例说明使用 AppendChunk 和 GetChunk 方法将基于数据页的、大的二进制对象 (BLOB) 数据写入远程数据源。这段代码需要一个名为 Chunks 的表，表中带有字符、文本、以及图象域。为了建立该表，提出如下代码作为对测试数据库的查询操作：

CREATE TABLE Chunks (ID integer identity NOT NULL, PName char(10) NULL,
Description TEXT NULL,
Photo IMAGE NULL)
CREATE UNIQUE INDEX ChunkIDIndex on Chunks(ID)

一旦建立了该表，就需要一个或多个 .BMP 或其它合适的、可由 PictureBox 控件定位装入的图形图象。

'
Option Explicit
Dim en As rdoEnvironment
Dim Qd As rdoQuery
Dim Cn As rdoConnection
Dim Rs As rdoResultset
Dim SQL As String
Dim DataFile As Integer, Fl As Long, Chunks As Integer
Dim Fragment As Integer, Chunk() As Byte, I As Integer
Const ChunkSize As Integer = 16384

Private Sub Form_Load()
Set en = rdoEnvironments(0)
Set Cn = en.OpenConnection(dsname:="", _
Connect:="UID=;PWD=;DATABASE=WorkDB;" _
& ""Driver={SQL Server};SERVER=Betav486", _
prompt:=rdDriverNoPrompt)
Set Qd = Cn.CreateQuery("TestChunk", "Select * from
   Chunks Where PName = ?")
End Sub
Private Sub LoadFromFile_Click()
'
'  将文件定位并为该文件设置文件名。
'
With CommonDialog1
   .Filter = "Pictures(*.bmp;*.ico)|*.bmp;*.ico"
   .ShowOpen
   FileName = .FileName
End With
End Sub

Private Sub ReadFromDB_Click()
If Len(NameWanted) = 0 Then _
   NameWanted = InputBox("Enter name wanted", "Animal")
   Qd(0) = NameWanted
   Set Rs = Qd.OpenResultset(rdOpenKeyset,
   rdConcurRowver)
If Rs Is Nothing Or Rs.Updatable = False Then
MsgBox "Can't open or write to result set"
Exit Sub
End If
If Rs.EOF Then
MsgBox "Can't find picture by that name"
Exit Sub
End If
Description = Rs!Description
DataFile = 1
Open "pictemp" For Binary Access Write As DataFile
Fl = Rs!Photo.ColumnSize
Chunks = Fl \ ChunkSize
Fragment = Fl Mod ChunkSize
ReDim Chunk(Fragment)
Chunk() = Rs!Photo.GetChunk(Fragment)
Put DataFile, , Chunk()
For I = 1 To Chunks
ReDim Buffer(ChunkSize)
Chunk() = Rs!Photo.GetChunk(ChunkSize)
Put DataFile, , Chunk()
Next I
Close DataFile
FileName = "pictemp"
End Sub

Private Sub SaveToDB_Click()
If Len(NameWanted) = 0 Then _
NameWanted = InputBox("Enter name for this" _
& " picture", "Animal")
Qd(0) = NameWanted
Set Rs = Qd.OpenResultset(rdOpenKeyset, _
rdConcurRowver)
If Rs Is Nothing Or Rs.Updatable = False Then
MsgBox "Can't open or write to result set"
Exit Sub
End If
If Rs.EOF Then
Rs.AddNew
Rs!PName = NameWanted
If Description = "" Then  _
Description = InputBox("Describe the picture", _
"Don't care")
'Rs!Description = Description
Else
Rs.Edit
End If
DataFile = 1
Open FileName For Binary Access Read As DataFile
Fl = LOF(DataFile)    ' 文件中数据的长度
If Fl = 0 Then Close DataFile: Exit Sub
Chunks = Fl \ ChunkSize
Fragment = Fl Mod ChunkSize
Rs!Photo.AppendChunk Null
ReDim Chunk(Fragment)
Get DataFile, , Chunk()
Rs!Photo.AppendChunk Chunk()
ReDim Chunk(ChunkSize)
For I = 1 To Chunks
Get DataFile, , Chunk()
Rs!Photo.AppendChunk Chunk()
Next I
Close DataFile
Rs.Update
End Sub

Private Sub FileName_Change()
Picture1.Picture = LoadPicture(FileName)
End Sub


AsyncCheckInterval 属性（远程数据）

返回或设置一个指定毫秒数的值，该值为 RDO 等待查看异步 查询是否完成的时间间隔。

语法

object.AsyncCheckInterval [= value]

AsyncCheckInterval 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 长表达式，如“说明”中所述。

说明

当使用 rdAsyncEnable 选项异步地执行一个查询时，RDO 定期地轮询数据源，以确定该查询是否已经完成。可以使用 AsyncCheckInterval 属性改变检查之间的这个持续时间。如果检查 StillExecuting 属性，RDO 也检查异步查询的状态。

AsyncCheckInterval 属性的缺省值是 1000 毫秒(一次一秒)。

频繁轮询反而会影响服务器和工作站的性能。适度的轮询可以提高性能，但也许又会影响快速数据对用户的可用性。

只要执行异步查询， StillExecuting 属性就返回 True。一旦该查询完成， StillExecuting 属性就设为假， 并引发 QueryComplete 事件。使用 rdoResultset 对象的 Cancel 或 Close 方法可以中断或结束异步查询。


Attributes 属性（远程数据）

返回一个值，用以指示 rdoColumn 对象的一个或多个特性。

语法

object.Attributes

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Attributes 属性的返回值，用以指定由 rdoColumn 对象表示的列的特性，并且可以是以下这些常数之和：

常数 | 值 | 描述
rdFixedColumn | 1 | 列的大小是固定的。（是数字列的缺省值）例如，Char， Binary。
rdVariableColumn | 2 | 列的大小是可变的。例如，VarChar 和 LongVarChar， VarBinary 和 LongVarBinary 列。
rdAutoIncrColumn | 16 | 新行的列的值自动增加到唯一的值，该值是不可改变的。
rdUpdatableColumn | 32 | 列的值可以改变。
rdTimeStampColumn | 64 | 列是一个时间标记值。该属性只用于设置 rdClientBatch 游标。

说明

当检查该属性的设置时，应使用 And 运算符测试指定的属性。使用绝对值测试会影响将来的兼容性。例如，为了确定 rdoColumn 对象是否是固定大小的，可以如下编程：

If MyResultset![ColumnName].Attributes And rdFixedColumn Then...


BatchCollisionCount 属性

返回一个指示在上一个批模式更新时未完成的行数值。

语法

object.BatchCollisionCount

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

BatchCollisionCount 属性的返回值是一个 Long 表达式，指示失败行的个数，如果所有的行都已被处理，则为 0 。

说明

该属性指示在上一个批更新操作中共有多少行遇到冲突或不能更新。该属性的值与 BatchCollisionRows 数组中的书签的个数对应。.

将工作的 rdoResultset 对象的 Bookmark 属性设置为 BatchCollisionRows 数组中的书签值，可以定位最近的 BatchUpdate 操作未完成的每一行。

更正冲突行后，可以再次调用 BatchUpdate 方法。这时， RDO 试图执行另一个批更新，而 BatchCollisionRows 属性将反映第二次未完成行的行集合。上次已成功的行这次不再放到当前操作中，因为它们已有了一个 rdRowUnmodified 的 Status 。在中止该更新和关闭该结果集之前，只要还有冲突发生，就继续上述过程。


BatchCollisionRows 属性

返回一个书签数组 ，用以指示在上一批更新操作中产生冲突的那些行。

语法

object.BatchCollisionRows

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

BatchCollisionRows 属性的返回值是一个 Variant（字符串）表达式，如下面“说明”中所述。

说明

该属性包含一个在上一次使用 BatchUpdate 方法期间遇到冲突的行的书签组成的数组。数组中元素的个数由 BatchCollisionCount 属性指定。

通过将工作的 rdoResultset 对象的 Bookmark 属性设置为 BatchCollisionRows 数组中的书签值，可以定位最近的 BatchUpdate 操作中未完成的每一行。

更正冲突行后，可以再次调用 BatchUpdate 方法。这时， RDO 又尝试执行另一个批更新，而 BatchCollisionRows 属性将反映第二次未完成行的行集合。上次已成功的行这次不再放到当前中，因为它们已有了一个 rdRowUnmodified 的 Status 。在中止该更新和关闭该结果集之前，只要还有冲突发生，就继续上述过程。

每次执行 BatchUpdate 方法，该数组都重新创建。


BatchConflictValue 属性

返回数据库的一个当前值，该值比一次开放式批更新冲突所确定的 Value 属性还新。

语法

object.BatchConflictValue

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

BatchConflictValue 属性的返回值是一个 Variant（字符串） 表达式，如下面“说明”中所述。

说明

该属性包含服务器上数据库中列的当前值。在开放式批更新期间，在第一个客户取得数据和要尝试更新之间，有第二个客户也要修改同一个行和列时可能发生冲突。当这发生时，第二个客户设置的值通过该属性就可以访问。


BatchSize 属性

返回或设置值，指示每个批中发回给服务器的语句的个数。

语法

object.BatchSize [= value]

BatchSize 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Long 整数，表示每个批中发回给服务器的语句的个数。缺省值是 15 。

说明

该属性确定在一个开放式批更新中，当给服务器发送语句时使用的批量的大小。该属性的值决定在命令缓冲区中发送给服务器的语句的个数。按照缺省，每个批有 15 个语句发送给服务器。这个属性在任意时刻都可以改变。如果一个 DBMS 不支持批的语句，可以将该属性设置为 1 ，使得每个语句被分别发送。


BindThreshold 属性

返回或设置一个值，用以指示将被自动连接到ODBC之下的最大列。

语法

object.BindThreshold [= value]

BindThreshold 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 长表达式，如“说明”中所述。.

说明

BindThreshold 的缺省值是 1024 字节。

有几种数据类型支持大尺寸，这些尺寸很大所以不能用常规字符串或字节数组的技术来处理。对这些列，应使用 GetChunk 和 AppendChunk 方法。然而有时并不需要使用这些方法 － 假如大块数据的大小不能用尽资源，就只需简单地将 Value属性定址即可。

可以通过设置 BindThreshold 属性，来设置大块的最大尺寸，RDO 自动将该大块连到字符串。比 BindThreshold 值还大的列就需要使用 GetChunk 方法来检索数据。 ChunkRequired 属性通过将该列的数据大小与 BindThreshold 值作比较，指示该列是否需要使用 AppendChunk 和 GetChunk 方法。


BOFAction、EOFAction 属性（远程数据）

返回或设置一个值，用以指示当 BOF 或 EOF 属性为 True 时，RemoteData 控件采用什么动作。

语法

object.BOFAction [= value]

object.EOFAction [= value]

BOFAction 和 EOFAction 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象
value | 常数或值，按照下面设置值中所述，它指定一个动作。

设置值

对于 BOFAction 属性， value 的设置值是：

常数 | 值 | 描述
rdMoveFirst | 0 | MoveFirst （是缺省值）：使第一行作为当前行。
rdBOF | 1 | BOF：移过 rdoResultset 的开关将触发第一行上的 RemoteData 控件的 Validate 事件，随后是一个该无效 (BOF) 行的 Reposition 事件。此时，禁止使用 RemoteData 控件上的 “向前移动”按钮。

对于 EOFAction 属性， value 的设置值是：

常数 | 值 | 描述
rdMoveLast | 0 | MoveLast（缺省值）：使最后一行作为当前行。
rdEOF | 1 | EOF：移过 rdoResultset 的最后一行将触发该最后一行上的 RemoteData 控件的 Validate 事件，随后是一个该无效 (EOF) 行的 Reposition 事件。此时，禁止使用 RemoteData 控件上的“移到下一个”按钮。
rdAddNew | 2 | AddNew: 移过最后一行将触发对该当前行的 RemoteData 控件的 Validate 事件发生，随后是一个自动的 AddNew ，再后是一个对该新行的 Reposition 事件。

说明

如果设置 EOFAction 属性为 rdAddNew，一旦使用 RemoteData 控件将当前行指针移动为 EOF ，该当前行就定位到复制缓冲区中的一个新行。此时可以编辑这个新添加的行。如果对该新行作了改变，并且随后使用 RemoteData 控件移动了当前行指针，该行就自动添加到 rdoResultset 中。如果未对该新行作改变，并且将当前行重新定位到另一行，就放弃该新行。如果使用 RemoteData 控件跳过该新行而定位到另一行，就创建另一个新行。

当使用代码操作由 RemoteData 控件创建的 rdoResultset 对象时， EOFAction 属性不起作用。只有使用鼠标操作 RemoteData 控件时，它才起作用。

当 RemoteData 控件返回的 rdoResultset 中一行也没有时，或是其中的最后一行也被删除时，为 EOFAction 属性使用 rdAddNew 选项，可以极大的简化代码，因为一个新行总是可以作为当前行编辑。


BOF、EOF 属性（远程数据）

  • BOF － 返回一个值，用以指示当前行的位置是否是在 rdoResultset 中第一行之前。

  • EOF － 返回一个值，用以指示当前行的位置是否是在 rdoResultset 中的最后一行之后。

语法

object.BOF

object.EOF

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

BOF 属性的返回值是：

值 | 描述
True | 当前行的位置是在第一行之前。
False | 当前行的位置是在第一行，或在第一行之后。

EOF 属性的返回值是：

值 | 描述
True | 当前行的位置是在最后一行的后面。
False | 当前行的位置是在最后一行，或在最后一行的前面。

说明

如果这个指针是有效的，BOF 和 EOF 的返回值就由该当前行指针的位置确定。如果 BOF 或 EOF 为 True，则没有当前行，任何想引用 rdoResultset 数据都将导致一个可以捕获的错误。

可以使用 BOF 和 EOF 属性来确定 rdoResultset 对象是否包含行，或者当从一行移到另一行时，确定是否已超出 rdoResultset 的范围。

如果打开一个一行也没有的 rdoResultset，BOF 和 EOF 都被设为 True，并且结果集的 RowCount 属性被设为 0。如果打开一个至少有一行的 rdoResultset ，其中的第一行即为当前行，并且 BOF 和 EOF 都为 False；在使用 MovePrevious 或 MoveNext 方法，分别移动超出 rdoResultset 的开始或结尾之前，它们会一直为 False 。如果移动超出 rdoResultset 的开始或结尾，就没有当前行了。

如果删除 rdoResultset 对象中所剩余的最后的一行时，在当前行重新定位之前，BOF 和 EOF 一直为 False 。

如果对含有行的 rdoResultset 使用 MoveLast 方法，其最后一行就成为当前行；如果再使用 MoveNext 方法，当前行就为无效并且 EOF 被置为 True 。 相反，如果对含有行的 rdoResultset 使用 MoveFirst 方法，其第一行就成为当前行；如果再使用 MovePrevious 方法，就没有当前行并且 BOF 被置为 True 。

一般来说，当需要对 rdoResultset 中的所有行进行操作时，代码可以使用 MoveNext ，循环遍历各行，直到 EOF 属性被置为True。

如果当 EOF 被置为 True 时再使用 MoveNext ，或当 BOF 被置为 True 时再使用 MovePrevious ，都将产生一个可以捕获的错误。

下表说明在不同的 BOF 和 EOF 的组合时，哪种 Move 方法是允许的。

 | MoveFirst, MoveLast | MovePrevious, Move < 0 | Move 0 | MoveNext, Move > 0
BOF = True, EOF = False | 允许 | 错误 | 错误 | 允许
BOF = False, EOF = True | 允许 | 允许 | 错误 | 错误
均为 True | 错误 | 错误 | 错误 | 错误
均为 False | 允许 | 允许 | 允许 | 允许

允许一个 Move 方法并非意味着，该方法能成功地定位某行。它仅表示执行这个指定的 Move 方法是允许的，并且不产生一个错误。 BOF 和 EOF 属性的状态可以随着该移动的结果而改变。.

指定的方法对 BOF 和 EOF 设置值的影响如下：

  • OpenResultset 方法会在内部调用 MoveFirst 。因此，对空行集的 OpenResultset 会导致 BOF 和 EOF 被置为 True 。

  • 所有成功的进行了行定位的 Move 方法，都将置 BOF 和 EOF 为 False 。

  • 对于动态类型 rdoResultset对象，任何 Delete 方法，即使是删除 rdoResultset 中的所剩的唯一一行，也不改变 BOF 或 EOF 的设置。

  • 对于其它类型的 rdoResultset 对象，因为结果集成员是固定的， BOF 和 EOF 属性也不由于添加和删除操作而改变。


Bookmark 属性（远程数据）

返回或设置一个书签，它可以唯一地指示在 rdoResultset 对象中的当前行。如果有一个有效的书签，可以用于将 rdoResultset 中的当前行再定位。

语法

object.Bookmark [= value]

Bookmark 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象
value | Variant（字符串） 表达式，用于计算出一个有效的书签。.

说明

当创建或打开一个非仅向前类型 rdoResultset 对象时，其中的每一行均已有一个唯一的书签。可以通过将 Bookmark 属性的值赋给已声明为 Variant 的变量，为其当前行保存书签，为了在移动到另外一行之后，可在任意时刻快速地返回该行，设置 rdoResultset 对象的 Bookmark 属性为该个变量的值即可。

可创建的书签的个数是没有限制的。为了给不是当前行的某行创建一个书签，移动到该行，并将 Bookmark 属性的值赋给一个标识该行的 Variant 变量。

为了确保 rdoResultset 能支持书签，使用 Bookmark 属性前先检查它的 Bookmarkable 属性。如果 Bookmarkable 为 False ，该 rdoResultset 就不支持书签，使用该 Bookmark 属性会导致一个可以捕获的错误。当使用一个动态游标时，可以返回书签值，但该值不一定总是可靠的。

Bookmark 属性的值不保证一定与行号相同。

注意 Bookmark 属性不能用于仅向前类型的 rdoResultset 对象。


Bookmarkable 属性（远程数据）

返回一个值，用以指示 rdoResultset 对象是否支持书签，该书签可用 Bookmark 属性设置。

语法

object.Bookmarkable

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Bookmarkable 属性的返回值是：

值 | 描述
True | rdoResultset 支持书签。
False | rdoResultset 不支持书签。

说明

为了确保 rdoResultset 支持书签，在要设置或检查 Bookmark 属性之前，先检查 Bookmarkable 属性的设置。


ChunkRequired 属性（远程数据）

返回布尔值，用以指示是否必须使用 GetChunk 方法访问数据。

语法

object.ChunkRequired

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

ChunkRequired 属性的返回值是：

值 | 描述
True | 数据需要使用 GetChunk 方法访问。
False | 数据不需要使用 GetChunk 方法访问。

说明

使用 ChunkRequired 属性确定被询问的列是否需要使用 AppendChunk 和 GetChunk 方法操作。当 RDO 不使用 AppendChunk 或 GetChunk 方法就不能获取数据时，访问 ChunkRequired 属性为 True 的列的 Value 属性，将导致一个唯一的可以捕获的错误。换言之，当数据列包含的数据量可由常规字符串技术处理时，就不需要使用 GetChunk 和 AppendChunk 方法。

通过设置 BindThreshold 属性，可以调节将强制使用 AppendChunk 和 GetChunk 方法的字节数。也可以使用 ColumnSize 方法确定大块列的长度。


Connect 属性（远程数据）

返回或设置一个值，用以提供关于一个打开 rdoConnection 源的信息。 Connect 属性包含 ODBC 连接字符串。这个属性总是可读的，但当创建那个连接后该属性就不能改变了。

语法

object.Connect [= value]

Connect 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 字符串表达式，如“说明”所述。（数据类型是String)。

设置值

Connect 属性返回值，该值如“说明”中所述，是一个 String 表达式，这个表达式由零个或多个参数组成，各参数由分号隔开。

说明

当使用 rdoQuery 或 rdoConnection 对象时，该属性是只读的，但是如果是建为独立方式的对象时，创建该连接之前它是读写的。

Connect 属性用于给和从 ODBC 驱动程序管理器与数据源创建一个连接时传递附加信息。 Connect 属性含有 ODBC连接字符串，该字符串还用作为 OpenConnection 方法的参数。当与独立方式的 rdoConnection 或 rdoQuery 对象一起使用时， Connect 属性由 EstablishConnection 方法使用。

除非与 RemoteData 控件关联，否则一旦构造一个连接，Connect 属性以由用户和ODBC 驱动程序管理器选择提供的值作为结束。rdoQuery 的该 Connect 属性包含这个已修正的连接字符串。

在连接创建之后， RemoteData 控件的 Connect 属性就不变了。然而，已完成的连接字符串还可以从 RemoteData 控件的 Connection 属性中抽取。例如：

FullConnect = MSRDC1.Connection.Connect

下表详细地列出有效的 ODBC 连接字符串参数和一般的使用方法。注意，每个参数都由一个分号（；）作标记。

ODBC 连接字符串参数

参数 | 详细说明 | 示例
DSN | 用名称注册 ODBC 数据源。 | DSN=MyDataSource; （如果这样指定，当创建一个无 DSN 的连接时，DSN 必须是最后一个参数。）
UID | 数据库的一个可识别的用户的用户名。 | UID=Victoria;
PWD | 与用户名相关的密码。 | PWD=ChemMajor;
DRIVER | 描述驱动程序。（注意括号内的驱动程序名含有空格符。） | DRIVER={SQL Server};
DATABASE | 一旦连接时所使用的缺省数据库。 | DATABASE=Pubs;
SERVER | 远程服务器的名称。 | SERVER=SEQUEL;
WSID | 工作站 ID （系统的 Net 名称）。 | WSID=MYP5
APP | 应用程序名。在设计时，被设置为工程名。在运行时，是 .exe 文件名。 | APP=Accounting

注意 有些 ODBC 驱动程序 用到未列在表中的其它不同的参数。

例如，为了设置 RemoteData 控件的 Connect 属性，可以使用下列代码：

Dim Cnct As String
Cnct = "DSN=WorkData;UID=Chrissy;"  _
      & "PWD=MIDFLD;DATABASE=WorkDB;"
RemoteData1.Connect = Cnct
RemoteData1.SQL = "Select Name, City " _
   & " From Teams Where Type = 12"
RemoteData1.Refresh

还可以使用这个相同的字符串创建一个新的连接：

Dim Cn As rdoConnection
Set Cn = rdoEnvironments(0).OpenConnection("", _
rdDriverNoPrompt,True,Cnct$)

注意 有效的参数是由 ODBC 驱动程序确定的。显示在前面示例的这些参数，是由 Microsoft SQL Server ODBC 驱动程序支持。 ODBC， LOGINTIMEOUT 和 DBQ 不是 RemoteData 控件或 rdoConnectionection 对象的 Connect 属性的有效参数。这些参数是由 Microsoft Jet 数据库引擎支持的，而不是由 ODBC 驱动程序支持。为了设置登录超时延迟，必须使用 rdoEnvironment 对象的 LoginTimeout属性。

捕获丢失的参数

如果连接字符串为 null，则由 DSN 提供的信息是不完全的，或提供的参数是无效的，该连接不能创建。如果代码将 OpenConnection 方法的 prompt 参数，或 RemoteData 控件的 Prompt 属性，设置成禁止用户丢失 ODBC 连接参数 ，就会触发一个可以捕获的错误。否则，ODBC 驱动管理程序显示一个对话框，从用户处收集丢失的信息。根据 OpenConnection 或 EstablishConnection 方法的 Prompt 参数的设置，这些对话框就从已登记的 ODBC 数据源列表捕获 DSN。提供该用户的名称，该用户 ID 及其密码，其中用户 ID 和密码是可选的。随后，如果使用这些用户提供的值所作的连接失败，该对话框会再次出现，直到该连接成功或是用户取消该操作。有时，用户可以使用这些对话创建自己的 DSN 。

如果需要密码，而 Connect 属性设置中又没提供时，ODBC 驱动程序第一次访问一个表并且每次关闭和重新打开该连接时就显示一个登录对话框，

域管理安全机制的连接

当与支持域管理安全机制 ODBC 数据源进行连接时，设置 UID 和 PWD 参数为""。在这种情况下， Windows NT 用户名和密码被传递给数据源，以为有效性检查。该策略允许具有通过鉴别工作站登录访问 NT 域的用户，来访问数据源。

可以通过为 OpenConnection 方法提供 connect 参数，来为 rdoConnection 对象设置 Connect 属性。连接一旦创建，就可以检查 Connect 属性设置，确定 DSN 、数据库、用户名、密码、或数据库的 ODBC 数据源。

登录数据源名

使用数据源名 (DSN) 创建连接之前，必须先使用 Windows 控件面板应用程序手工登录 DSN ，或者使用 rdoRegisterDataSource 方法。这个过程将创建该服务器的名称、驱动程序的名称以及其它的引用数据源时所用的选项。

创建无 DSN 的连接

在正常情况下，创建连接前可以不必预先登录 DSN 。如果遇到下列情况，RDO 可以使用 RemoteData 控件，或使用具有完整移居的 Connect 属性的 OpenConnection 或 EstablishConnection 方法，或使用连接字符串，创建一个无 DSN 的连接：

  • 该连接使用了缺省的命名管道网络协议。

  • 该连接未设置 OEMTOANSI 选项。

  • 使用该连接字符串的 SERVER 参数指定服务器名。

  • 使用该连接字符串的 DRIVER 参数指定 ODBC 驱动程序名。

  • 设置该连接字符串的 DSN 参数为空字符串（或是该参数无论出现在什么地方－ 比如是出现在 RemoteData 控件的 DataSourceName 属性中) 。这个空 DSN 参数必须被指定为该连接字符串的最后一个参数。


Connection 属性（远程数据）

返回一个对 RemoteData 控件的基本的 rdoConnection 对象的引用。

语法

object.Connection

Set connection = object.Connection

Connection 属性的语法包含下面部分：

部分 | 描述
connection | 对象表达式，它用来为一个有效的 rdoConnection 对象求值。
object | 对象表达式，其值是“应用于”列表中的一个对象。

说明

当初始化 RemoteData 控件时， RemoteData 打开到该控件的 Connect 属性中指定的数据源的一个连接。由 RDO 创建的 rdoConnection 对象被 Connection 属性暴露。

rdoConnection 对象具有可用于管理数据的属性和方法。可以与 RemoteData 控件的 Connection 属性使用 rdoConnection 对象的任意方法，比如 Close 和 Execute 。

除非与 RemoteData 控件关联，否则一旦构造一个连接，Connect 属性由用户和 ODBC 驱动程序管理器选择提供的值完成。 rdoQuery 的该 Connect 属性包含这个修正的连接字符串。

该连接创建之后，该 RemoteData 控件的 Connect 属性就不变了。然而，已完成的连接字符串还可以从 RemoteData 控件的 Connection 属性中抽取。例如：

FullConnect = MSRDC1.Connection.Connect


Connect 属性和 OpenConnection 示例：使用 OpenConnection 的 DSN 的连接

下例是使用 OpenConnection 方法创建一个 ODBC 连接，不过需要用户提供所有的连接信息。在这种情况下，该例将 Connect 属性的结果打印到立即窗口。

Dim cn As rdoConnection
Dim en As rdoEnvironment

Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsName:="WorkDB", _
    Prompt:=rdDriverCompleteRequired)
debug.print cn.Connect


Connect 属性和 OpenConnection 示例：使用 OpenConnection 的无 DSN 的连接

下例恰与缺省的 rdoEnvironment 相反，是使用 OpenConnection 方法创建一个无 DSN 的 ODBC 连接。在这种情况下，该例将 Connect 属性的结果打印到立即窗口。

Dim en as rdoEnvironment
Dim cn as rdoConnection

Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsName:="", _
    Prompt:=rdDriverNoPrompt, _
    Connect:="uid=;pwd=;driver={SQL Server};" _
        & "server=SEQUEL;database=pubs;")
debug.print cn.Connect


Connect 属性示例：使用独立方式连接的无 DSN 的连接

下例是通过创建一个独立方式的 rdoConnection 对象，创建一个无 DSN 的 ODBC 连接，并且使用 EstablishConnection 方法打开连接。 注意：DSN=''; 参数被放到该连接串的结尾。该例将 Connect 属性的结果打印到立即窗口。

' 创建一个无 DSN 的连接
'   使用一个独立方式的 rdoConnection 对象和
'   EstablishConnection 方法
'
Dim cn As New rdoConnection
Dim qd As New rdoQuery

cn.Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"
cn.cursordriver = rdUseOdbc
cn.EstablishConnection rdDriverNoprompt
debug.print cn.Connect

Set qd.ActiveConnection = cn


Connect 属性示例：使用 Establish 连接的 DSN 连接

下例是使用一个已登录的 DSN 提供大部分所需要的参数，创建一个 ODBC 连接。用户 ID 和密码是由域管理安全机制提供的。在这种情况下，该例将 Connect 属性的结果打印到立即窗口。

Dim cn As New rdoConnection
Dim qd As New rdoQuery

cn.Connect = "uid=;pwd=;"DSN=WorkDB;"
cn.cursordriver = rdUseOdbc
cn.EstablishConnection rdDriverNoprompt
debug.print cn.Connect


CursorDriver 属性（远程数据）

返回或设置值，用以指定要创建的游标的类型。

语法

object.CursorDriver [= value]

CursorDriver 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Integer 或常数，如下面设置值中所述。

设置值

常数 | 值 | 描述
rdUseIfNeeded | 0 | ODBC 驱动程序 将选取适当的游标风格。可能的话，使用服务器端的游标。
rdUseOdbc | 1 | RemoteData 将使用ODBC 游标库。
rdUseServer | 2 | 使用服务器端的游标.
rdUseClientBatch | 3 | RDO 将使用开放式批游标库。

说明

CursorDriver 属性只对在设置该 CursorDriver 属性之后创建的连接有影响－ 对于存在的连接该属性是只读的。

当初始化（是缺省值）以及随后的每创建一个 rdoEnvironment 对象时， CursorDriver 属性都从 rdoEngine 对象的 rdoDefaultCursorDriver 属性设置，而那个 rdoDefaultCursorDriver 属性则是使用相同常数设置的。

选取一个游标驱动程序

选取正确的游标驱动程序，对应用程序的总体性能具有极其重要的影响，如，游标使用什么资源，以及所建游标的类型限制和复杂性等。每个游标的类型均有其长处和局限性。在大多数情况下，最好的选择是根本不要游标，因为应用程序并不需要对键集经常滚动数据或进行更新操作。

以下各段概述了每种游标类型的功能及所建议的用途。

  • 服务器端的游标
    • 这个游标库维护服务器（在 TempDB 中）上的游标键集，该服务器删除将键集传送给工作站的需求，在工作站它消耗所需的资源。然而，这个游标驱动程序将消耗在远程服务器上的 TempDB 空间，因此必须扩充这个数据库以满足该需求。用服务器端驱动程序所建的游标，不能包含一个以上的 SELECT 语句- 否则会引发一个可以捕获的错误。通过创建一个只能先前的、只读的、具有一个行集合大小的游标可以禁止游标，但仍然可以使用带有多重结果集查询的该服务器端的游标驱动程序。并非所有的远程服务器都支持服务器端的游标。注意当对 Microsoft SQL Server 数据库使用 rdUseIfNeeded 或 rdUseServer 时，服务器端的游标都是允许的。
  • ODBC 客户端的游标
    • 这个游标库在工作站上的本地 RAM 中建造键集，如果有必要还会溢出到磁盘中。由于这个设计，相当多的网络操作必须执行初始化创建键集，但对于小游标，不应该给工作站或网络进行重要的加载。ODBC 客户端的游标对所执行的查询类型不能作任何的类型限制。该选项对小结果集提供了较好的性能，但对大结果集的性能大为降低。
  • 客户端的批游标
    • 这个游标库是设计用于处理特殊要求的开放式批量更新和其它更为复杂的游标特性。无关的连接、批模式、以及多表更新，都需要客户端的批游标。该游标还支持延迟的 BLOB 列获取、缓冲区游标、以及更新期间附加的控件。该库比其它库略大，并且在大多数情况下都执行得比较好。
  • 无游标选项
    • 当需要快速获取某列时，或是对数据库执行无游标系统开销的操作查询时可以选取命令 RDO 忽视创建游标。基本上，这个选项是将 RowsetSize 设置为 1，来创建一个仅向前的、只读的结果集。该选项还能改善许多操作的性能。当不能使用这个游标更新行或在行之间滚动时，可以提交独立的操作查询来操纵数据。当通过存储过程存取数据时，该选项特别有用。


CursorType 属性

返回或设置一个值，这个值指示指当从指定的查询中打开一个结果集时所使用的游标缺省类型。

语法

object.CursorType [= value]

CursorType 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Long 整数，如下列常数之一所述，表示游标的类型：

常数 | 值 | rdoResultset type
rdOpenForwardOnly | 0 | （是缺省值）是固定集，不可滚动。
rdOpenKeyset | 1 | 是可更新的，固定集的，可滚动的查询结果集的游标。
rdOpenDynamic | 2 | 是可更新的，动态集的，可滚动的查询 结果集的游标。
rdOpenStatic | 3 | 是只读的，固定集。

说明

当从查询打开一个 rdoResultset 对象时，确定使用的游标类型。

当创建一个其查询被作为一种方法使用的独立方式的 rdoQuery 对象时，在执行该查询之前，应该先设置 CursorType ，因为当执行该查询时没有选项可用。

CursorType 属性的值被用作 OpenResultset 方法的 Type 参数。

并非所有的游标库都支持所有类型的游标。例如。 ODBC 用户端的驱动程序只能支持 rdOpenStatic 和 rdOpenForwardOnly 游标类型，而 SQL Server 服务器端的驱动程序四种类型全都支持。一般来说，大多数驱动程序都支持仅向前和静态类型的游标。


CursorType 属性示例

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn

Private Sub Form_Load()

cn.CursorDriver = rdUseClientBatch
cn.Connect = "uid=;pwd=;server=sequel;" _
   & "driver={SQL Server};database=pubs;dsn='';"
cn.EstablishConnection

'
'   创建该查询
'
With qy
    .Name = "ShowAuthor"
    .SQL = "Select * from Authors " _
      & "where Au_LName = ? "
    .LockType = rdConcurReadOnly
    .CursorType = rdOpenForwardOnly
    .RowsetSize = 1
    Set .ActiveConnection = cn
End With

'
'   通过把 Name 作为一个参数传递给查询来执行该查询
'
cn.ShowAuthor "White"
'
'   处理这些结果行
'

If cn.LastQueryResults is Nothing then
Else
   Set rs = cn.LastQueryResult
   For Each col In rs.rdoColumns
       Print col.Name,
   Next
   Print String(80, "-")

   Do Until rs.EOF
       For Each col In rs.rdoColumns
           Print col,
       Next
       Print
       rs.MoveNext
   Loop
End if

End Sub


DataSourceName 属性（远程数据）

为 RemoteData 控件返回或设置数据源名。

语法

object.DataSourceName [ = datasourcename ]

DataSourceName 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
datasourcename | 字符串表达式，它用来指示一个已登录的数据源名。

说明

如果 RemoteData 控件的 Connect 属性指示一个已在 Windows 注册（32位）中登录的数据源名 (DSN) ，或者如果创建一个在 Connect 属性中提供所需信息的无 DSN 的连接，该属性可以是空白。

一旦 rdoConnection 被 RemoteData 控件打开，DataSourceName 属性就包含用于创建连接的 DSN － 它可以不同于打开连接前设置的值，因为在连接过程中用户可以从有效的 DSN 输入项列表中选择一个数据源。

如果在打开控件的 rdoConnection 对象后，改变了该属性，就必须使用 RemoteData 控件的 Refresh 方法打开一个到数据源的新的连接。


Description 属性（远程数据）

返回一个与错误相关的描述字符串。

语法

object.Description

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Description 属性的返回值是一个字符串表达式，包含对该错误的一个说明。

说明

当处理查询时，无论是在远程服务器，还是在 ODBC 接口产生一个错误时，均创建一个 rdoError 对象，并将其添加到 rdoErrors 集合中。 rdoError 对象的 Description 属性返回一个关于该错误发生位置的简短的描述和上下文信息。这可被用于警告用户一个不能或不想处理的错误。SQLState 代码被添加到消息的前面，其后紧跟一个冒号和一个空格。例如，"S0021： 无法找到 XXX"。


Direction 属性（远程数据）

返回或设置一个值，该值用于指示参数如何被传递到一个过程或从过程传来。

语法

object.Direction [= value]

Direction 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 常数或 Integer ，如下面设置值中所述。

设置值

value 的设置值是下列之一：

常数 | 值 |  | 描述
rdParamInput | 0 | （是缺省值）该参数用于给过程传递信息。
rdParamInputOutput | 1 | 该参数用于给或从过程传递信息。
rdParamOutput | 2 | 该参数用于将从过程返回的信息作为 SQL 的输出参数。
rdParamReturnValue | 3 | 该参数用于从过程返回该返回状态值。

说明

当与存储过程和参数查询一起工作时，应该标识那些由 RDO 管理的参数－ 但使用不能自动检测参数方向的驱动程序除外。一个参数化的查询实际上可以带有任何输入参数－其中的每一个都需要在创建查询时作标记。

通常，查询返回一个行集合，这些行满足在以运行时提供的参数为基础的查询中创建的需求。然而当与存储过程一起工作时，另一个路径被暴露了。存储过程使用行集合、返回状态、以及输出参数返回信息。因此，每个由存储过程返回的参数在创建查询时必须作标记。

Direction 属性确定该参数是否是输入参数、输出参数、还是二者兼有－ 或者该参数是否是从该过程返回的参数。

注意 当第一次寻址 rdoParameter 对象去设置 Direction 属性时，如果不能创建 rdoParameters 集合，那么也许会俘获一个可以捕获的错误。通常这是由于查询中有语法错误或是其它的禁止 RDO 创建集合的问题。

一些 ODBC 驱动程序不提供 SELECT 语句和过程调用的参数方向的信息，因此所有的参数方向均缺省为 rdParamInput 。在这种情况下，代码中在执行查询之前先设置方向是必要的。

注意 Microsoft SQL Server 6.x 中，驱动程序自动地为所有的过程参数设置 Direction 属性，因此不必为任何查询参数设置 Direction 属性。

Direction 属性是与 rdoParameter 对象相关联的，但是通常没有必要为 rdoParameter 对象寻址，因为它如下列所示，是 rdoQuery 对象的缺省的集合。

例如，下面的过程是从一个存储过程中返回一个值：

{? = call sp_test}

这个调用产生一个参数－ 是返回值。在执行准备好的语句之前，有必要设置该参数的方向为 rdParamOutput 或 rdParamReturnValue 。例如：

Dim my_statement As rdoQuery
Set my_statement = someRdoConnection.CreateQuery _
   ("MyPs", "{? = call sp_testprocedure }", ...)
my_statement.rdoParameters(0).Direction =  _
   rdParamReturnValue
my_statement.Execute
Print my_statement.rdoParameters(0)

在访问或设置该参数的值和执行该 rdoQuery 之前，需要设置除 rdParamInput 之外的所有参数的方向。

应该为返回值使用 rdParamReturnValue ，但当不支持 rdParamReturnValue 时也可使用rdParamOutput 。


EditMode 属性（远程数据）

返回一个值，用以指示当前行的编辑状态。.

语法

object.EditMode

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

EditMode 属性如下表所述，返回一个整数或常数：

常数 | 值 | 描述
rdEditNone | 0 | 处理中无编辑操作。
rdEditInProgress | 1 | Edit 方法已被调用，当前行在复制缓冲区中。
rdEditAdd | 2 | AddNew 方法已被调用，在复制缓冲区中的当前行是一个新行，它还未保存到数据库中。

说明

当希望脱离 RemoteData 控件的缺省功能时，EditMode 是最有用的。可以通过检查 EditMode 属性的值，以及检查 Validate 事件过程中的 action 参数的值，确定是否调用 UpdateRow 方法。

也可以查看 rdoResultset 的 LockEdits 属性是否为 True ，以及 EditMode 属性设置是否为 rdEditInProgress ，以确定是否锁定该当前数据页。


Environment 属性（远程数据）

返回一个对 RemoteData 控件的基本的 rdoEnvironment 对象的引用。

语法

object.Environment

Set environment = object.Environment

Environment 属性的语法包含下面部分：

部分 | 描述
environment | 对象表达式，它用来为一个有效的 rdoEnvironment 对象求值。
object | 对象表达式，其值是“应用于”列表中的一个对象。

说明

当初始化 RemoteData 控件时， RemoteData 使用缺省的 rdoEnvironments (0) － Environment 属性被初始化为这个对象。

如果将 RemoteData 控件的 Resultset 属性赋值为另一个 rdoResultset ，那么该 Environment 属性，被置为 rdoEnvironment 对象，用于创建结果集。

rdoEnvironment 对象具有可用于管理数据的属性和方法。例如，可以使用 Environment 属性的 rdoEnvironment 对象的任意方法，比如 OpenConnection、 BeginTrans、 CommitTrans 或 RollbackTrans 。


ErrorThreshold 属性（远程数据）

返回或设置值，该值确定构成致命错误的严重等级。

注意 保留该属性是为了与以前的 RDO 1.0 版本的代码兼容。现在它应该由实现 rdoEngine 对象的 InfoMessage 事件的代码来取代，它们的功能是一样的。

说明

在 Microsoft SQL Server version 4.x 版本中，不可能用 RAISERROR 语句来设置错误的重要程度。于是，就需要 ErrorThreshold 属性允许代码将这些消息过滤为重要程度的阈值。

现在的 Microsoft SQL Server Version 6.x ，可支持在 RAISERROR 语句中包含重要程度，所以就不需要使用 ErrorThreshold 属性了。

所有被返回的重要程度小于 10 的错误，被 ODBC 层俘获并设置 SQL_SUCCESS_WITH_INFO 结果代码。这造成 RDO 引发 InfoMessage 事件，不过查询处理并不停止。


Execute 方法示例

下面示例说明使用 Execute 方法对远程数据源执行 SQL 查询。这些动作查询不返回行，但在某些情况下，要在 RowsAffected 属性中返回受影响的行的行数。该例建立一个名为 "TestData" 的工作表，并在表中插入一些行，然后对该表运行一个 DELETE 查询。注意这个删除查询有其自己的嵌入事务管理。为此，必须使用 rdExecDirect 选项防止建立拒绝使用查询事务的保存过程。

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn
Dim SQL As String

Private Sub DropRows_Click()
Dim SQL As String, Ans As Integer

SQL = "Begin Transaction Delete TestData " _
   & " Where State = '" & StateWanted & "'"
cn.Execute SQL, rdExecDirect
Ans = MsgBox("Ok to delete these "  _
   & cn.RowsAffected & " rows?", vbOKCancel)
If Ans = vbOK Then
   cn.Execute "Commit Transaction", rdExecDirect
Else
   cn.Execute "Rollback Transaction", rdExecDirect
End If
Exit Sub
End Sub

Private Sub Form_Load()
cn.CursorDriver = rdUseOdbc
cn.Connect = "uid=;pwd=;server=sequel;" _
   & "driver={SQL Server};" _
   & "database=pubs;dsn='';"
cn.EstablishConnection
With qy
   .Name = "TestList"
   .SQL = "Select * from TestData Where State = ?"
   .RowsetSize = 1
   Set .ActiveConnection = cn
End With
SQL = "Drop Table TestData"
cn.Execute SQL

SQL = " CREATE TABLE TestData " _
   & " (ID integer identity NOT NULL, " _
   & " PName char(10) NULL," _
   & " State Char(2) NULL) " _
   & " CREATE UNIQUE INDEX " _
   &   "TestDataIndex on TestData(ID)"

cn.Execute SQL
SQL = "Insert TestData (PName,State)  " _
   & "Values('Bob', 'CA')" _
   & " Insert TestData (PName,State) " _
   & " Values('Bill', 'WA')" _
   & " Insert TestData (PName,State) " _
   & " Values('Fred', 'WA')" _
   & " Insert TestData (PName,State) " _
   & " Values('George', 'CA')" _
   & " Insert TestData (PName,State) " _
   & " Values('Sam', 'TX')" _
   & " Insert TestData (PName,State) " _
   & " Values('Marilyn', 'TX')"
cn.Execute SQL
Debug.Print cn.RowsAffected
'这里返回为 1
'(最后的 INSERT 语句影响了 1 行)
End Sub

Private Sub SeekRows_Click()
qy(0) = StateWanted
Set rs = qy.OpenResultset(rdOpenForwardOnly, _
rdConcurReadOnly)
List1.Clear
If rs.EOF Then
   MsgBox "No hits for that state"
Exit Sub
End If
Do Until rs.EOF
   List1.AddItem rs!PName & " - " & rs!state
   rs.MoveNext
Loop
End Sub


GetRows 方法示例

下面示例说明使用 GetRows 方法从 rdoResultset 将行取到一个变体型数组中。程序打开与远程数据源的连接，并建立一个需要一个参数的 rdoQuery 对象。GetRowsNow 过程使用用户提供的参数执行查询，并使用 GetRows 从结果集中取得行。

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim RowBuf As Variant
Dim RowsReturned As Integer
Dim i As Integer
Dim Ans As Integer

Private Sub GetRowsNow_Click()
qy(0) = StateWanted
rs.Requery

Do Until rs.EOF
   List1.Clear
   RowBuf = rs.GetRows(5)      '得到后面的 5 行
   RowsReturned = UBound(RowBuf, 2) + 1
   For i = 0 To RowsReturned - 1
      List1.AddItem RowBuf(0, i) & ":" & RowBuf(1, i)
   Next i
   Ans = MsgBox("Press Ok to see next 5 rows " _
      &" or Cancel to quit", vbOKCancel)
   If Ans = vbOK Then Else Exit Sub
Loop
End Sub

Private Sub Form_Load()
cn.CursorDriver = rdUseOdbc
cn.Connect = "uid=;pwd=;server=SEQUEL;" _
   driver={SQL Server};database=pubs;dsn='';"
cn.EstablishConnection
With qy
   .Name = "GetRowsQuery"
   .SQL = "Select * from Titles T, Publishers P " _
   & " Where T.Pub_ID = P.Pub_ID " _
   & " and P.State = ?"
   .RowsetSize = 1
   Set .ActiveConnection = cn
   .rdoParameters(0) = "CA"
   Set rs = .OpenResultset(rdOpenKeyset, _
      rdConcurRowver)
End With
End Sub


hDbc 属性（远程数据）

返回一个值，该值对应于 ODBC 连接句柄。

语法

object.hDbc

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

hDbc 属性返回一个 Long 值，该值包含由该 ODBC 驱动程序管理器创建的对应于指定的 rdoConnection 对象的ODBC 连接句柄。

说明

这个句柄可用于执行需要一个 ODBC hDbc 连接句柄的 ODBC 函数。

注意 当有可能使用 ODBC hEnv 、 hDbc 和 hStmt 句柄执行 ODBC API 函数时，建议在使用时要小心。如果使用这些句柄的 ODBC API 函数使用不当，将导致一个不可预测的行为。不能将这个句柄保存到变量中，以便以后将其作为可改变的值使用。

如果应用程序需要访问特定的 ODBC 连接选项设置值，应在创建连接之前先使用 hDbc 属性设置或检索它们。在创建连接之后重新设置任何一种 ODBC 设置值，将导致一个不可预测的行为。


hDbc 属性示例

下例是说明当执行 ODBC API 函数时， hDbc 属性的使用方法。在这种情况下，应用程序设置一个连接选项，用以改变如何隔离事务。

Option Explicit
Dim en As rdoEnvironment
Dim cn As rdoConnection
Dim rc As Integer

'将 SQLSetConnectOption Lib "odbc32.dll" (ByVal hdbc&, ByVal fOption%, ByVal vParam As Any) 函数声明为 Integer
'
'屏蔽事务隔离选项
'
 Const SQL_TXN_ISOLATION As Long = 108
 Const SQL_TXN_READ_UNCOMMITTED As Long = &H1&
 Const SQL_TXN_READ_COMMITTED As Long = &H2&
 Const SQL_TXN_REPEATABLE_READ As Long = &H4&
 Const SQL_TXN_SERIALIZABLE As Long = &H8&
 Const SQL_TXN_VERSIONING As Long = &H10&

Private Sub Form_Load()
Set en = rdoEngine.rdoEnvironments(0)

Set cn = en.OpenConnection(dsName:="WorkDB", _
    Prompt:=rdDriverNoPrompt, _
    Connect:="Uid=;pwd=;database=workdb")

rc = SQLSetConnectOption(cn.hDbc, SQL_TXN_ISOLATION, SQL_TXN_READ_UNCOMMITTED)

Debug.Print rc

End Sub


HelpContext、HelpFile 属性（远程数据）

  • HelpContext － 为 Microsoft Windows 帮助文件中的主题返回一个上下文 ID。

  • HelpFile －给作为变量的帮助文件返回一个完整的限定路径。

语法

object.HelpContext

object.HelpFile

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

HelpContext 属性返回一个 Long 值。

HelpFile 属性返回一个 String 值。

说明

如果在 HelpFile 中指定 Microsoft Windows 帮助文件，那么 HelpContext 属性用于自动显示所标识的帮助主题。

注意 应该在应用程序中编写处理典型错误的例程。当对一个对象编程时，可以使用该对象的帮助文件所提供的帮助，提高错误处理的质量；或者，如果错误是不可恢复的，则为用户显示一条有意义的信息。


hEnv 属性（远程数据）

返回一个值，该值对应于 ODBC 环境句柄。

语法

object.hEnv

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。。

返回值

hEnv 属性返回一个 Long 值，该值包含由该 ODBC 驱动程序管理器创建的对应于指定的 rdoEnvironment 对象的 ODBC 环境句柄。

说明

这个句柄可用于执行需要一个 ODBC hEnv 环境句柄的 ODBC 函数。

注意 当有可能使用 ODBC hEnv、hDbc 和 hStmt 句柄执行 ODBC API 函数时，建议在使用时要小心。如果使用这些句柄的 ODBC API 函数使用不当，将导致一个不可预测的行为。不能将这个句柄保存到变量中，以便以后将其作为可改变的值使用。


hStmt 属性（远程数据）

返回一个值，该值对应于 ODBC 语句句柄。

语法

object.hStmt

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

hStmt 属性返回一个 Long 值，该值包含由该 ODBC 驱动程序管理器创建的对应于指定的 rdoResultset 对象的 ODBC 语句句柄。

说明

这个句柄可用于执行需要一个 ODBC hStmt 语句句柄的 ODBC 函数。

注意 当有可能使用 ODBC hEnv、 hDbc 和 hStmt 句柄执行 ODBC API 函数时，建议在使用时要小心。如果使用这些句柄的 ODBC API 函数使用不当，将导致一个不可预测的行为。不能将这个句柄保存到变量中，以便以后将其用为可改变的值。


hStmt 属性示例

下例是说明如何使用 hStmt 属性为指定的语句句柄返回一个配置选项。该例使用 SQLGetStmtOption 函数确定由 OpenResultset 方法创建的游标类型。注意 rdoResultset Type 属性也提供该值。

Option Explicit
Dim en As rdoEnvironment
Dim cn As rdoConnection
Dim rs As rdoResultset
Dim rc As Integer
Dim CursorType As Long
Dim T As String

'将 SQLGetStmtOption Lib "odbc32.dll" (ByVal hstmt&, ByVal fOption%, ByRef pvParam As Any) 函数声明为 Integer

Private Sub Form_Load()
Set en = rdoEngine.rdoEnvironments(0)

en.CursorDriver = rdUseOdbc

Set cn = en.OpenConnection(dsName:="WorkDB", _
    prompt:=rdDriverNoPrompt, _
    Connect:="Uid=;pwd=;database=Pubs")

Set rs = cn.OpenResultset("Select * from Publishers", _
 rdOpenKeyset, rdConcurRowVer)

Select Case rs.Type
    Case rdOpenForwardOnly: T = "Forward-only"
    Case rdOpenStatic: T = "Static"
    Case rdOpenKeyset: T = "Keyset"
    Case rdOpenDynamic: T = "Dynamic"
End Select
MsgBox "RDO indicates that a " & T  _
   & " Cursor was created"
CursorType = 0
rc = SQLGetStmtOption(rs.hStmt,  _
   SQL_CURSOR_TYPE, CursorType)

Select Case CursorType
    Case SQL_CURSOR_FORWARD_ONLY: T = "Forward-only"
    Case SQL_CURSOR_STATIC: T = "Static"
    Case SQL_CURSOR_KEYSET_DRIVEN: T = "Keyset"
    Case SQL_CURSOR_DYNAMIC: T = "Dynamic"
End Select
MsgBox "ODBC indicates that a " & T  _
   & " Cursor was created"
End Sub


Item 属性（RDO）

根据位置或根据键，返回远程数据对象 (RDO) 集合对象中的一个指定的成员。

语法

object.Item(index)

Item 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
index | 需要。是一个表达式，指示集合成员的位置。如果是一个数字表达式，索引必须是一个从 1 到集合的 Count 属性值之间的一个数字。如果是一个字符串表达式，当引用的成员被添加到集合中时，索引必须对应于指定的键参数。

说明

一般来说，Item 属性既可以通过序数又可以通过键值，来选取集合成员。

如果作为索引提供的值，与任何集合中已存在的成员都不匹配，就产生一个错误。

Item 属性是集合的缺省的方法，偶尔也用于引用集合成员。因此下列代码行是等效的：

Print MyCollection(1)
Print MyCollection.Item(1)


KeyColumn 属性

返回或设置一个值，指示这个列是否是该主键部分。

语法

object.KeyColumn [= value]

KeyColumn 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 布尔表达式，如下面“说明”中所述。

设置值

KeyColumn 属性有这些设置值：

设置 | 描述
True | 如果列是主键部分。
False | （是缺省值） 如果列不是主键部分。

说明

该属性指示列是否是结果集的主键部分。当使用客户端的批游标库（CursorDriver 属性设置为 rdUseClientBatch）时，这个属性将被读/写，并且当使用服务器端的游标或 ODBC 游标库访问时，产生一个可以捕获的错误。

当使用客户端的批游标库时，可以设置该属性来指示哪些列构成结果集的主键。在一个开放式批更新过程中，当为更新、删除/插入语句构造 WHERE 子句时，它可以加速游标库。


KeysetSize 属性（远程数据）

返回或设置一个值，用以指示在键集缓冲区中的行数。

语法

object.KeysetSize [= value]

KeysetSize 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Long 表达式，如下面设置值中所述。

设置值

value 的设置值必须大于或等于 RowsetSize 属性。

说明

KeysetSize 属性是一个值，该值为键集类型或动态类型的 rdoResultset，游标指示在键集中的行数。如果键集的大小为 0 （是缺省值），则该游标完全是键集驱动的。如果键集的大小大于 0，则该游标是包含游标（在键集内是键集驱动的而在键集外是动态的）。

如果 KeysetSize 是一个比 RowsetSize 大的值，该值定义了在由驱动程序缓冲的键集中行数。

并非所有的 ODBC 数据源 都支持键集游标。

注意 因为 Microsoft SQL Server version 2.5 版本的 ODBC 驱动程序不支持包含风格的游标，因此如果设置一个 value ， KeysetSize 就被复位为 0 ，驱动程序返回 01S02 号错误： “选项的值被改变。”

警告 当使用 rdConcurLock 并发（保守式）时， KeysetSize 确定游标第一次被打开时锁定的行数。只要该游标保持为打开状态，整个键集就保持锁定。


LastModified 属性（远程数据）

返回一个书签，指向最新添加或改变的行。

语法

object.LastModified

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

该属性的返回值是一个 Variant（字符串） 数据类型，如下面“说明”中所述。

说明

在使用 AddNew 方法添加一个新行，或使用 Update 方法编辑一个已存在的行之后， LastModified 属性返回一个作为指针的书签指向最新修改的行，提供键集支持添加。如果将新行添加到键集和下一级数据表中，则 LastModified 属性将指向键集中的新行。为了将当前行指针定位到该行，设置该（相同） rdoResultset 对象的 Bookmark 属性为 LastModified 属性。

如果这个 rdoResultset 并未作过修改，则 LastModified 属性返回为 0 。

并非所有类型的 rdoResultsets 都支持对它们的键集的增加，因此，即使是刚添加一个行，该 LastModified 属性也可能会返回 0 。例如，静态 ODBC 游标可以被更新，而它的行集不能再添加。可以往数据库插入，但不能往键集插入，因此在这种情况下，该 LastModified 属性总是返回为 0 。

服务器端的键集游标支持向键集进行添加，使 AddNew 方法象 Update 方法那样设置 LastModified 属性。

客户器端的静态游标不向游标的成员添加新行，于是，在使用 AddNew 方法时未定义 LastModified 属性。

动态的和仅向前的游标不支持书签（如返回 False 的 Bookmarkable 属性所指出的那样），所以， LastModified 属性与这些游标无关。

客户器批游标库也支持 LastModified 属性。对于静态游标，将新行添加到游标成员上，使 AddNew 方法象 Update 方法那样设置 LastModified。


LastModified、Bookmark 属性示例

该例是说明使用 LastModified 属性，将当前行指针重新定位到由 RDO 最新修改的行。代码打开对 SQL Server 的一个连接，创建一个对 Authors 表的基于键集游标的查询。该查询需要一个参数传递 Author 的姓名到编辑。一旦选择了编辑或是更新，则通过将 rdoResultset 的书签属性设置为 LastModified 属性，把行指针重新定位到最新修改的行。

Option Explicit
Dim er As rdoError
Dim cn As New rdoConnection
Dim qy As New rdoQuery
Dim rs As rdoResultset
Dim col As rdoColumn

Private Sub TestLM_Click()
qy(0) = LookFor.Text

rs.Edit
rs!City = NewCity.Text   '一个 TextBox 控件
rs.Update

rs.Bookmark = rs.LastModified

'在 picture 控件中简单显示数据
Pic.Cls   '清该 picture 控件。

For Each col In rs.rdoColumns
    Pic.Print col.Name,
Next
Pic.Print String(80, "-")
For Each col In rs.rdoColumns
    Pic.Print col,
Next

End Sub

Private Sub Form_Load()
cn.CursorDriver = rdUseOdbc
cn.Connect = "uid=;pwd=;server=sequel;" _
   & "driver={SQL Server};database=pubs;dsn='';"
cn.EstablishConnection

With qy
    .Name = "ShowWhite"
    .SQL = "Select * from Authors " _
      & " where Au_LName like ?"
    .LockType = rdConcurReadOnly
    .CursorType = rdOpenForwardOnly
    .RowsetSize = 1
    Set .ActiveConnection = cn
End With

qy(0) = LookFor.Text      '一个 textbox 控件
Set rs = qy.OpenResultset(rdOpenKeyset, rdConcurRowver)

Exit Sub
End Sub


LastQueryResults 属性

返回由上个查询，如有的话，生成的 rdoResultset 对象的引用。

语法

object.LastQueryResults

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

LastQueryResults 属性的返回值是一个对象表达式，指示一个有效的 rdoResultset ，如果没有可用的结果集，返回为空。

说明

如果在这个连接上执行的最近一次查询生成了rdoResultset 对象的话，该新属性将包含对该对象的引用。这个属性的必要性来自象方法那样的查询命令，它允许开发者象调用父连接对象的方法那样调用他们的查询和存储过程。因为存储过程可以返回一个值及一个结果集，开发人员需要该属性得到对结果集的引用，结果集是在最近一次象方法调用那样的查询中创建的。开发人员可如下所示使用这个属性：

Dim RetCode As Long
Dim rs as rdoResultset
RetCode = MyConnection.MyQuery(x,y,z)
Set rs = MyConnection.LastQueryResults

该属性在连接的下个查询执行时被置回“Nothing”。即使开发人员使用 OpenResultset 或 Execute 方法代替调用该查询作为一种连接对象的方法，这个属性也将由在连接上运行的任意查询设置。


LockEdits 属性（远程数据）

返回一个布尔 值，指向有效的锁定的类型。

语法

object.LockEdits

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

LockEdits 的返回值是：

设置 | 描述
True | 保守式锁定是有效的。
False | （是缺省值）开放式锁定是有效的。

说明

如果锁定一数据页，并且数据源使用页面锁定，其它用户就不能编辑那个页面中的行。如果使用行级锁定，就将被编辑的行及行集中的其它各行都锁定。该行集被定义为由 RowsetSize 属性指定的行数。如果 LockEdits 为 True ，并且其它用户已经将该页面锁定，那么当使用 OpenResultset 方法时将产生一个错误。通常，其它用户可以从锁定的页面读取数据。

如果 LockEdits 为 False（缺省值） ，并且当该页面被另一个用户锁定后使用了 Update ，就产生一个错误。为了查看另一个用户对你的行所作的修改（丢失了你的修改），设置 rdoResultset 对象的 Bookmark 属性为其本身。

注意 数据页面的大小由数据源确定。 Microsoft SQL Server 使用的数据页面为 2K。


LockType 属性（远程数据）

返回或设置Long 整数值，指向并发处理的类型。

语法

object.LockType [= value]

LockType 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
Value | 常数或 Long 值，如下面设置值中所述。

设置值

value 的设置值是：

常数 | 值 | 描述
RdConcurReadOnly | 1 | （缺省值）游标是只读的。不允许更新。
RdConcurLock | 2 | 保守式并发。
RdConcurRowVer | 3 | 以行 ID 为基础的开放式 并发。
rdConcurValues | 4 | 以行值为基础的开放式并发。
rdConcurBatch | 5 | 使用批方式更新的开放式并发。为每个成功地更新了的行返回 Status 值。

说明

为了维持对正在修改的数据适当的控件， RDO 提供了大量的并发选项，用于控制如何授予或是拒绝其它用户访问那个正被修改的数据。在大多数情况下，当使用 LockType 设置值之一锁定一个特殊的行时，远程的引擎也将可能锁定包含该行的整个页面。如果锁定的页面太多，远程的引擎还可以将页面锁定升级为一个表锁定以提高整个系统的性能。

并非所有的锁定类型都被所有的数据源支持。例如， SQL Server 和 Oracle 服务器是使用 rdUseODBC 游标库，静态类型 rdoResultset 对象只能支持 rdConcurValues 或 rdConcurReadOnly 。

如果数据源不支持这个并发选项，驱动程序在运行时就用另一个可用的并发选项替换。如果驱动程序不能用另一个合适的并发选项来替换时，就引发一个可以捕获的错误（SQL 状态码 01S02 “选项值被改变”）。对于 rdConcurValues ，驱动程序替换 rdConcurRowVer 。反之亦然， 对于 rdConcurLock ，驱动程序按顺序替换： rdConcurRowVer 或 rdConcurValues 。

选取并发选项

注意 RDO 并发的作用不同于数据访问对象 (DAO) 。仔细体会下列各部分，为应用程序确定并发控件最好的类型。

  • 只读的并发：这个选项不给取出的行强加任何独占锁定。可是在大多数情况下，必须被授权一个共享锁定来访问那些行。换言之，其它用户不能对正在访问的页面进行独占锁定（读写或写锁定）。选取该选项使游标为只读。但这并不排除使用操作查询更新独立于那个游标的数据。这是缺省的 LockType 。

  • 保守式并发：这个选项需要对游标行进行一个立即的独占锁定，这为充分保证可以更新该行提供了最低级的锁定。与 DAO 不同， DAO 是在使用 Edit 方法之前不作锁定，而 RDO 是当游标第一次用 OpenResultset 方法打开时，就锁定结果集的 RowsetSize 行。也就是说，如果 RowsetSize 是 100 行，远程引擎就被命令锁定每个含有这些所选行之一的页面。这意味着可以锁定到 100 个页面──这可能锁定几百行。当当前行指针在结果集中从头至尾移动时另外的页面被锁定，而不再引用的页面就被释放了。这种技术保证你的应用程序而不是其它的应用程序被授权独占（读写）访问由该游标正在处理的任意行。

  • 开放式并发：这种类型的并发管理不锁定任何行或页面-它只是简单地将正被送往数据库的行与当前存在服务器中的行比较。根据选取的开放式并发的类型， RDO 和 ODBC 层将行 ID 、行数据值、 TimeStamp 列或这些选项的组合与现存数据比较，以确定是否有行在最后一次取出之后作了改变。如果在最后一次取出之后并没有任何变化，就作更新。否则，应用程序就触发一个可以捕获的错误。

LockType 属性支持以下所述的三种开放式并发。当使用开放式批并发选项（rdConcurBatch）时，应该也设置 UpdateCriteria 属性以选取一个相应的更新并发选项。

  • 开放式并发- 行版本 Row Version：通过比较行标识符（通常是一个 TimeStamp 列）， RDO 能够确定在最后一次取出之后该行是否有了变化。如果有，产生一个可以捕获的错误。

  • 开放式并发- 行值 Row Values：通过逐列比较行值，RDO 能够确定在最后一次取出之后该行是否已经改变。如果有，产生一个可以捕获的错误。

  • 开放式批处理：该类型的并发使用 UpdateCriteria 属性确定，当使用 UpdateBatch 方法时，如何测试行是否已经改变。


LoginTimeout 属性（远程数据）

返回或设置一个指定秒数的值，该值是当打开连接时，ODBC 驱动程序管理器用于等待产生超时错误的时间。

语法

object.LoginTimeout [= value]

LoginTimeout 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Long 整数，表示驱动程序用于超时等待以及返回一个错误的秒数。

说明

如果 value 为 0 ，不会发生超时，并且如果连接未创建时也不产生错误。如果不使用异步连接，也许会使应用程序处于无限等待的状态。

当要与 ODBC 数据库，如 SQL Server，连接时，也许会因为网络阻塞或过度使用 ODBC 数据源而延时。为了不无限的等待，可以指定等待的时间，之后 ODBC 驱动程序管理器就产生一个错误。

缺省的超时值是 15 秒，或是由 rdoDefaultLoginTimeout 属性指定的值。当使用 rdoEnvironment 对象时， LoginTimeout 属性为所有与该 rdoEnvironment 相关的登录操作指定一个全局值。 rdoConnection 对象的 LoginTimeout 设置取代该缺省值。

如果指定的超时大于数据源中的最大超时，或小于数据源中的最小超时，驱动程序就替换掉那个值，并且在 rdoErrors 集合中登录一个错误： SQLState 01S02 选项值被改变。

一般来说，用 8 秒钟就可以完成到局域网 (LAN) 上远程服务器的连接。远程访问服务 (RAS) 或网际连接需要的时间较长，主要取决于广域网的带宽、加载或其它因素。


LogMessages 属性（远程数据）

允许 ODBC 跟踪登录并返回或设置一个值，该值指向由 ODBC 驱动程序管理器创建的记录所有的 ODBC 操作的 ODBC 跟踪文件的路径，。

语法

object.LogMessages [= value]

LogMessages 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | String 表达式，如下面“说明”中所述。

设置值

Value 包含一个 ASCII 文件的路径，该文件用于登录 ODBC 操作，如果 LogMessages 属性是一个空字符串，就不作登录。

说明

当 LogMessages 属性为 True 时，所有的 ODBC 命令传到一个 ASCII 登录文件，该文件用于调试、协调查询、或其它操作。

在 Windows NT 或 Windows 95 中，跟踪只用于单个应用程序，或是每个应用程序都指定不同的跟踪文件。否则，两个及两个以上应用程序会在同时打开同一个跟踪文件，这将造成一个错误。

注意 当允许登录时，对 ODBC 性能有不利的影响。


MaxRows 属性（远程数据）

设置值返回或设置一个值， 指向从查询或操作查询中处理返回的最大行数。

语法

object.MaxRows [= value]

MaxRows 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Long 表达式，如下面“说明”中所述。

设置值

value 的设置范围是从 0 到任一数字。如果 value 被置为 0（缺省值），则对返回的行数没有限制。设置成负数的值是无效的，并会被自动设置成 0。

说明

MaxRows 属性限制由远程服务器处理的行数。当 MaxRows 被置为一个比 0 大的数字时，就只能处理 'n' 行。当执行一个返回行的查询时 ，这意味着只返回前 'n' 行。当执行一个操作查询，这意味着，只有前 'n' 行被更新、插入或删除。

当遇到有限的资源不允许管理大结果集行时，该属性是有用的。设置操作查询的 MaxRows 为 1 ，可以保证只有一行受该操作的影响。


MoreResults 方法示例

下面示例说明使用 MoreResults 方法。在例中，执行含有三个独立的 SELECT 查询的 SQL 查询。第一个查询简单地返回在 Publishers 表中的出版人的人数。其后的两个查询每次都从更复杂的连接操作中返回两个列结果。所有这些信息都在一个 ListBox 控件中显示。

Option Explicit
Dim Cn As New rdoConnection
Dim Rs As rdoResultset
Dim SQL As String

Private Sub Test_Click()
SQL = "Select Count(*) From Publishers" _
   & " Select Pub_Name, Title  " _
   & " From Publishers P, Titles T" _
   & " Where P.Pub_ID = T.Pub_ID" _
   & " Select Au_Lname, Title " _
   & " From Titles T, TitleAuthor Ta, Authors A" _
   & " Where T.title_ID = ta.Title_ID " _
   & " and Ta.Au_ID = A.Au_ID"
Set Rs = Cn.OpenResultset(SQL, rdOpenForwardOnly, _
   rdConcurReadOnly)
'从第一个结果集开始
List1.AddItem "Publishers: " & Rs(0)
'
'   循环往过其余的结果集
'
Do While Rs.MoreResults
   List1.AddItem Rs(0).Name & " - " & Rs(1).Name
   Do Until Rs.EOF
      List1.AddItem Rs(0) & "     -    " & Rs(1)
      Rs.MoveNext
   Loop
Loop
End Sub

Private Sub Form_Load()
On Error GoTo CnEh
With Cn
   .Connect = "UID=;PWD=;Database=Pubs;" _
   & "Server=SEQUEL;Driver={SQL Server}" _
   & "DSN='';"
   .LoginTimeout = 5
   .CursorDriver = rdUseOdbc
   .EstablishConnection rdDriverNoPrompt, True
End With
Exit Sub

CnEh:
Dim er As rdoError
Debug.Print Err, Error
For Each er In rdoErrors
   Debug.Print er.Description, er.Number
Next er
Resume Next
End Sub


Move 方法示例

下面示例说明如何将 rdAsyncEnable 选项和 MoveLast 一起使用。Phones 是一个有 15，000 多行的简单的表，需要花费一些时间作处理。这并不是一个推荐的技术，它只是提供一种方法来说明一个长时间运行并全部移居的查询－就象执行 MoveLast 方法一样。该应用程序使用状态条指示操作完成的程度。

Option Explicit
Dim rdoCn As New rdoConnection
Dim rdoRs As rdoResultset
Dim SQL As String
Dim TimeExpected As Single
Dim Ts As Single, Tn As Single

Private Sub Command1_Click()
TimeExpected = 5      '希望它使用 5 秒
SQL = "Select Email, Name From Phones"
Set rdoRs = rdoCn.OpenResultset(Name:=SQL, _
   Type:=rdOpenStatic, _
   LockType:=rdConcurReadOnly, _
   Option:=rdAsyncEnable)
ShowProgress "Query"
    '
'   查询已经完成... 现在移到最后一行
    '
rdoRs.MoveLast rdAsyncEnable
'希望它使用 15 秒
TimeExpected = 15
ShowProgress "MoveLast"
rdoCn.Close
End Sub

Sub ShowProgress(Operation As String)
Ts = Timer
'  执行查询的时间
ProgressBar1.Max = TimeExpected
While rdoRs.StillExecuting
   Tn = Int(Timer - Ts)
   If Tn < TimeExpected Then
      ProgressBar1 = Tn
   Else
      ProgressBar1.Max = ProgressBar1.Max + 10
      TimeExpected = ProgressBar1.Max
   End If
   DoEvents
Wend
Status = Operation & "Done. Duration:"  _
   & Int(Timer - Ts)
End Sub
Private Sub Form_Load()
With rdoCn
   .Connect = "UID=;PWD=;Database=WorkDB;" _
   & "Server=BETAV486;Driver={SQL Server}" _
   & "DSN='';"
   .LoginTimeout = 5
   .EstablishConnection rdDriverNoPrompt, True
End With
Exit Sub
End Sub


Name 属性（远程数据）

返回 RemoteData 对象的名称。

语法

object.Name

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Name 属性返回一个字符串表达式，用以表示分配给对象的名称。下表说明如何给每个对象分配名称：

为远程数据对象指定 Name 属性

远程数据对象 | Name 属性由…确定
rdoEnvironments(0) | rdoEngine － 设置为“缺省的环境”。
rdoEnvironments(1-n) | rdoCreateEnvironment 的 name 参数。
rdoConnection | 用于连接的数据源名 (DSN)。
rdoResultset | SQL 查询的前 256 个字符。
RdoQuery | CreateQuery 方法的 name 参数，或是为独立方式的 rdoQuery 对象直接设置。
RdoTable | 一旦 rdoTables 集合被移居的数据库表名。
RdoParameter | "Paramn"，其中 "n" 为序数。
RdoColumn | 数据库列的名称。
RdoError | 不能应用。 rdoErrors 集合成员只能通过序数来引用。

说明

rdoTable 和 rdoQuery 对象不能共享相同的名称。换言之，不能创建两个同名的 rdoQuery 对象。

可在代码中使用 Name 属性引用集合中的成员，但在大多数情况下，简单地使用序数更为容易。一般来说，可以使用该 Name 属性映射数据库表名和列名。


Name 属性示例 (RDO)

下例说明使用 Name 属性陈列所有与选取的数据库相关的表的名称，所选表各列的名称，以及所选列的指定类型信息。该应用程序使用三个 Listbox 控件和一个 Command 按钮控件。

Option Explicit
Dim en As rdoEnvironment
Dim cn As rdoConnection
Dim rs As rdoResultset
Dim tb As rdoTable
Dim cl As rdoColumn
Dim er As rdoError

Private Sub Command1_Click()
Set en = rdoEngine.rdoEnvironments(0)

Set cn = en.OpenConnection(dsName:="WorkDB", _
    prompt:=rdDriverNoPrompt, _
    Connect:="Uid=;pwd=;database=Pubs")

For Each tb In cn.rdoTables
    List1.AddItem tb.Name
Next
List1.ListIndex = 1
End Sub

Private Sub List1_Click()
List3.Enabled = False
List2.Clear
For Each cl In cn.rdoTables((List1)).rdoColumns
    List2.AddItem cl.Name
Next
List3.Enabled = True
End Sub

Private Sub List2_Click()
List3.Clear
With cn.rdoTables((List1)).rdoColumns((List2))
    List3.AddItem "Source Column:" & .SourceColumn
    List3.AddItem "Source Table:" & .SourceTable
    List3.AddItem "Type:" & .Type
    List3.AddItem "Size:" & .Size
    List3.AddItem "Ordinal Position:"  _
   & .OrdinalPosition
    List3.AddItem "Allow Zero Length ?" _
    & .AllowZeroLength
    List3.AddItem "Required:" & .Required
    List3.AddItem "Chunk Required?:" & .ChunkRequired
    List3.AddItem "Updatable?:" & .Updatable
End With
End Sub


Number 属性（远程数据）

返回一个数字值，用于指定一个本地错误。

语法

object.Number

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

该返回值是一个Long整数，表示一个错误号。

说明

使用 Number 属性确定一个错误的性质，该错误发生在远程服务器上，或是在与数据源接口的 ODBC 中。该属性的值对应于一个唯一的数字，该数字对应由存储过程、一个语法的或其它过程的错误、侵犯了一个权限或规则、以及其它类型的错误而产生的一个错误条件。这种本地错误号也会由于远程过程执行了一个象 SQL Server 的 RAISERROR 那样的语句而产生。

注意 SQL Server 错误的重要程度级别不是由 ODBC 驱动程序返回的，因此是不可用的。


错误说明及 Number 属性示例

下列代码是打开一个对应于 SQL Server "SEQUEL" 的只读 ODBC 游标连接并包含一个简单的错误处理程序，该程序显示错误说明及错误号。

Sub MakeConnection()
Dim rdoCn As New rdoConnection
On Error GoTo CnEh
With rdoCn
    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=SEQUEL;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .CursorDriver = rdUseODBC
    .EstablishConnection rdDriverNoPrompt, True
End With
AbandonCn:
Exit Sub

CnEh:
Dim er As rdoError
Dim msg as string
    Msg = "An error occured " _
    & "while opening the connection:" _
    & Err & " - " & Error & VbCr
    For Each er In rdoErrors
        Msg = Msg & er.Description  _
         & ":" & er.Number & VbCr
    Next er
    Resume AbandonCn
End Sub


Options 属性（远程数据）

返回或设置值，用以指定该 RemoteData 控件的一个或多个操作特性。

语法

object.Options [= value ]

Options 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 常数或 Integer ，如下面“说明”中所述。

设置值

使用下列各值为 RemoteData 控件设置 Options 属性：

常数 | 值 | 描述
rdAsyncEnable | 32 | 异步地执行查询。
rdExecDirect | 64 | 使用 ODBC SQLExecDirect API 函数执行查询。

说明

该属性与 OpenResultset 和 Execute 方法中的 options 参数对应。如果在运行时改变了该 Options 属性，必须使用 Refresh 方法消除此改变所产生的影响。

允许异步操作

异步操作允许 RemoteData 对象可在后台进行象创建结果集、执行过程等操作，而前台代码可以继续工作。

无论何时使用带有 rdAsyncEnable 选项的 OpenResultset ， Execute ， Move 或 MoreResults 方法，控件立即返回到你的应用程序－在 RDO 完成该操作之前。如果需要， RDO 定期检查数据源以查看该操作是否已经完成。通过设置 AsyncCheckInterval 属性，可调整轮询频率。为了查看该操作是否已经完成，可检查 StillExecuting 属性，在 RDO 完成该操作之前，该属性保持为 True 。为了取消该操作，使用 rdoResultset 对象的 Cancel 方法。除此之外，当查询完成后， RDO 引发 QueryComplete 事件，指出该 rdoResultset 已作好访问的准备。

允许使用 SQLExecDirect

如果使用 rdExecDirect 选项， RDO 使用 SQLExecDirect ODBC API 函数执行查询。在这种情况下，不需要创建临时的存储过程执行查询。如果在应用程序的过程中不希望多次执行查询，该选项可以节约时间。.除此之外，当查询不是由存储过程运行，而是直接运行时，这个选项是强制性的。例如，在为随后的查询创建临时表的查询中，必须使用 rdExecDirect 选项。


OrdinalPosition 属性（远程数据）

返回 rdoColumns 集合中 rdoColumn 对象的相关位置。

语法

object.OrdinalPosition

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

OrdinalPosition 属性的返回值是一个 Integer 表达式，如下面“说明”中所述。

说明

被返回的 rdoResultset 中的每一数据列是按查询指定的顺序排列的，编号从 1 开始。根据这个编号原则，rdoResultset 的第一个列（rdoResultset（0））的 OrdinalPosition 为 1 。


OrdinalPosition 属性示例

下例是说明如何使用 OrdinalPosition 属性给列编号。

Private Sub ShowOrdinals()
Dim rs As rdoResultset
Dim cn As New rdoConnection
Dim cl As rdoColumn
Dim er As rdoError

On Error GoTo EH
With cn
    .Connect = "uid=;pwd=;server=SEQUEL;" _
    & "driver={SQL Server};database=pubs;" _
    & "DSN='';"
    .CursorDriver = rdUseNone
    .EstablishConnection rdDriverNoPrompt
    Set rs = cn.OpenResultset( _
      "select * from titles where Price < 50")
    For Each cl In rs.rdoColumns
        Debug.Print cl.OrdinalPosition,  _
         cl.Name, cl.Value
    Next
End With
Exit Sub
EH:
    For Each er In rdoErrors
        Debug.Print er.Description
    Next er
    Resume Next
End Sub


OriginalValue 属性

返回第一次从数据库取出时列的值。.

语法

object.OriginalValue

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

OriginalValue 属性的返回值是一个 Variant 值，其数据类型由 rdoColumn 的数据类型确定。

说明

当工作于开放式批更新操作时，可能需要将由 RDO 返回的原始的列值与用户提供的值相比较来解决更新冲突。当第一次从数据库取出时，OriginalValue 属性提供该值。


Password 属性（远程数据）

表示在创建 rdoEnvironment 对象中使用的密码。.

语法

object.Password

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

说明

如果不提供密码，rdoEngine 对象的 rdoDefaultPassword 属性就用作缺省值。初始缺省密码是""。

该属性的设置是只写的－它只能在代码中提供，不能从 Password 属性读出。

下列情况设置该密码：

  • 当 RemoteData 控件自动创建 rdoEnvironment 。

  • 对 RemoteData 对象的第一次引用。

  • 当执行 rdoCreateEnvironment 方法。

  • 在连接字符串中通过 Connect 属性或 OpenConnection 方法的 Connect 参数。


PercentPosition 属性（远程数据）

返回或设置一个值，该值以 rdoResultset 中的行数百分比为基准指示或改变 rdoResultset 对象中的当前行的大致位置。

语法

object.PercentPosition [= value]

PercentPosition 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 在 0.0 和 100.00 之间的数字。（数据类型为 Single）

说明

为了指示或改变当前行在 rdoResultset 中的大致位置，可以检查或设置 PercentPosition 属性。在检查或设置该 PercentPosition 属性之前，通过移动到最后一行来移居 rdoResultset 。如果在完全移居 rdoResultset 之前，使用 PercentPosition 属性，移动的量与访问的行数有关－ 如 RowCount 属性所指示的。可以使用 MoveLast 方法移动到最后一行，移居 rdoResultset 。

注意 并不建议使用 PercentPosition 属性将当前行移动到 rdoResultset 中的一个指定的行－Bookmark 属性或 AbsolutePosition 属性更能胜任此工作。

一旦将 PercentPosition 属性设为某值，在相应于该值的那个大致位置的行就成为当前行，并且该 PercentPosition 属性又将重新设置以反映这个当前行的大致位置。例如，如果 rdoResultset 只有 5 行，如果设置其 PercentPosition 值为 77 ，从该 PercentPosition 属性返回的值是 80 而不是 77 。

可以在一个 Form 或 TextBox 上使用带有一个滚动条的 PercentPosition 属性，来指示在 rdoResultset 中的当前行的位置。

不是所有的游标 类型和驱动程序都支持 PercentPosition 属性。例如，该属性只能用于键集类型 和动态类型的 rdoResultset 对象。如果不支持该设置， PercentPosition 属性返回 50 。如果不能设置位置，就不产生移动。


PercentPosition 属性示例

下例说明 PercentPosition 属性的使用。在该例中，生成一个出版人列表，并且当选取他们其中之一时，就在DataGrid控件中显示相关的标题列表。当操纵与该网格相关的滚动条后，通过检查 PercentPosition 属性可确定所选行的相关位置并予显示。有关本例的更多细节，请参阅 AbsolutePosition 属性的示例。

Dim rs As rdoResultset

Private Sub Form_Load()
Dim Li As Integer
'
'   填写 Sections 列表组合框。
'
Set en = rdoEnvironments(0)
Set cn = en.OpenConnection(dsName:="", _
    Prompt:=rdDriverNoPrompt, _
    Connect:="uid=;pwd=;driver={SQL Server};" _
        & "server=BETAV486;database=pubs;")

MsRdc1.Connect = cn.Connect

Set rs = cn.OpenResultset _
    ("Select distinct Pub_Name, Pub_ID from Publishers", rdOpenStatic, rdConcurReadOnly)
Do Until rs.EOF
    If rs(0) = Null Then
    Else
        PubList.AddItem " " & rs!Pub_ID & ":" & rs!Pub_Name
    End If
    rs.MoveNext
Loop
PubList.ListIndex = 1
rs.Close

Publist_Click

End Sub

Private Sub MoveCRow_Change()
MoveCRow_Scroll
End Sub

Private Sub MoveCRow_Scroll()
PercentPoint = MoveCRow.Value & "%"
MsRdc1.Resultset.PercentPosition = MoveCRow.Value
End Sub

Private Sub Publist_Click()
SetSQL
If MsRdc1.Resultset.EOF Then
    MoveCRow.Enabled = False
Else
    MoveCRow.Enabled = True
    MsRdc1.Resultset.MoveFirst
End If
End Sub

Sub SetSQL()
Dim PubWanted As String
PubWanted = Trim(Left(PubList, InStr(PubList, ":") - 1))
Screen.MousePointer = vbHourglass

MsRdc1.SQL = "select * from Titles" _
    & " where Pub_ID = '" _
    & PubWanted & "'" _
    & " order by Title"
MsRdc1.Refresh
Screen.MousePointer = vbDefault
End Sub


Prepared 属性

返回或设置一个值，用以确定查询是否已准备好使用 SQLPrepare 或 SQLExecDirect ODBC API 函数。

语法

object.Prepared [= value]

Prepared 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Boolean 表达式，如下面“说明”中所述。

设置值

Prepared 属性有这些设置值：

设置 | 描述
True | 语句是准备好的。（是缺省值）
False | 语句是未准备好的。

说明

缺省的 Prepared 属性为 True 。可是，也可以设置这个属性为 False 来禁止查询的“准备”。在这种情况下，该查询执行时使用 SQLExecDirect API 。

当 ODBC 接口给远程服务器提交一个查询时，或者直接给该服务器提交这个查询，或者创建一个存储过程执行该操作。 创建一个存储过程会延缓初始化操作，但可提高所有随后的对该查询进行引用的性能。不过，有些查询不能在存储过程的窗体中执行。此时，必须设置该 Prepare 属性为 False 。


Prompt 属性（远程数据）

返回或设置值，用以指示 ODBC 驱动程序管理器 是否应该提示丢失连接字符串参数。

语法

object.Prompt [= value]

Prompt 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 常数或 Integer ，如下面设置值中所述。

设置值

Prompt 属性的设置值是：

常数 | 值 | 描述
rdDriverPrompt | 0 | 驱动程序管理器显示 ODBC 数据源对话框。用于创建连接的连接字符串，由用户通过对话框选择并完成的数据源名 (DSN) 来构造。否则，如果没有选取 DSN 并且 DataSourceName 属性为空，就使用缺省的 DSN 。
rdDriverNoPrompt | 1 | 驱动程序管理器使用在 connect 中提供的连接字符串。如果未提供足够的信息， OpenConnection 方法返回一个可以捕获的错误。
rdDriverComplete | 2 | 如果所提供的连接字符串包含 DSN 关键字， 驱动程序管理器就使用在 connect 中提供的字符串，否则，它的行为如同规定 rdDriverPrompt 时所作的一样。
rdDriverCompleteRequired | 3 | （是缺省值）对任何不要求完成连接的信息，驱动程序都使控制无效。除此之外，其它与 rdDriverComplete 一样。

说明

当 RDO 根据 RemoteData 控件的参数打开一个连接时，Connect 属性需要包含足够的信息来创建该连接。如果没有提供诸如数据源名，用户名，或密码等信息， ODBC 驱动程序管理器就显示一个或多个对话框，从用户处得到这些信息。如果不希望这些对话框出现，就按照禁止该特性的要求设置 Prompt 属性。

上述内容也用于为 EstablishConnection 方法设置 ODBC 提示行为。


QueryTimeout 属性（远程数据）

返回或设置秒数值，用以指示当执行一个查询时产生一个超时错误之前 ODBC 驱动程序管理器的等待时间。

语法

object.QueryTimeout [= value]

QueryTimeout 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 长 Long 整数，表示驱动程序用于超时等待并返回一个错误的秒数。

说明

缺省的 QueryTimeout 属性设置是 30 秒。当使用 OpenResultset 或 Execute 方法访问一个 ODBC 数据资源时，也许会因为网络阻塞或过度使用远程服务器而延时- 也许就是你的查询引起的。为了不无限的等待，可以使用 QueryTimeout 属性指定应用程序的等待的时间，这样超时后就引发 QueryTimeout 事件，应用程序就捕获一个可捕获的错误。这时，有选项供选择，是继续下一个由 QueryTimeout 属性确定的 'n' 秒的等待，还是使用 QueryTimeout 事件过程中的 Cancel 参数取消该正在进行的查询。

设置该属性为 0 禁止计时器，以便查询将无限期地运行。由于在整个查询期间你的应用程序可能被阻塞，因此不建议同步操作时设置 QueryTimeout 为 0。

当使用 rdoConnection 对象时， QueryTimeout 属性为所有与数据源相关的查询，指定一个全局值。

当使用一个 rdoQuery 对象时，rdoConnection 对象的 QueryTimeout 属性就作为缺省值，直到在该 rdoQuery 对象的 QueryTimeout 属性中指定了一个新值为止。

当以异步查询方式工作时，在该查询完成之前或是该查询发生超时之前，StillExecuting 属性一直保持为 True 。

如果指定的超时大于数据源允许的最大超时，或小于数据源允许的最小超时，驱动程序就替换掉那个值，并且在 rdoErrors 集合中登录一个错误： SQLState 01S02 ？"Option value changed."


QueryTimeout 属性、QueryTimeout 事件示例

下例创建查询事件处理程序以处理意外的查询超时。注意该 QueryTimeout 事件过程显示一个消息框 ，允许用户决定是否想为该查询再等待一个超时段。 ShowRows 过程简单地转储返回的行。

Option Explicit
Dim en As rdoEnvironment
Dim cn As New rdoConnection
Dim rs As rdoResultset
Dim SQL As String
Dim col As rdoColumn
Dim er As rdoError
Public WithEvents Qd As rdoQuery

Private Sub cn_QueryTimeout( _
   ByVal Query As RDO.rdoQuery, Cancel As Boolean)
Dim ans As Integer
ans = MsgBox("Query Timed out... Press Retry to continue waiting", _
    vbRetryCancel + vbCritical, "Query Took Too Long")
If ans = vbRetry Then
    Cancel = False
Else
    Cancel = True
End If
End Sub

Private Sub RunQuery_Click()

On Error GoTo RunQueryEH

    Qd(0) = Param1
    Qd.QueryTimeout = 5
    Set rs = Qd.OpenResultset(rdOpenKeyset, _
       rdConcurReadOnly)

    If rs Is Nothing Then Else ShowRows

Exit Sub

RunQueryEH:
Debug.Print Err, Error$
    For Each er In rdoErrors
        Debug.Print er.Description, er.Number
    Next
    rdoErrors.Clear
    Resume Next

End Sub

Private Sub Form_Load()
Set en = rdoEngine.rdoEnvironments(0)
With cn
    .Connect = "uid=;pwd=;database=workdb;dsn=WorkDB;"
    .CursorDriver = rdUseClientBatch
    .EstablishConnection Prompt:=rdDriverNoPrompt
End With

Set Qd = cn.CreateQuery("LongQuery", "")
With Qd
    .SQL = "{call VeryLongStoredProcedure (?,?)}"
    .rdoParameters(1).Direction = rdParamOutput
    .rdoParameters(0).Type = rdTypeVARCHAR
End With

End Sub


rdoColumns 属性

根据位置或键返回 rdoColumns 集合的一个指定成员。

Syntax

object.rdoColumns(index)

rdoColumns 属性语法包含以下部分：

部分 | 描述
object | 是一个对象表达式，其值等于”应用于”列表中的一个对象。
Index | 必需的。是用来指定一个集合成员的位置的表达式。如果是数值表达式，则 index 必须是在 1 和集合 Count 属性的值之间的数。如果是字符串表达式，则 index 必须与被引用的成员添加到集合中时指定的 key 参数相符合。

说明

该属性用于访问 rdoColumns 对象集合。例如，rdoQuery 对象有个 rdoColumns 属性，是用于 rdoQuery 对象的 rdoColumns 对象集合。


rdoConnections 属性

根据位置或键返回 rdoConnections 集合的一个指定成员。

语法

object.rdoConnections(index)

rdoConnections 属性语法包含以下部分：

部分 | 描述
object | 是一个对象表达式，其值等于”应用于”列表中的一个对象。
Index | 必需的。是用来指定一个集合成员的位置的表达式。如果是数值表达式，则 index 必须是在 1 和集合 Count 属性的值之间的数。如果是字符串表达式，则 index 必须与被引用的成员添加到集合中时指定的 key 参数相符合。

说明

该属性用于访问 rdoConnections 对象集合。例如，rdoEnvironment 对象有一个 rdoConnections 属性，是用于 rdoEnvironment 对象的 rdoConnections 对象集合。


rdoDefaultCursorDriver 属性

返回或设置 ODBC 驱动程序管理器使用的游标库。

语法

object.rdoDefaultCursorDriver [= value]

rdoDefaultCursorDriver 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Integer 常数或值，如下面设置值中所述，它指定 ODBC 游标的类型。

设置值

value 的设置值是：

常数 | 值 | 描述
rdUseIfNeeded | 0 | （是缺省值）RDO 选取最适合驱动程序的游标的样式。如果可能，使用服务器端的游标。
rdUseODBC | 1 | RDO 使用 ODBC 游标库。该选项对较小的结果集有较好的性能，而对较大的结果集，性能则大为降低。
rdUseServer | 2 | RDO 使用服务器端的游标。对绝大多数大的操作来说，它提供了较好的性能，但可能会造成网络阻塞。
rdUseClientBatch | 3 | RDO 使用优化的批游标库，将其作为所有批模式操作都需要的库，与 rdoResultset 对象无关。
rdUseNone | 4 | RDO 不建立一个可滚动的游标。这一般是一个仅向前的、只读的、RowsetSize 为 1 的结果集。这种类型的结果集，操作起来比那种需要建立游标的要快。

说明

当使用服务器端的游标时，数据库引擎使用其自己的资源保存键集值。数据值就象使用客户端的游标一样，仍然通过网络传送，但是本地工作站的内存和磁盘空间的拥挤现象却都减少了。

对于 SQL Server，如果游标是只读的或仅向前的，就不能使用服务器端的游标。


rdoDefaultErrorThreshold 属性

返回或设置一个值，用以指示 rdoQuery 对象的 ErrorThreshold 属性的缺省值。

注意 提供该属性是为了与 RDO version 1.0 的代码相兼容。现在它应该由实现 rdoEngine 对象的 InfoMessage 事件的代码来取代，它们的功能是一样的。

说明

在 Microsoft SQL Server version 4.x 中，不能用 RAISERROR 语句来设置错误的等级。其结果，就需要 ErrorThreshold 属性允许代码将这些超出等级阈值的消息过滤掉。

现在的 Microsoft SQL Server Version 6.x，可支持在 RAISERROR 语句中包含等级，所以就不再需要使用 ErrorThreshold 属性了。

所有被返回的等级小于 10 的错误，被 ODBC 层俘获并设置 SQL_SUCCESS_WITH_INFO 结果代码。这造成 RDO 引发 InfoMessage 事件，不过查询处理并不停止。


rdoDefaultLoginTimeout 属性

返回或设置一个缺省值，用以确定秒数，该秒数是 ODBC 驱动程序在中止一个试图与数据源相连接之前的等待时间。

语法

object.rdoDefaultLoginTimeout [= value]

rdoDefaultLoginTimeout 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Long 表达式，它用以指定秒数，“设置值”中有详细描述。

设置值

value 的设置值是等待秒数，它是登录成功的等待时间，超时之后将返回一个可以捕获的错误或引发一个 QueryTimeout 事件。如果设置为 0 表示没有超时限制，也就是说，连接将会处于无限等待的状态－ 除非登录完成。

说明

rdoDefaultLoginTimeout 属性时应用程序范围中的缺省值，除非用 rdoEnvironment 对象的 LoginTimeout 属性取代这个值。

当 RemoteData 控件建立一个 rdoConnection 对象时，或当使用 rdoEnvironment 对象的 OpenConnection 或 EstablishConnection 方法时，都会产生登录请求。其最大值依赖于数据源驱动程序。ODBC 驱动程序决定允许的最大 LoginTimeout 值－任何想大于该值的设置值均被重新设置为这个依赖驱动程序的最大值。

如果不指定，缺省的超时值是 15 秒。

当过了超时值后，就引发在其父 rdoEnvironment 对象上的 ConnectionTimeout 事件。

注意 当使用数据访问对象 (DAO)时，LOGINTIMEOUT 参数用在 Connect 属性中，但这并不是 ODBC 连接字符串的有效参数。可使用 rdoDefaultLoginTimeout 属性来代替。


rdoDefaultUser、rdoDefaultPassword 属性

  • rdoDefaultUser－返回或设置缺省的用户名，用以赋给任意新的 rdoEnvironment。

  • rdoDefaultPassword－返回或设置缺省的密码，用以赋给任意新的 rdoEnvironment。

语法

object.rdoDefaultUser [= value]

object.rdoDefaultPassword [= value]

rdoDefaultUser 和 rdoDefaultPassword 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 字符串表达式，用来指定用户名或指定密码。

说明

除非在 rdoCreateEnvironment 方法中提供其它的值，否则当建立 rdoEnvironment 对象时，rdoDefaultUser 和 rdoDefaultPassword 属性将确定要用的用户名和密码。当建立 rdoEnvironment 对象时，这些属性也能返回使用的名称。

按照缺省规则，rdoDefaultUser 和 rdoDefaultPassword 的值是 ""（一个零长度字符串）。


rdoEnvironments 属性

根据位置或键返回 rdoEnvironments 集合的一个特定成员。

语法

object.rdoEnvironments(index)

rdoEnvironments 属性语法包含以下部分：

部分 | 描述
object | 是一个对象表达式，其值等于”应用于”列表中的一个对象。
index | 必需的。是用来指定一个集合成员位置的表达式。如果是数值表达式，则 index 必须是在 1 和集合 Count 属性的值之间的数。如果是字符串表达式，则 index 必须与被引用的成员添加到集合中时指定的 key 参数相符合。

说明

该属性用于访问 rdoEnvironments 对象集合。例如，rdoEngine 对象有一个rdoEnvironments 属性，是用于 rdoEngine 对象的 rdoEnvironments 对象集合。


rdoErrors 属性

根据位置或键返回 rdoErrors 集合的一个指定成员。

语法

object.rdoErrors(index)

rdoErrors 属性语法包含以下部分：

部分 | 描述
object | 是一个对象表达式，其值等于”应用于”列表中的一个对象。
index | 必需的。是用来指定一个集合成员的位置的表达式。如果是数值表达式，则 index 必须是在 1 和集合 Count 属性的值之间的数。如果是字符串表达式，则 index 必须与被引用的成员添加到集合中时指定的 key 参数相符合。

说明

该属性用于访问 rdoErrors 对象集合。例如，rdoEngine 对象有一个 rdoErrors 属性，是用于rdoEngine 对象的 rdoErrors 对象集合。


RDO 事件示例

这个示例列举了几个远程数据对象 (RDO) 事件的处理程序。这段代码建立了一些事件变量和处理程序来捕获连接和查询事件。为了帮助说明 BeforeConnect 事件的使用，该代码将一个工作站的 ID 值连同当前时间串接在该连接串的尾端。这样做可标识在服务器上的一个特定连接。在此连接建立之后，代码执行一个需要花较长时间的查询，此查询的设计要运行大约一分钟。因为设置了一个 5 秒钟的 QueryTimeout 值，除非查询在5秒钟内能够返回，否则 QueryTimeout 事件就引发。注意查询本身是按异步执行，代码不轮询查询的完成。在这种情况下，代码只需等待表明该查询结束的 QueryComplete 事件或 QueryTimeout 事件引发。这段代码还允许请求另一个 5 秒钟的等待时间。

注意，要使该示例正确运行，必须先做一些事情，包括设置对 Remote Data 对象和 Common Dialog库的引用，将 CommandButton 和 Timer 控件添加入窗体，并且必须更改 Form_Load() 事件中的 ODBC 连接字符串，以指向有效的服务器。

Option Explicit
Private WithEvents cn As rdoConnection
Private WithEvents EngEv As rdoEngine
Dim er As rdoError
Dim strConnect As String
Dim rs As rdoResultset
Dim TimeStart As Single
Dim clock As Integer
Dim ShowClock As Integer
Dim QueryComplete As Integer
Dim InfoMsg As String
Dim Connected As Boolean
Dim ans As Integer
Private Sub EngEv_InfoMessage()
    InfoMsg = "For your information..." _
   & " the following message" _
        & " was returned by the server." & vbCrLf
    For Each er In rdoErrors
        InfoMsg = InfoMsg & er.Number _
   & " - " & er.Description & vbCrLf
    Next

End Sub
Private Sub cn_BeforeConnect( _
   ConnectString As String, Prompt As Variant)
  InfoMsg = "About to connect to:" & ConnectString  _
   & " - " & Prompt
  ConnectString = ConnectString & ";WSID="  _
   & "EventTest" & Time$ & ";"
End Sub

Private Sub cn_Connect(ByVal ErrorOccurred As Boolean)‘一旦连接则引发。
  Connected = True
End Sub

Private Sub cn_Disconnect()   ‘断开连接时引发
  Connected = False
End Sub

Private Sub cn_QueryComplete(ByVal Query As _
  RDO.rdoQuery, ByVal ErrorOccurred  As Boolean)
   ByVal ErrorOccured As Boolean)
  Timer1.Enabled = False
  QueryComplete = vbChecked
  RunButton.Enabled = True
  Beep

  MsgBox "Query Done"
End Sub

Private Sub cn_QueryTimeout(ByVal Query As _
  RDO.rdoQuery, Cancel  As Boolean)
    ans = MsgBox("The query did not complete "

   & "in the time allocated. " _
   & "Press Cancel to abandon the query " _
   & "or Retry to keep working.", _
        vbRetryCancel + vbQuestion, "Query Timed Out")
    If ans = vbRetry Then
        Cancel = False
        QueryComplete = vbGrayed
    Else
        Timer1.Enabled = False
        QueryComplete = vbChecked
    End If
End Sub

Private Sub MenufileExit_Click()
cn.Close
Unload Form1
End Sub

Private Sub RunButton_Click()
    RunButton.Enabled = False
    On Error GoTo C1EH
    QueryComplete = vbGrayed
    Timer1.Enabled = True
    Set rs = cn.OpenResultset( _
       "execute VeryLongProcedure", _
        rdOpenKeyset, rdConcurValues, rdAsyncEnable)
    TimeStart = Timer
QuitRun:
Exit Sub
C1EH:
    Debug.Print Err, Error
        InfoMsg = "Error:.. the following error" _
        & " was returned by the server." & vbCrLf
    For Each er In rdoErrors
        InfoMsg = InfoMsg & er.Number  _
        & " - " & er.Description & vbCrLf
    Next
    MsgBox "Query Failed to run"
    Timer1.Enabled = False
    Resume QuitRun

End Sub

Private Sub Form_Load()
On Error GoTo FLeh
Set EngEv = rdoEngine
Set cn = New rdoConnection
Show
    With cn
        .Connect = "UID=;PWD=;database=Workdb;" _
            & "Server=SEQUEL;" _
              & "driver={SQL Server};DSN='';"
        .QueryTimeout = 5
        .CursorDriver = rdUseClientBatch
        .EstablishConnection rdDriverNoPrompt
    End With
Exit Sub

FLeh:
    Debug.Print Err, Error
    For Each er In rdoErrors
        Debug.Print er.Description
    Next
    Stop
    Resume

End Sub

Private Sub Timer1_Timer()
Static ot As Integer
‘ Display number of seconds
ShowClock = Int(Timer - TimeStart)
If ShowClock = ot Then Form1.Refresh
End Sub


rdoLocaleID 属性

返回或设置一个值，用以指示 RDO 库的区域。

语法

object.rdoLocaleID [= value ]

rdoLocaleID 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 常数和值，它用以指示一个区域，“设置值”中有详细描述。

设置值

value 的设置值是：

常数 | 值 | 描述
rdLocaleSystem | 0 | 系统
rdLocaleEnglish | 1 | 英国
rdLocaleFrench | 2 | 法国
rdLocaleGerman | 3 | 德国
rdLocaleItalian | 4 | 意大利
rdLocaleJapanese | 5 | 日本
rdLocaleSpanish | 6 | 西班牙
rdLocaleSimplifiedChinese | 8 | 中国
rdLocaleKorean | 9 | 韩国

说明

当产生 RDO 错误信息时，区域用于确定使用哪种语言。当初始化 rdoEngine 时，rdoLocaleID 使用 Windows 系统区域为缺省值。

任何时候都可以将 rdoLocaleID 设置为上述的支持值之一，来替换当前的缺省值。如果使用一个并不支持的值，则发生一个可以捕获的错误。

当设置或改变 rdoLocaleID 属性时，RDO 加载其相应的语言动态链接库 (DLL)，用正确的语言显示错误信息。

如果指定的语言 DLL 不在用户的机器上，RDO 就设为 rdLocaleEnglish，后者并不需要一个单独的 DLL。这样的话，一个通知信息放到 rdoErrors 集合中，指示 RDO 不能按指定的区域加载 DLL 资源。

当发布应用程序时，一定要包含相应语言的 DLL。


rdoParameters 属性

根据位置或键返回 rdoParameters 集合的一个指定成员。

语法

object.rdoParameters(index)

rdoParameters 属性语法包含以下部分：

部分 | 描述
object | 是一个对象表达式，其值等于”应用于”列表中的一个对象。
index | 必需的。是用来指定一个集合成员位置的表达式。如果是数值表达式，则 index 必须是在 1 和集合 Count 属性值之间的数。如果是字符串表达式，则 index 必须与被引用的成员添加到集合中时指定的 key 参数相符合。

说明

该属性用于访问 rdoParameters 对象集合。例如，rdoQuery 对象有一个 rdoParameters 属性，是用于 rdoQuery 对象的 rdoEnvironments 对象集合。


rdoQueries 属性

根据位置或键返回 rdoQueries 集合的一个指定成员。

语法

object.rdoQueries(index)

rdoQueries 属性语法包含以下部分：

部分 | 描述
object | 是一个对象表达式，其值等于”应用于”列表中的一个对象。
index | 必需的。是用来指定一个集合成员的位置的表达式。如果是数值表达式，则 index 必须是在 1 和集合 Count 属性的值之间的数。如果是字符串表达式，则 index 必须与被引用的成员添加到集合中时指定的 key 参数相符合。

说明

该属性用于访问 rdoQueries 对象集合。例如，rdoConnection 对象有一个 rdoQueries 属性，是用于 rdoConnection 对象的 rdoQueries 对象集合。


rdoRegisterDataSource 方法示例

下面示例说明使用 rdoRegisterDataSource 方法建立新的 ODBC 数据源项。

Private Sub RegisterDataSource()
Dim en As rdoEnvironment
Dim cnTest As rdoConnection
Dim strAttribs As String
'建造关键字字符串。
strAttribs = "Description=" _
        & "SQL Server on server SEQUEL" _
  & Chr$(13) & "OemToAnsi=No" _
  & Chr$(13) & "SERVER=SEQUEL" _
  & Chr$(13) & "Network=DBNMPNTW" _
  & Chr$(13) & "Database=WorkDB" _
  & Chr$(13) & "Address=\\SEQUEL\PIPE\SQL\QUERY"

'建立新的注册的 DSN。
rdoEngine.rdoRegisterDataSource "示例", _
         "SQL Server", True, strAttribs
'打开数据库。
Set en = rdoEngine.rdoEnvironments(0)
Set cnTest = en.OpenConnection( _
  dsname:="示例", _
  Prompt:=rdDriverNoPrompt, _
  Connect:="UID=;PWD=;")

End Sub


rdoResultSets 属性

根据位置或键返回 rdoResultSets 集合的一个指定成员。

语法

object.rdoResultSets(index)

rdoResultSets 属性语法包含以下部分：

部分 | 描述
object | 是一个对象表达式，其值等于”应用于”列表中的一个对象。
Index | 必需的。是用来指定一个集合成员的位置的表达式。如果是数值表达式，则 index 必须是在 1 和集合 Count 属性的值之间的数。如果是字符串表达式，则 index 必须与被引用的成员添加到集合中时指定的 key 参数相符合。

说明

该属性用于访问 rdoResultSets 对象集合。例如，rdoConnection 对象有一个 rdoResultSets 属性，是用于 rdoConnection 对象的 rdoResultSets 对象集合。


rdoTables 属性

根据位置或键返回 rdoTables 集合的一个指定成员。

语法

object.rdoTables(index)

rdoTables 属性语法包含以下部分：

部分 | 描述
object | 是一个对象表达式，其值等于”应用于”列表中的一个对象。
index | 必需的。是用来指定一个集合成员的位置的表达式。如果是数值表达式，则 index 必须是在 1 和集合 Count 属性的值之间的数。如果是字符串表达式，则 index 必须与被引用的成员添加到集合中时指定的 key 参数相符合。

说明

该属性用于访问 rdoTables 对象集合。例如，rdoConnection 对象有一个 rdoTables 属性，是用于 rdoConnection 对象的 rdoTables 对象集合。


rdoVersion 属性（远程数据）

返回一个值，用以指示与对象相关的 RDO 库的版本。

语法

object.rdoVersion

object 所在处代表一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

rdoVersion 属性的返回值是一个 5 个字符长的字符串表达式。

说明

该属性标识创建连接的数据库引擎的版本。该版本的格式是 #.#.####，其中的头两个数字是主要版本号，后两个数字是次要版本号。例如，RDO version 2.0 返回 2.0.0000。


ReadOnly 属性（远程数据）

返回或设置一个值，用以确定是否以只读访问打开控件的 rdoConnection。

语法

object.ReadOnly [= value]

ReadOnly 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Boolean，它用以确定读/写访问，“设置值”中有详细描述。

设置值

value 的设置值是：

设置 | 描述
True | RemoteData 控件的 rdoConnection 对象以只读访问（方式）打开。不允许改变数据。
False | （是缺省值）RemoteData 控件的 rdoConnection 以读/写数据访问（方式）打开。

说明

对 RemoteData 控使用 ReadOnly 属性，指定在下一级的 rdoConnection 中的数据是否可以改变。例如，可以创建一个只显示数据的应用程序。访问只读 rdoConnection 的速度会比较快。

即使 ReadOnly 属性为 False，因为没有权限或使用的 rdoResultset 的类型不支持更新，也不能对数据库写访问。

该属性对应于 OpenConnection 方法的 readonly 参数。


Refresh 方法示例

下面示例说明使用 Refresh 方法重新建造 RemoteData 控件上的 rdoResultset。该例是使用连接技术建造新的查询使 SQL 属性复位。当执行 Refresh 方法时，重新执行查询。由于 Search 过程的每次调用都不改变 Connect 属性，连接也不必每次都重新建立。它只在第一个调用时打开。当 Refresh 方法完成时，绑定控件从查询返回的列中来反映数据。

Option Explicit
Private Sub Search_Click()
On Error GoTo eh
With MSRDC1
   .Connect = "UID=;PWD=;Database=Pubs;"
   .DataSourceName = "WorkDB"
   .SQL = "Select Au_Fname " _
      & " From Authors " _
      & " Where Au_Lname like '%" _
      & AuthorWanted & "%'"
   Debug.Print .SQL
   .Refresh

   If .Resultset.EOF Then
      MsgBox "No authors on file with that last name"
   End If
End With
Exit Sub

eh:
Dim er As rdoError
For Each er In rdoErrors
Debug.Print er
Next
Resume Next
End Sub


Requery 方法示例

下面示例说明使用 Requery 方法重新执行一个 rdoQuery。注意只有在加载窗体及重新执行 Requery 方法的调用时，才建立 rdoResultset。

Option Explicit
Dim Cn As New rdoConnection
Dim Rs As rdoResultset
Dim Col As rdoColumn
Dim Qy As rdoQuery
Dim SQL As String
Dim TimeExpected As Single
Dim Ts As Single, Tn As Single

Private Sub SpWho_Click()
Rs.Cancel
With Rs
   .Requery
   While .StillExecuting
      SpinGlobe
      DoEvents
   Wend
   ShowRS
End With

End Sub
Sub ShowRS()
With Rs
   Form1.Cls
   For Each Col In .rdoColumns
      Print Col.Name,
   Next
   Print
   Do Until .EOF
      For Each Col In .rdoColumns
         Print Col,
      Next
      Print
      .MoveNext
   Loop
End With
End Sub
Sub SpinGlobe()
'此处激活一个全局是以显示查询在进行中。
Print ".";
End Sub

Private Sub Form_Load()
With Cn
   .Connect = "UID=;PWD=;Database=WorkDB;" _
   & "Server=sequel;Driver={SQL Server}" _
   & "DSN='';"
   .LoginTimeout = 5
   .EstablishConnection rdDriverNoPrompt, True
   Set Qy = .CreateQuery("SpWho", _
   "{ call master..sp_who (?) }")
   Qy.RowsetSize = 1
   Set Rs = Qy.OpenResultset(rdOpenForwardOnly, _
   rdConcurReadOnly, rdAsyncEnable)
   Show
   ShowRS
End With
End Sub


Required 属性

返回一个值，用以指示 rdoColumn 是否需要一个非 Null 的值。

语法

object.Required

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Required 属性的返回值是：

值 | 描述
True | 不允许 Null 值。
False | 允许 Null 值。

说明

对于 rdoColumn 对象，Required 属性可以与 AllowZeroLength 属性一起使用，来确定该 rdoColumn 对象的 Value 属性设置的有效性。如果 Required 被置为 False，该列除了能包含 Null 值，也能包含满足由 AllowZeroLength 属性的设置所指定条件的值。


Restartable 属性

返回一个值，用以指示 rdoResultset 对象是否支持 Requery 方法，该方法重新执行该 rdoResultset 所基于的查询。

语法

object.Restartable

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Restartable 属性返回值是：

值 | 描述
True | rdoResultset 对象支持 Requery 方法。
False | rdoResultset 对象不支持 Requery 方法。

说明

在对 rdoResultset 使用 Requery 方法之前，先要检查 Restartable 属性。如果该对象的 Restartable 属性被置为 False，就对基本的 rdoQuery 使用 OpenResultset 方法重新执行查询。

在参数值被改变之后，可以使用 Requery 方法更新 rdoResultset 对象的基本的参数查询。

如果 rdoQuery 不包含参数，Restartable 属性始终为 True。


Resultset 属性

返回或设置一个 rdoResultset 对象，该对象是由 RemoteData 控件定义的，或是由 OpenResultset 方法返回的。

语法

Set object.Resultset [= value]

Resultset 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 对象表达式，其值是 rdoResultset 对象，“设置值”中有详细描述。

设置值

value 的设置是一个 rdoResultset 对象。

说明

当启动应用程序时，RemoteData 控件自动被初始化。如果 SQL 属性有效，或在运行时设置 SQL 属性，并且使用 Refresh 方法，则 RemoteData 控件就创建一个新的 rdoResultset 对象。该 rdoResultset 通过 RemoteData 控件的 Resultset 属性访问。

无论是使用 RDO 代码还是使用另一个 RemoteData 控件创建 rdoResultset 对象，都可将该 RemoteData 控件的 Resultset 属性设置到这个新的 rdoResultset。当新的 rdoResultset 赋给 Resultset 属性时，将释放任何在该 RemoteData 控件中已存在的 rdoResultset，以及与此相关的 rdoConnection 对象。

也可以使用 OpenResultset 方法和为 rdoResultset 对象设置 Resultset 属性，来创建一个 rdoResultset 对象。不过，使用 RemoteData 控件的被绑定的控件，必须正确地指定这个新的 rdoResultset 的各列。为此必须保证将连接到 RemoteData 控件的被绑定的控件的 DataField 属性设置成与该新 rdoResultset 对象的各列名相匹配。

结果集的类型

也可以检查或设置 RemoteData 控件的 ResultsetType 属性，来确定 rdoResultset 游标的类型。当使用 RemoteData 控件时，如果不需要一个指定的类型，就创建一个键集的 rdoResultset。可以在运行时检查 rdoResultset 对象的 Type 属性或 RemoteData 控件的 ResultsetType 属性，来确定 rdoResultset 的类型。

当访问 SQL Server 6 时，RemoteData 控件既可以创建键集类型又可以创建静态类型 rdoResultset 对象。不过，如果 ODBC 驱动程序不支持键集游标，就不能创建键集游标－所有的驱动程序都支持静态游标。如果设置 RemoteData 控件的 Resultset 属性为 rdoResultset 不支持的类型，就触发一个可捕获的错误。

注意 当设置 Resultset 属性时，RemoteData 控件并不是关闭当前的 rdoResultset 或 rdoConnection，而是释放它。如果没有其它用户，rdoConnection 就自动关闭。在设置 Resultset 属性之前，可以考虑关闭与 RemoteData 控件相关的 rdoResultset 和 rdoConnection。

所有由 RemoteData 控件创建的 rdoResultset 对象都是在 rdoEnvironments (0) 中创建。如果需要使用 RemoteData 控件，在另一 rdoEnvironment 中操作一个数据库，使用示例中演示的技术，打开在那个 rdoEnvironment 中的 rdoConnection，创建一个新的 rdoResultset，并且将该 RemoteData 控件的 Resultset 属性设置为这个新的 rdoResultset。


ResultsetType 属性

返回或设置一个值，用以指示已创建的或要创建的 rdoResultset 的游标类型。

语法

object.ResultsetType [= value ]

ResultsetType 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 常数值，它用以指示 rdoResultset 的类型，“设置值”中有详细描述。

设置值

value 的设置值是：

常数 | 值 | 描述
rdOpenStatic | 3 | 静态类型 rdoResultset。
rdOpenKeyset | 1 | （缺省值）键集类型 rdoResultset。

说明

并非所有的驱动程序都支持所有类型的游标。例如，SQL Server 6 支持静态及键集游标，而 SQL Server 4.2 则只支持静态游标。如果 ODBC 驱动程序不支持键集游标，它们就不能由 RDO 或 RemoteData 控件创建。如果 RemoteData 控件不能建立所需要的 rdoResultset 游标类型，RDO 就建造所能建立的某个类型的游标，并在 ResultsetType 属性中返回该游标类型。

如果在 RemoteData 控件创建 rdoResultset 之前，不指定 ResultsetType，就创建一个键集类型的 rdoResultset。

如果创建了一个 rdoResultse ，并对该新对象设置了 Resultset 属性，RemoteData 控件的 ResultsetType 属性就被设为该新的 rdoResultset的 Type 属性。


Resultset 属性示例

下例说明如何在代码中创建一个 rdoResultset 并将其传递给一个已存在的 RemoteData 控件。

Option Explicit
Dim qy As rdoQuery
Dim rs As rdoResultset
Dim cn As rdoConnection

Private Sub Form_Load()
Dim SQL As String
Set cn = MSRDC1.Connection

SQL = "{ call ChooseAuthor (?) }"
Set qy = cn.CreateQuery("GetAuthor", SQL)
End Sub

Private Sub Search_Click()
qy(0) = NameWanted.Text
Set MSRDC1.Resultset = qy.OpenResultset( _
   rdOpenStatic, rdConcurReadOnly)

End Sub

由该查询示例执行的存储过程如下所示：

CREATE PROCEDURE ChooseAuthor (@authorwanted char(20)) as
select t.title from titles t, titleauthor ta, authors a
where t.title_id = ta.title_id
and ta.au_id = a.au_id
and a.au_lname = @authorWanted


RowCount 属性（远程数据）

返回 rdoResultset 对象中被访问的行的数目。

语法

object.RowCount

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

RowCount 属性的返回值是一个 Long 整数，其意义将在下面说明中讨论。

说明

使用 RowCount 属性找出在 rdoResultset 对象中有多少行被访问，或判断返回的 rdoResultset 一行也没有。在所有的行都被访问完之前，RowCount 不指示 rdoResultset 查询将返回多少行。在所有的行都被访问完之后，RowCount 属性才反映 rdoResultset 中的总行数。

引用 RowCount 属性造成 RDO 全部移居结果集－就好象执行了一个 MoveLast 方法。

根据驱动程序和数据资源，RowCount 属性既可以返回 -1，指示行的个数是不可用的，又可以是0，指示 rdoResultset 没有返回行。如果驱动程序能够返回行计数，RowCount 属性就返回 rdoResultset 中的行的数目。

对 rdoResultset 使用 Requery 方法，将重新设置 RowCount 属性，使其就象第一次运行查询时那样。


RowCount 属性示例

下例是说明使用 RowCount 属性，确定查询的结果是否有行，和每次执行 MoveNext 方法后有多少行已被处理，以及处理完所有行之后结果集中有多少行。

Option Explicit
Dim ps As rdoPreparedStatement
Dim rs As rdoResultset
Dim cn As rdoConnection

Private Sub Form_Load()
Dim SQL As String
Set cn = MSRDC1.Connection

SQL = "{call ChooseAuthor (?)}"
Set ps = cn.CreatePreparedStatement("GetAuthor", SQL)
End Sub

Private Sub Search_Click()
ps(0) = NameWanted.Text
Set MSRDC1.Resultset = ps.OpenResultset( _
   rdOpenKeyset, rdConcurReadOnly)
With MSRDC1.Resultset
  If .RowCount = 0 Then
    MsgBox "No titles by that author were found."
    NameWanted.SetFocus
  Else
    Do Until .EOF
      .MoveNext
      TitlesFound = .RowCount   '到目前为止有多少行
    Loop
    TitlesFound = .RowCount         '所找到的所有行
  End If
  .MoveFirst
End With
End Sub


RowsAffected 属性

返回受最近调用的 Execute 方法影响的行的数目。

语法

object.RowsAffected

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

RowsAffected 属性的返回值是一个 Long 值，其范围是从 0 到受最近在对 rdoConnection 或 rdoQuery 对象所调用 Execute 方法影响的行的数目。

说明

当运行动作查询时，RowsAffected 包含被删除的、更新的、或插入的行的数目。当使用 Execute 方法运行一个 rdoQuery 时，RowsAffected 属性设置是受影响的行的个数。例如，当执行一个查询，从一个表删除 50 行，RowsAffected 属性返回 50。

当需要确定有多少行受具有一个含糊的 WHERE 子句的动作查询的影响时，该属性特别有用。例如，在一个删除 Price 列大于 10 的所有行的查询中，RowsAffected 属性指示实际共有多少行受影响并被删除。


RowsAffected 属性

下例是说明使用 RowsAffected 属性确定由一个含糊的更新语句改变的行的数目。在这种情况下，不知道有多少作者居住在盐湖城，但是，只要作更新，通过检查 rdoQuery 对象的 RowsAffected 属性，就可以确定有多少行被更新了。

Option Explicit
Dim SQL As String
Dim cn as rdoConnection
Dim qd as rdoQuery

Private Sub Form_Load()
Set cn = rdoEnvironments(0).OpenConnection( _
  dsname:="WorkDB", _
  Prompt:=rdDriverNoPrompt, _
  Connect:="uid=;pwd=;database=pubs")

SQL = "Update Authors Set Zip = ?" _
  & " Where City = ?"
Set qd = cn.CreateQuery("FixZip", SQL)
End Sub

Private Sub UpdateButton_Click()
qd(0) = NewZip      '从一个文本框
qd(1) = CityToFind   ' 从一个文本框
ps.Execute
NumberChanged = qd.RowsAffected
End Sub


RowsetSize 属性

返回或设置一个值，用以确定在 rdoResultset 游标中的行的数目。

语法

object.RowsetSize [= value]

RowsetSize 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 值，用以指定行集的大小，“设置值”中有详细描述。（数据类型是 Long 表达式。）

设置值

RowsetSize 的上限是由数据源驱动程序确定的。value 的下限是 1，其缺省值是 100。

说明

RowsetSize 属性确定键集的多少行被应用程序建立缓冲。RDO 使用RowsetSize 属性来确定有多少行被 ODBC 的 SQLExtendedFetch 函数读入到内存中。调节键集 RowsetSize 大小，会影响到性能以及为维护键集缓冲区所需的内存量。

在创建 rdoResultset 对象之前必须先设置该属性。

对保守游标的影响

另外，当使用保守 (rdConcurLock) 并发时，RowsetSize 属性确定有多少行（及其数据页面）被锁定。例如，如果设置 RowsetSize 属性为 100 并且执行一个带有 rdConcurLock 选项的 rdoQuery 对象时，就锁定结果集的头 100 行及其相关的每一页，直到该游标被关闭或将当前行指针向该结果集的尾部移动。在任何情况下，至少锁定 RowsetSize 行。


Size 属性（远程数据）

返回一个值，用以指示包含文本的 rdoColumn 对象的基本数据的最大尺寸，或指示包含文本或数字值的 rdoColumn 对象的固定尺寸，均以字节为单位。

语法

object.Size

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Size 属性的返回值是一个 Long 值，该值如下面说明中讨论的那样，依赖于 rdoColumn 对象的 Type 属性的设置值。

说明

对于返回字符值的列，Size 属性指示数据源列可容纳的字符的最大个数。对数字列，Size 属性指示该列数据需要有多少数据资源存储的字节。该值依赖于该数据资源的实现。

对需要使用 GetChunk 和 AppendChunk 方法的数据资源列，Size 属性总为 0－可以使用 ColumnSize 方法返回正确的大小信息。大块类型列的最大尺寸只受系统资源或数据库的最大尺寸的限制。


Source 属性（远程数据）

返回一个值，用以指示远程数据访问错误的源。

语法

object.Source

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Source 属性的返回值是一个字符串表达式，其意义在下面说明中描述。

说明

当在 ODBC 操作中发生一个错误时，就有一个 rdoError 对象被追加到 rdoErrors 集合。如果错误发生在 RDO 中，返回值就以“msrdo20”开始。造成该错误的对象类也可能被追加到 Source 属性的值中。


Source Column 属性（远程数据）

SourceColumn 属性返回一个值，用以指示列名，该列是 rdoColumn 对象的原始数据源。

该属性在设计时是不可用的，在运行时是可读写的。

语法

object.SourceColumn

object 所在处对象表达式，其值是“应用于”列表中的一个对象。

返回值

SourceColumn 属性返回一个字符串表达式，用以指示数据源的列名。

说明

该属性指示与 rdoColumn 对象相关的原始列名。例如，可以使用该属性确定在一个查询列中的原始数据源，该列名与基本表中的列名无关。

对于在 rdoResultset 对象中的列，SourceColumn 和 SourceTable 属性返回基本表的列名和表名，或返回用于定义查询的列和表。


SourceTable 属性

SourceTable 返回一个值，用以指为 rdoColumn 对象指示数据的原始源的表名。

该属性在设计时是不可用的，在运行时是只读的。

语法

object.SourceTable

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

SourceTable 属性返回一个字符串表达式，用以指示数据源的表名。

说明

该属性指示与 rdoColumn 对象相关的原始表名。例如，可以设置这些属性确定在一个查询列中的原始数据源，该列名与基本表中的列名无关。

对于在 rdoResultset 对象中的列，SourceColumn 和 SourceTable 属性返回基本表的列名和表名，或返回用于定义查询的列和表。


SQL 属性

返回或设置 SQL 语句，用以定义由 rdoQuery objec t或 RemoteData 控件执行的查询。

语法

object.SQL [= value]

SQL 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 字符串表达式，它包含一个如下设置值中所述的值。（数据类型是 String。）

设置值

value 的设置值是：

Setting | 描述
一个有效的 SQL 语句 | 是一个 SQL 查询，使用适合数据源的语法。
一个存储过程 | 是一个带有前导关键字“执行”的被数据资源支持的存储过程。
一个 rdoQuery | 在 rdoConnection 对象的 rdoQueries 集合中的一个 rdoQuery 对象名。
一个 rdoResultset | 在 rdoConnection 对象的 rdoResultsets 集合中的一个 rdoResultset 对象名。
一个表名 | 在 rdoConnection 对象的 rdoTables 集合中定义的一个移居的 rdoTable 对象名。

说明

SQL 属性包含结构查询语言语句，用以确定当运行查询时如何对行进行选择、分组、和排序。可以使用一个包括在 rdoResultset 对象中的选择行的查询。也可以定义动作查询修改数据而不返回行。

在设计时不能为 SQL 属性提供表名。不过，可以使用象 SELECT * FROM <table> 那样的简单查询，也可以在运行时移居 rdoTables 集合和使用返回在集合中的一个表名。只要 rdoTables 集合与一个活动的连接相关并被引用，它马上就被移居。

在查询中使用的 SQL 语法必须适合由数据源查询处理器定义的 SQL 语言。由 ODBC 接口支持的该 SQL 语言是由 X/Open 标准定义的。一般来说，驱动程序扫描一个 SQL 语句，寻找指定的转义代码 序列，该换码序列用于标识象时间标记的文字和函数那样的非标准的操作对象。

当需要从查询中返回行时，一般在 SQL 属性中提供一个 SELECT 语句。该 SELECT 语句指定：

  • 要返回的每个列的名字或者 "*"，以用来指示被指定表的所有列都要被返回。必须包含必要的表名来对混淆的列名进行定位。也可以指定集合表达式对所选的那些列进行算术或其它函数的操作。

  • 需要用于搜索信息的每个表的名称。如果指定一个以上的表，就必须指定一个 WHERE 子句来指出哪些列是用于表中的交叉引用信息。一般来说，这些列具有相同的名称和含义。例如，也许要引用 Customers 表和 Orders 表中的 CustomerID 列。

  • （是可选的）一个 WHERE 子句指定如何联结指定的表和如何限制或过滤返回行的数目及类型。可以使用 WHERE 子句中的参数指定从查询到查询的不同的信息集。

  • （是可选的）其它子句，诸如对行设置特定的顺序的 ORDER BY 子句，或结构化在相关集中的行的GROUP BY 子句。

每个 SQL 语言支持不同的语法和不同的辅助子句。关于详细情况，请参阅随远程服务器一起提供的文档。

指定参数

如果查询的 SQL 语句中包含有问号参数标记（？），那么在运行该查询之前必须先提供这些参数。在重新设置这些参数之前，每次执行该查询都提供相同的参数值。为了使用 rdoParameters 集合以管理 SQL 查询参数，必须在 SQL 语句中包括“?”参数标记。输入、输出、输入/输出以及返回值参数都必须按这种方式标识。在某些情况下，必须使用 Direction 属性指定如何使用该参数。

注意 当执行不需要参数的存储过程时，不要在 SQL 语句中包含括弧。例如，使用如下语法执行“MySP”过程：{Call MySP }。

注意 当使用 Microsoft SQL Server 6 作为数据源时，ODBC 驱动程序自动设置 Direction 属性。不需要为输入参数设置 Direction 属性，因为这是缺省设置。

如果参数值被改变，可以重新应用该参数值，并对 rdoResultset (MyRs) 使用 Requery 方法重新执行该查询。

Cpw(0) = Text1.Text
MyRs.Requery

也可以通过将参数连接到 SQL 语句字符串，来指定在任何 SQL 语句中的参数。例如，为了使用这个技术提交一个查询，可以使用下列代码：

QSQL$ = "SELECT * FROM Authors WHERE Au_Lname = '" _
 & Text.Text & "'"
Set CPw = cn.CreateQuery("",QSQL$)
Set MyRs = Cpw.OpenResultSet()

在这种情况下，不建立 rdoParameters 集合，它也不能被引用。为了改变查询参数，每次执行该查询时，或使用 Requery 方法前，必须使用新参数值重新建造 SQL 语句。

SQL 语句可以包含一个 ORDER BY 子句，用以改变由 rdoResultset 返回的行的顺序，或包含一个过滤行的 WHERE 子句过滤行的顺序。

注意 在引用 rdoTables 集合之前，不能使用 rdoTable 对象名。当代码通过枚举 rdoTables 集合的一个或多个成员而引用该集合时，RDO 为表元数据查询数据源。这导致 rdoTables 集合的移居。这意味着如果没有第一次枚举 rdoTables 集合，不能简单地为 value 参数提供表名。

远程数据控件

当使用 RemoteData 控件，SQL 属性指定可通过窗体中的被绑定的控件访问的数据行的源。

如果设置 SQL 属性为返回行的 SQL 语句，或为已存在的 rdoQuery 查询名，所有由 rdoResultset 返回的列，对于与 RemoteData 控件相关的被绑定的控件，都是可见的。

运行时在改变 SQL 属性值之后，必须使用 Refresh 方法激活这个改变。

注意 无论 rdoQuery 或 SQL 语句何时从表达式返回一个值，该表达式的列名由 SQL 查询的单词确定。在大多数情况下希望使用别名表达式，以便可以知道绑定到被绑定的控件的列的名称。

确保每个被绑定的控件的 DataField 属性具有有效的设置。如果改变RemoteData 控件的 SQL 属性的设置，然后再使用 Refresh，rdoResultset 就标识这个新的对象。这也许会使被绑定的控件的 DataField 设置值无效，并造成一个可以捕获的错误。


SQLRetCode 属性（远程数据）

从最新的 RDO 操作返回 ODBC 错误返回码。

语法

object.SQLRetCode

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

SQLRetCode 属性的返回值是一个 Long 值，该值对应于下列常数之一：

常数 | 值 | 描述
rdSQLSuccess | 0 | 操作是成功的。
rdSQLSuccessWithInfo | 1 | 操作是成功的，而且附加的信息是可用的。
rdSQLNoDataFound | 100 | 没有可用的附加数据。
rdSQLError | -1 | 是一个执行操作时发生的错误。
rdSQLInvalidHandle | -2 | 支持的句柄是可用的。


SQLState 属性（远程数据）

返回一个值，与由 X/Open 和 SQL Access Group SQL 定义的错误类型对应。

语法

object.SQLState

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

SQLState 返回值是一个五个字符的字符串表达式，其意义在下面说明中描述。

说明

当一个 RDO 操作返回一个错误，或完成一个操作时，rdoError 对象的 SQLState 属性被设置。如果该错误不是由 ODBC 造成的，或者没有可用的 SQLState，该 SQLState 属性就返回一个空字符串。

由 SQLState 属性返回的字符串值是由两个字符的类值，以及随后的三个字符的子类值组成的。一个“01”类值指示一个警告，并伴随有一个 rdSQLSuccessWithInfo 返回码。

不是“01”的类值，除类“IM”外，都指示一个错误，并伴随有一个 rdSQLError 返回码。类“IM”特指所发生的警告和错误都是由 ODBC 的实现本身而产生的。在任何类中的子类“000”是用于在给定的类内定义类的实现的条件的。类和子类值的赋值由 ANSI SQL-92 定义。


SQL 属性示例

例如，运行一个过程，它接受两个输入参数，返回一个返回值及一个输出参数，可以使用下列代码。该例创建一个 rdoQuery 对象，其 SQL 属性被置为由 QSQL$ 指定的字符串。该查询接受两个输入参数，调用一个存储过程，返回一个返回状态，及一个输出参数。

Dim Cqy as new rdoQuery
Dim MyRs as rdoResultset
Cqy.SQL = "{ ? = call sp_MyProc (?, ?, ?) }"
Cqy(0).Direction = rdReturnValue
Cqy(1).Direction = rdParamInput
Cqy(2).Direction = rdParamInput
Cqy(3).Direction = rdParamOutput
Cqy(1) = "Victoria"
Cqy(0) = 21
Set MyRs = Cqy.OpenResultSet(rdOpenForwardOnly)


Status 属性

返回或设置当前行或列的状态。

语法

object.Status [= value]

Status 属性的语法包含下面部分：

部分 | 描述
Object | 对象表达式，其值是“应用于”列表中的一个对象。
Value | Long 整数， 如下面“说明”中所述，用以表示游标的类型。

设置值

Status 属性有这些设置值：

常数 | 值 | Prepared 属性设置
rdRowUnmodified | 0 | （缺省值）行或列未作修改，或已成功地更新。
rdRowModified | 1 | 行或列已作了修改但还未在数据库中作更新。
rdRowNew | 2 | 行或列已被用 AddNew 方法插入，但还未插入到数据库中。
rdRowDeleted | 3 | 行或列已被删除，但还未从数据库中删除。
rdRowDBDeleted | 4 | 行或列已在本地被删除，并且也从数据库中删除了。

说明

这个属性的值指示是否以及如何将行或列包含到下个开放式批更新中。

当使用开放式批更新游标库和需要指定哪些行将在下个批操作中更新时，设置 rdoResultset 对象的 Status 属性。例如，假定你正在工作于一个无边界的已用查询出的行填充的 Grid 控件。用户选择其中的一行，你检查该行所做的变化。这时，可以通过设置 Status 属性为 rdRowModified 来标记这行为更新状态。与此类似，如果行被添加或删除，可以使用相应的 Status 属性设置来指示。当使用 BatchUpdate 方法， RDO 将根据每一行的 Status 属性，为其给远程服务器提交一个相应的操作。

一旦完成 BatchUpdate 操作，可以检查每一行的 Status 属性以确定该更新是否成功。如果该 Status 值在该 BatchUpdate 之后，返回的不是 rdRowUnmodified，表示更新该行的操作未完成。在这种情况下，应检查行的 rdoErrors 集合和 BatchCollisionRows 属性。


StillConnecting 属性

返回一个值，用以指示是否已经创建连接。

语法

object.StillConnecting

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

StillConnecting 属性返回值是：

值 | 描述
True | 正在建立异步连接，但未完成。
False | 连接已经建立。

说明

这个属性的操作与 StillExecuting 属性非常相似，只是当与服务器异步建立连接的时候，该属性为 True。当连接建立之后该属性再次为 False。

当异步连接正在处理的过程中，所有对该连接对象的方法和属性（本属性和 Cancel 方法除外）的访问，都将导致一个可捕获的错误。


StillConnecting 属性示例

下例是说明当使用 rdAsyncEnable 选项建立连接时，如何使用 StillConnecting 属性。

Dim rdoCn As New rdoConnection
Dim TimeExpected As Single
Dim Ts As Single, Tn As Single

TimeExpected = 15
With rdoCn
    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=FarAway;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 45
    .EstablishConnection rdDriverNoPrompt, _
       True, rdAsyncEnable
    Ts = Timer
    ProgressBar1.Max = TimeExpected  '用于打开的时间
    While .StillConnecting
        Tn = Int(Timer - Ts)
        If Tn < TimeExpected Then
            ProgressBar1 = Tn
        Else
            ProgressBar1.Max = ProgressBar1.Max + 10
            TimeExpected = ProgressBar1.Max
        End If
        DoEvents
    Wend
    Status = "Duration:" & Int(Timer - Ts)

End With
rdoCn.Close
Exit Sub


StillExecuting 属性（远程数据）

返回一个布尔 值，用以指示查询是否还在执行。

语法

object.StillExecuting

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

StillExecuting 属性返回值是：

值 | 描述
True | 查询还在执行。
False | 查询已准备返回结果集。

说明

使用 StillExecuting 属性确定查询是否准备返回第一个结果集。在 StillExecuting 属性为 False 之前，不能访问相关的对象。不过，除非使用 rdAsyncEnable 选项，否则直到该查询完成并准备处理结果集之前，将封锁应用程序。

一旦 StillExecuting 属性返回 False，就准备处理第一个或下一个结果集。当使用 MoreResults 方法完成一个结果集的处理时，StillExecuting 属性被重新设置为 True，并检索下一个结果集。

当执行一个 Move 方法时，StillExecuting 属性也会改变为 True。例如，对一个 rdoResultset 执行 MoveLast，只要 RDO 继续从远程服务器取得行，就将 StillExecuting 属性重新设置为 True。

也可以使用 QueryComplete 事件，指示查询何时完成，并准备处理相关的 rdoResultset 对象。

使用 Cancel 方法将中止执行中查询的处理，包括批查询中的所有语句。


StillExecuting 属性示例

下例是说明使用 StillExecuting 属性监视一个查询进度，该查询需要较长的时间。通过使 RDO 的异步方式有效，可以早在该查询完成之前，使控件返回到应用程序。当等待 StillExecuting 属性返回 False 时，显示一个进度栏，该进度栏被编程用以反映查询所需要的时间的长度。注意如果超出这个时间，进度栏会重新标定，以反映较长的持续时间。

Dim rdoCn As New rdoConnection
Dim rdoRs As rdoResultset
Dim SQL As String
Dim TimeExpected As Single
Dim Ts As Single, Tn As Single

With rdoCn
    .Connect = "UID=;PWD=;Database=WorkDB;" _
        & "Server=SEQUEL;Driver={SQL Server}" _
        & "DSN='';"
    .LoginTimeout = 5
    .EstablishConnection rdDriverNoPrompt, True

    SQL = "Execute VeryLongProcedure"
    TimeExpected = 20 '希望这会需要 60 秒。

    Set rdoRs = .OpenResultset(Name:=SQL, _
        Type:=rdOpenForwardOnly, _
        LockType:=rdConcurReadOnly, _
        Option:=rdAsyncEnable)
    Ts = Timer
    ProgressBar1.Max = TimeExpected
    While rdoRs.StillExecuting
        Tn = Int(Timer - Ts)
        If Tn < TimeExpected Then
            ProgressBar1 = Tn
        Else
            ProgressBar1.Max = ProgressBar1.Max + 10
            TimeExpected = ProgressBar1.Max
        End If
        DoEvents
    Wend
    Status = "Query done. Duration:" & Int(Timer - Ts)

End With
rdoRs.Close
rdoCn.Close


Transactions 属性（远程数据）

返回一个值，用以指示对象是否可以记录一系列改变，该改变以后会回滚（撤消）或提交（保存）。

语法

object.Transactions

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Transactions 属性返回值是：

值 | 描述
True | 对象支持事务。
False | 对象不支持事务。

说明

在使用 BeginTrans 方法之前，先检查 Transactions 属性，以确保能支持事务。当 Transactions 为 False 时，使用 BeginTrans、CommitTrans 或 RollbackTrans 方法将没有作用。

Transactions 属性调用 ODBC SQLGetInfo 函数确定 ODBC 驱动程序是否能支持事务，而不是确定当前结果集是否是可更新的。如果 Transactions 属性为 True，对 rdoConnection 对象总是可以调用 BeginTrans 方法－即使是对只读的 rdoResultset 对象。


Type 属性（远程数据）

返回或设置一个值，用以指向对象的类型或数据类型。

语法

object.Type [=value]

Type 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 常数或 Integer 值，用以指示一个数据类型，“设置值”中有详细描述。

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

对于 rdoColumn 或 rdoParameter 对象，Type 属性返回一个 Integer。也可以对 rdoParameter 对象设置 Type 属性以指示指定的过程参数的数据类型。其有效值如下：

常数 | 值 | 描述
rdTypeCHAR | 1 | 是固定长度的字符串。长度由 Size 属性设置。
rdTypeNUMERIC | 2 | 带符号的、精确的、带有精度为 p 及比例为 s 的数字值（1 ≤ p ≤15，0 ≤ s ≤ p）。
rdTypeDECIMAL | 3 | 带符号的、精确的、带有精度为 p 及比例为 s 的数字值（1 ≤ p ≤15，0 ≤ s ≤ p）。
rdTypeINTEGER | 4 | 带符号的、精确的、带有精度为 10 及比例为 0 的数字值（带符号： -231 ≤ n ≤ 231-1，无符号：0 ≤ n ≤ 232-1）。
rdTypeSMALLINT | 5 | 带符号的、精确的、带有精度为 5 及比例为 0 的数字值（带符号： -32,768 ≤ n ≤ 32,767，无符号：0 ≤ n ≤ 65,535）。
rdTypeFLOAT | 6 | 带符号的、带有尾数精度为 15 的近似数字值（零或绝对值为 10-308 到 10308）。
rdTypeREAL | 7 | 带符号的、带有尾数精度为 7 的近似数字值（零或绝对值为 10-38 到 1038）。
rdTypeDOUBLE | 8 | 带符号的、带有尾数精度为 15 的近似数字值（零或绝对值为 10-308 到 10308）。
rdTypeDATE | 9 | Date－依赖于数据源。
rdTypeTIME | 10 | Time－依赖于数据源。
rdTypeTIMESTAMP | 11 | 时间标记－依赖于数据源。
rdTypeVARCHAR | 12 | 可变长字符串。最大长度为 255。
rdTypeLONGVARCHAR | -1 | 可变长字符串。最大长度由数据源确定。
rdTypeBINARY | -2 | 固定长度的二进制数据。最大长度为 255。
rdTypeVARBINARY | -3 | 可变长度的二进制数据。最大长度为 255。
rdTypeLONGVARBINARY | -4 | 可变长度的二进制数据。最大长度依赖于数据源。
rdTypeBIGINT | -5 | 带符号的、精确的、带有精度为 19（带符号）或 20（无符号），比例为 0，（带符号：-263 ≤ n ≤ 263-1，无符号：0 ≤ n ≤ 264-1）的数字值。
rdTypeTINYINT | -6 | 带符号的、精确的、带有精度为 3，比例为 0 的数字值，（带符号： -128 ≤ n ≤ 127，无符号：0 ≤ n ≤ 255）。
rdTypeBIT | -7 | 单个二进制数字。

对于 rdoQuery 对象，Type 属性返回一个 Integer。该返回值如下：

常数 | 值 | Query 类型
rdQSelect | 0 | 选定查询
rdQAction | 1 | 动作查询
rdQProcedures | 2 | 过程查询
rdQCompound | 3 | 查询既包含动作查询又包含选定查询的语句

对于 rdoResultset 对象，Type 属性返回一个 Integer，用以确定 rdoResultset 的类型。该返回值是：

常数 | 值 | rdoResultset 类型
rdOpenForwardOnly | 0 | 固定集，非滚动。
rdOpenKeyset | 1 | 可更新的，固定集、可滚动的查询结果集游标。
rdOpenDynamic | 2 | 可更新的，动态集、可滚动的查询结果集游标。
rdOpenStatic | 3 | 只读的、固定集。

注意 不是所有的 ODBC 驱动程序或数据源都支持每种 rdoResultset 游标类型。如果选取一个不支持的游标，ODBC 驱动程序就回复到一个支持的类型。如果没有支持的类型可用，就引发一个可以捕获的错误。

对于 rdoTable 对象，Type 属性返回一个 String。value 的设置值由数据源驱动程序确定。

这个字符串的典型值为"TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY". "LOCAL TEMPORARY", "ALIAS", "SYNONYM" 或一些其它的数据源指定的类型标识符。

说明

根据对象，Type 属性指示如下：

Object | Type 指示
rdoColumn, rdoParameter | 是对象数据类型
rdoQuery | 是查询类型
rdoResultset | 是 rdoResultset 类型
rdoTable | 是数据源的表类型

在某些情况下，当创建某些类型的参数查询时，必须取代由 RDO 赋值的 Type 属性。例如，如果一个参数被传递到在 SQL 语句中的一个表达式，ODBC 驱动程序就不能确定正确的类型。在这种情况下，可以简单地设置 rdoParameter 对象的 Type 属性，强行指定一个参数当作正确的类型来处理。这是允许改变 Type 属性的唯一的情况。除此之外的情况下，该属性是只读的。


Updatable 属性（远程数据）

返回一个 Boolean 值，用以指示是否可以对远程数据对象作改变。

语法

object.Updatable

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Updatable 属性返回值是：

值 | 描述
True | 对象可以改变或更新。
False | 对象不可以改变或更新。这是静态类型 rdoResultset 对象的唯一设置。

说明

如果将 Updatable 属性设置为 True，则指定：

  • rdoConnection 对象引用一个可更新的数据源。

  • rdoQuery 对象引用一个可更新的结果集.。

  • rdoResultset 包含可更新的行。

  • rdoTable 对象引用一个表，其数据可使用查询改变。

  • rdoColumn 对象引用可改变的数据。只有作为 rdoResultset 对象一部分的 rdoColumn 对象才能改变。

各种类型的 rdoResultset 对象都可以使用 Updatable 属性。

很多类型的 rdoResultset 对象可以包含不可更新的列。例如，可以创建一个仅向前类型 rdoResultset，它是从不可更新的源得到的，或是从包含可计算的或可得到的列中得到的。

如果对象只包含不可更新的列，Updatable 属性的值就为 False。当有一个或多个列可以更新，该属性的值就为 True。只能编辑可更新的列。如果试图为一个不可更新的列分配一个新值，就产生一个可捕获的错误。

因为一个可更新的对象可以包含不能更新的列，所以在编辑 rdoResultset 中的一行前，需要检查每个 rdoColumn 的 Updatable 属性。

即使当游标不能更新，使用动作查询更新数据也是可能的。在很多情况下，数据库表被保护，不能由设计来更新－就象其被系统管理员及远程系统的权限模式保护而不能直接访问一样。如果是这种情况，与系统管理员一起检查存储过程的可用性，或检查特殊的允许进行改变的登录帐户。


UpdateCriteria 属性

返回或设置一个值，指示在开放式批更新操作中如何为每一行构造 WHERE 子句。

语法

object.UpdateCriteria [= value]

UpdateCriteria 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Long 整数，用以表示游标的类型， 如下面“说明”中所述：

设置值

UpdateCriteria 属性有这些设置值：

常数 | 值 | rdoResultset type
rdCriteriaKey | 0 | （是缺省值）。仅仅使用 where 子句的键列。
rd CriteriaAllCols | 1 | 使用 where 子句中的键列及所有更新的列。
rd CriteriaUpdCols | 2 | 使用 where 子句中的键列及所有的列。.
Rd CriteriaTimeStamp | 3 | 仅仅使用可用的时间标记列（若在结果集中没有时间标记列，将生成一个运行时错误）。

说明

当执行一个批方式操作时， RDO 和 ClientBatch 游标库创建一系列 UPDATE 语句以做所需的改变。每个更新都创建一个 SQL WHERE 子句以与作了更新（由 Status 属性）标记的行隔开。因为一些远程的服务器使用触发器或其它方法实施参照完整，因此将要更新的列限制为只受该改变影响的列是很重要的。这个方法，只是执行绝对最小量的触发器代码。这样，该更新操作可以更快地执行并且潜在的错误也更少。

当 BLOB 列包含在结果集中时，应设置 UpdateCriteria 属性为 rdCriteriaKey 。

该属性设置为未列在此处的其它值，将导致一个运行时错误。


UpdateOperation 属性

返回或设置一个值，指定开放式批更新是否应该使用 Update 语句，还是先 Delete 后跟一个插入。

语法

object.UpdateOperation [= value]

UpdateOperation 属性的语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | Long 整数，用以表示游标的类型，如下面“说明”中所述：

设置值

UpdateOperation 属性有这些设置值：

常数 | 值 | UpdateOperation 类型
rdOperationUpdate | 0 | （是缺省值）为每一修改的行使用一个 Update 语句。.
rdOperationDelIns | 1 | 为每一修改的行使用一对 Delete 和 Insert 语句。

说明

pdateOperation 属性设置为未列在此处的其它值，将导致一个运行时错误。

该属性决定当将修改发回数据库服务器时，开放式批更新游标库是使用一个更新语句，还是使用一对删除和插入语句。在后一种情况下，对更新的行需要两个单独的操作。在某些情况下，特别是远程系统实施 Delete、Insert 和 Update 触发器时，选取正确的 UpdateOperation 属性对性能有重大的影响。

新添加的行总是生成 Insert 语句，删除行则总是生成 Delete 语句。因此，该属性只用于游标库如何更新修改的行。


UserName 属性（远程数据）

返回或设置一个值，用以表示 rdoEnvironment 对象的使用者。使用 UserName 属性及 Password 属性与 ODBC 数据源连接。

语法

object.UserName [= value]

UserName 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 字符串表达式，用以包含用户名，“设置值”中有详细描述。（数据类型是String。）

设置值

用户名的语法依赖于 ODBC 数据源。

返回值

UserName 属性表示 rdoEnvironment 对象的用户。当 rdoEnvironment 被 控件 RemoteData 自动创建时，被远程数据对象第一次引用时，或当运行 rdoCreateEnvironment 方法时，都要设置用户名。

可以使用 rdoEngine 对象的 rdoDefaultUser 属性确定缺省的用户名。如果没有在 UserName 中指定用户名，就使用 rdoDefaultUser 属性的值。


Value 属性（远程数据）

返回或设置对象的值。

语法

object.Value [= value]

Value 属性语法包含下面部分：

部分 | 描述
object | 对象表达式，其值是“应用于”列表中的一个对象。
value | 表达式，它用来求得一个适合数据类型的值，该数据类型是由对象的 Type 属性指定的。（数据类型是 Variant。）

说明

使用 Value 属性改变及检索 rdoResultset 对象中的数据。返回数据的数据类型由该对象的 Type 属性指示。

Value 属性是 rdoColumn 和 rdoParameter 对象的缺省属性。因此下列代码行是等效的（假定 Column1 是在第一个有序位置）：

Dim MyResultset As rdoResultset
X = MyResultset!Column1
X = MyResultset!Column1. Value
X = MyResultset(0)
X = MyResultset(0).Value
X = MyResultset("Column1").Value
X = MyResultset("Column1")
X = RemoteData1.Resultset("Column1")
X = RemoteData1.Resultset(0)
F$ = "Column1" : X = MyResultset(F$). Value
X = MyResultset(F$)
Set X = MyResultset(0): X. Value: X


Version 属性（远程数据）

返回一个值，用以指示与对象相关的数据源的版本。

语法

object.Version

object 所在处是一个对象表达式，其值是“应用于”列表中的一个对象。

返回值

Version 属性的返回值是一个 10 个字符的字符串表达式。

说明

对于 rdoConnection 对象，当创建连接时，该属性指示所用的数据源的版本。这个值是驱动管理程序依据的 ODBC版本。版本的格式是 ##.##.####，其中的头两个数字是主要版本号，随后两个数字是次要版本号，最后四个数字是编译号。