データの永続化

ポータブル コンピューティング (ノート PC など) では、接続状態と切断状態の両方で実行できるアプリケーションの必要性が生まれています。 ADO では、Recordset クライアント カーソルをディスクに保存し、後で再読み込みする機能を開発者に提供することで、このサポートが追加されました。

次のような、この種類の機能を使用できるシナリオがいくつかあります。

  • 旅行: アプリケーションを道路上で使用する場合は、変更を加え、後でデータベースに再接続してコミットできる新しいレコードを追加する機能を提供することが重要です。

  • 更新頻度の低いルックアップ: 多くの場合、アプリケーションでは、テーブルがルックアップ (州税テーブルなど) として使用されます。 更新頻度が低く、読み取り専用です。 アプリケーションを起動するたびにサーバーからこのデータを再読み込みする代わりに、アプリケーションはローカルに永続化された Recordsetからデータを読み込むことができます。

ADO では、recordsets 保存して読み込むには、ADO Recordset オブジェクトの Recordset.Save および Recordset.Open(,,,,adCmdFile) メソッドを使用します。

Recordset Save メソッドを使用して、ADO Recordset をディスク上のファイルに保持できます。 (Recordset を ADO Stream オブジェクトに保存することもできます。Stream オブジェクトについては、後で説明します)。後で、Open メソッドを使用して、Recordset を使用する準備ができたら再度開くことができます。 既定では、ADO は Recordset を独自の Microsoft Advanced Data TableGram (ADTG) 形式に保存します。 このバイナリ形式は、adPersistADTG PersistFormatEnum 値を使用して指定されます。 または、adPersistXML を使用して、Recordset を XML として保存することもできます。 レコードセットを XML として保存する方法の詳細については、「XML 形式でのレコードの保持」を参照してください。

Save メソッドの構文は次のとおりです。

  
recordset.  
Save  
Destination, PersistFormat  
  

初めて Recordsetを保存する際、Destinationを指定することは任意です。 宛先 を省略した場合、Recordsetの Source プロパティの値に基づいた名前の新しいファイルが作成されます。

後続の呼び出しで最初の保存の後に 保存 を呼び出すときには、宛先 を省略する必要があります。そうしなければ、実行時エラーが発生します。 その後、新しい Destinationで Save を呼び出すと、Recordset が新しい宛先に保存されます。 ただし、新しい宛先と元の宛先の両方が開きます。

[保存] 、Recordset または Destinationを閉じないため、引き続き Recordset を操作し、最新の変更を保存できます。 Destination は、Recordset が閉じられるまで開いたままであり、その間、他のアプリケーションは読み取りはできますが、宛先 への書き込みできません。

セキュリティ上の理由から、Save メソッドでは、Microsoft Internet Explorer によって実行されるスクリプトからの低セキュリティ設定とカスタム セキュリティ設定のみを使用できます。

非同期 Recordset フェッチ、実行、または更新操作の実行中に Save メソッドが呼び出された場合、Save は非同期操作が完了するまで待機します。

レコードは、Recordsetの最初の行から始めて保存されます。 Save メソッドが完了すると、現在の行の位置が Recordsetの最初の行に移動されます。

最良の結果を得るには、CursorLocation プロパティを adUseClient と Saveを用いて設定します。 プロバイダーが Recordset オブジェクト を保存するために必要なすべての機能をサポートしていない場合、Cursor Service がその機能を提供します。

Recordset が CursorLocation プロパティを adUseServerに設定して永続化されている場合、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  
   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  

備考

このセクションには、次のトピックが含まれています。

  • レコードセットの永続化に関する詳細

  • フィルター処理されたレコードセットと階層レコードセットの永続化を する

  • XML 形式のレコードの永続化