对 HelloData 的注释

HelloData 应用程序逐步完成典型 ADO 应用程序的基本操作:获取、检查、编辑和更新数据。 启动应用程序时,单击第一个按钮“获取数据”。 这将运行 GetData 子例程。

GetData

GetData 将有效的连接字符串放入模块级变量 m_sConnStr 中。 有关连接字符串的详细信息,请参阅创建连接字符串

使用 Visual Basic OnError 语句分配错误处理程序。 有关 ADO 中的错误处理的详细信息,请参阅错误处理。 将创建新的 Connection 对象,并且将 CursorLocation 属性设置为 adUseClient,因为 HelloData 示例会创建已断开连接的 Recordset。 这意味着,一旦从数据源提取数据,与数据源的物理连接就会中断,但你仍然可以处理 Recordset 对象中本地缓存的数据。

打开连接后,将 SQL 字符串分配给变量 (sSQL)。 然后创建新的 Recordset 对象 (m_oRecordset1) 的实例。 在下一行代码中,打开现有 Connection 上的 Recordset,将 sSQL 作为 Recordset 的源进行传入。 通过将最后一个参数中的 adCmdText 传递给 Recordset Open 方法,你帮助 ADO 确定作为 Recordset 的源传入的 SQL 字符串是命令的文本定义。 此行还设置与 Recordset 关联的 LockType 和 CursorType。

下一行代码将 MarshalOptions 属性设置为与其相等的 adMarshalModifiedOnly。 MarshalOptions 指示哪些记录应封送到中间层(或 Web 服务器)。 有关封送处理的详细信息,请参阅 COM 文档。 将 adMarshalModifiedOnly 与客户端游标 (CursorLocation = adUseClient) 一起使用时,仅将已对客户端进行了修改的记录写回中间层。 将 MarshalOptions 设置为 adMarshalModifiedOnly 可以提高性能,因为封送的行更少。

接下来,通过将 ActiveConnection 属性设置为与其相等的 Nothing 来断开与 Recordset 的连接。 有关详细信息,请参阅更新和保留数据中的“断开连接并重新连接 Recordset”部分。

关闭与数据源的连接并销毁现有的 Connection 对象。 这会释放消耗的资源。

最后一步是将 Recordset 设置为窗体上 Microsoft DataGrid 控件的 DataSource,以便可以轻松地在窗体上显示 Recordset 中的数据。

单击第二个按钮“检查数据”。 这将运行 ExamineData 子例程。

ExamineData

ExamineData 使用 Recordset 对象的各种方法和属性来显示有关 Recordset 中的数据的信息。 它使用 RecordCount 属性报告记录数。 它循环访问 Recordset,并在窗体上的显示文本框中打印 AbsolutePosition 属性的值。 此外,在循环中,第三条记录的 Bookmark 属性的值将放入变量 vBookmark 中供以后使用。

例程使用之前存储的书签变量直接导航回第三条记录。 该例程调用 WalkFields 子例程,该子例程循环访问 Recordset 的 Fields 集合,并显示有关集合中每个 Field 的详细信息。

最后,ExamineData 使用 Recordset 的 Filter 属性仅筛选 CategoryId 等于 2 的记录。 应用此筛选器的结果在窗体上的显示网格中立即可见。

有关 ExamineData 子例程中显示的功能的详细信息,请参阅检查数据

接下来,单击第三个按钮“编辑数据”。 这将运行 EditData 子例程。

EditData

当代码进入 EditData 子例程时,Recordset 仍根据 CategoryId 等于 2 进行筛选,以便仅显示满足筛选条件的项目。 它先循环访问 Recordset,然后将 Recordset 中每个可见项的价格提高 10%。 通过将该字段的 Value 属性设置为等于新的有效金额来更改 Price 字段的值。

请记住,Recordset 已与数据源断开连接。 EditData 中所做的更改仅适用于本地缓存的数据副本。 有关详细信息,请参阅编辑数据

在单击第四个按钮“更新数据”之前,不会对数据源进行更改。 这将运行 UpdateData 子例程。

UpdateData

首先,UpdateData 删除已应用于 Recordset 的筛选器。 代码删除 m_oRecordset1 并将其重置为窗体上 Microsoft Bound DataGrid 的 DataSource,以便未筛选的 Recordset 显示在网格中。

然后,代码检查是否可以通过将 Supports 方法与 adMovePrevious 参数结合使用来在 Recordset 中向后移动。

该例程使用 MoveFirst 方法移动到第一条记录,并使用 Field 对象的 OriginalValue 和 Value 属性显示字段的原始值和当前值。 更新和保留数据中讨论了这些属性,以及 UnderlyingValue 属性(此处未使用)。

接下来,将创建新的 Connection 对象,用于重新建立与数据源的连接。 通过将新的 Connection 设置为 Recordset 的 ActiveConnection,将 Recordset 重新连接到数据源。 若要将更新发送到服务器,代码将调用 Recordset 上的 UpdateBatch。

如果批量更新成功,则模块级标志变量 m_flgPriceUpdated 设置为 True。 稍后会提醒你清理对数据库所做的所有更改。

最后,代码返回到 Recordset 中的第一条记录,并显示原始值和当前值。 调用 UpdateBatch 后,这些值相同。

有关如何更新数据的详细信息,包括 Recordset 断开连接时服务器上的数据发生更改时执行的操作,请参阅更新和保留数据

Form_Unload

由于多种原因,Form_Unload 子例程非常重要。 首先,由于这是一个示例应用程序,因此 Form_Unload 会清理应用程序退出前对数据库所做的更改。 其次,代码演示如何使用 Execute 方法直接从打开的 Connection 对象执行命令。 最后,它演示了针对数据源执行非行返回查询的示例(UPDATE 查询)。