暂留数据

适用于:Access 2013、Office 2013

便携计算(例如,使用便携式计算机)需要在连接和断开状态下均可运行的应用程序。 通过让开发人员能够将客户端游标 Recordset 保存到磁盘并随后重新加载它,ADO 已添加了对此功能的支持。

在几种情形下可以使用此类型的功能,包括:

  • 旅行: 在路途中取得应用程序时,重要的是能够进行更改并添加新记录,然后可以随后重新连接到数据库,并提交它们。

  • 很少更新的查找: 在应用程序中,通常将表作为查找源,例如,州的税率表。 它们很少更新,并且是只读的。 应用程序每次启动时,并不需要从服务器重新读取此数据,而是可以直接从本地持久化的 Recordset 中加载数据。

在 ADO 中,若要保存并加载 Recordset ,请使用 ADO Recordset 对象的 Recordset.Save 和 Recordset.Open(,,,,adCmdFile) 方法。

可以使用 RecordsetSave 方法将 ADO Recordset 保存到磁盘上的文件。 (还可以将 Recordset 保存到 ADO Stream 对象。Stream对象稍后将在 guide.) Later 中讨论,则可以在准备好使用 Recordset 时使用 Open 方法重新打开它。 默认情况下,ADO 将 Recordset 保存为私有的 Microsoft Advanced Data TableGram (ADTG) 格式。 此二进制格式是使用 adPersistADTGPersistFormatEnum 值指定的。 或者,也可以选择使用 adPersistXML 将 Recordset 保存为 XML。 有关将记录集保存为 XML 的详细信息,请参阅 用 XML 格式持久化记录。

Save 方法的语法如下所示:

recordset.Save Destination, PersistFormat

第一次保存 Recordset 时,可以选择指定 Destination。 如果省略 Destination,系统将创建新文件,文件名为 Recordset 的 Source 属性的值。

第一次保存后随后再调用 Save 时,请省略 Destination,否则将发生运行时错误。 如果随后用新的 Destination 来调用 Save,Recordset 将保存到新的目标。 但是,新的目标和原始目标都将打开。

Save 不会关闭 Recordset 或 Destination,所以可以继续处理 Recordset 并保存最新更改。 Destination 将保持打开状态,直到 Recordset 关闭,在关闭期间,其他应用程序可以读取但不能写入 Destination。

由于安全原因,Save 方法只允许在 Microsoft Internet Explorer 执行的脚本中使用低安全设置和自定义安全设置。 有关安全问题的详细说明,请参阅 Microsoft 数据访问技术文章中 ActiveX 数据对象 (ADO) 技术文章中的“Microsoft Internet Explorer 中的 ADO 和 RDS 安全问题”。

如果在进行异步 Recordset 提取、执行或更新操作时调用 Save 方法,则会等到异步操作完成后再执行 Save。

记录的保存是从 Recordset 的第一行开始的。 Save 方法完成之后,当前行位置被移到 Recordset 的第一行。

为获得最佳结果,请用 Save 方法将 CursorLocation 属性设置为 adUseClient 。 如果提供程序不支持保存 Recordset 对象所需的所有功能,则游标服务将提供该功能。

在将 CursorLocation 属性设置为 adUseServer 的情况下持久化 Recordset 时,Recordset 的更新功能是有限的。 通常,只允许进行单表更新、插入和删除(取决于提供程序功能)。 在此配置中,Resync 方法也不可用。

由于 Destination 参数可以接受支持 OLE DB IStream 接口的任何对象,因此可以将 Recordset 直接保存到 ASP Response 对象。

在以下示例中,使用 Save 和 Open 方法来持久化 Recordset,并随后重新将它打开:

 
'BeginPersist 
 conn.ConnectionString = _ 
 "Provider='SQLOLEDB';Data Source='MySqlServer';" _ 
 & "Integrated Security='SSPI';Initial Catalog='pubs'" 
 conn.Open 
 
 conn.Execute "create table testtable (dbkey int " & _ 
 "primary key, field1 char(10))" 
 conn.Execute "insert into testtable values (1, 'string1')" 
 
 Set rst.ActiveConnection = conn 
 rst.CursorLocation = adUseClient 
 
 rst.Open "select * from testtable", conn, adOpenStatic, _ 
 adLockBatchOptimistic 
 
 'Change the row on the client 
 rst!field1 = "NewValue" 
 
 'Save to a file--the .dat extension is an example; choose 
 'your own extension. The changes will be saved in the file 
 'as well as the original data. 
 MyFile = Dir("c:\temp\temptbl.dat") 
 If MyFile <> "" Then 
 Kill "c:\temp\temptbl.dat" 
 End If 
 
 rst.Save "c:\temp\temptbl.dat", adPersistADTG 
 rst.Close 
 Set rst = Nothing 
 
 'Now reload the data from the file 
 Set rst = New ADODB.Recordset 
 rst.Open "c:\temp\temptbl.dat", , adOpenStatic, _ 
 adLockBatchOptimistic, adCmdFile 
 
 Debug.Print "After Loading the file from disk" 
 Debug.Print " Current Edited Value: " & rst!field1.Value 
 Debug.Print " Value Before Editing: " & rst!field1.OriginalValue 
 
 'Note that you can reconnect to a connection and 
 'submit the changes to the data source 
 Set rst.ActiveConnection = conn 
 rst.UpdateBatch 
'EndPersist 

本节包括下列主题: