次の方法で共有


データの保持

ポータブル コンピューティング (たとえばノート PC の使用) によって、接続状態と切断状態の両方で実行できるアプリケーションのニーズが生じました。 ADO はこのサポートを追加するために、クライアント カーソルの Recordset をディスクに保存し、後でリロードする機能を開発者が利用できるようにしました。

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

  • 移動中: 移動中にアプリケーションを使う場合、変更を加え、新しいレコードを追加し、それを後でデータベースに再接続してコミットできる機能を用意することが重要です。

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

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

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

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

  
recordset.  
Save  
Destination, PersistFormat  
  

Recordset を初めて保存するとき、Destination の指定は省略可能です。 Destination を省略すると、RecordsetSource プロパティの値に名前が設定された新しいファイルが作成されます。

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

Save でも Recordset または Destination は閉じないため、引き続き Recordset を操作して、最新の変更を保存できます。 Recordset が閉じられるまで、Destination は開いたままです。その間、他のアプリケーションから Destination を読み取ることはできますが、書き込むことはできません。

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

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

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

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

CursorLocation プロパティを adUseServer に設定して Recordset が永続化されている場合、Recordset の更新機能は制限されます。 通常、単一テーブルの更新、挿入、削除のみが許可されます (プロバイダーの機能によって異なります)。 この構成では、Resync メソッドも使用できません。

Destination パラメーターは OLE DB IStream インターフェイスをサポートするどのオブジェクトも受け入れることができるため、Recordset を ASP Response オブジェクトに直接保存できます。

次の例では、SaveOpen の各メソッドを使って 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  

注釈

このセクションでは、次のトピックを扱います。