備考
SnapshotID
は、このダイナセットが作成されたスナップショットを示します。これはタイムスタンプのように考えられます。これを他のCreateDynaset
メソッドのコールに使用して、元のダイナセットと同じ時点のデータを使用するコールを作成できます。
Snapshot
プロパティには、別のSnapshot
値を設定できます。この新しいスナップショットは、次回のRefresh
操作時、問合せが再実行されるときに使用されます。Snapshot
プロパティは、(snapshotプロパティを介して設定されたその他のSnapshotID
ではなく)このOraDynaset
オブジェクトが基づくSnapshotID
を常に戻します。
SnapshotID
は、実行量とデータベースの構成に従って、ある時間が経過すると無効になります。これが起こると、Snapshot
too
old
エラー・メッセージが戻ります。スナップショットの詳細は、『Oracle Database概要』を参照してください。
このSnapshotID
は、このダイナセットが作成された時点を示します。このSnapshotID
を使用して追加作成されたダイナセットには、その時点以降に元のダイナセットに行われた変更(Edit
、Delete
およびAddNew
操作)は反映されません。
SnapshotID
オブジェクトは、SELECT
文の参照する表が、DUAL
などの疑似表ではなく実際のデータベース表である場合にのみ意味があります。
SnapshotID
の有効な使用目的の1つは、すべての行をフェッチするRecordCount
プロパティを使用せずに、表の行数を計算することです。「例: ダイナセットの行数の計算」を参照してください。
例
例: SnapShotプロパティの使用方法
この例では、SnapShot
プロパティの使用方法を示します。
Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim OraDynaset1 As OraDynaset Dim OraDynaset2 As OraDynaset Dim SnapshotID as SnapshotID 'Create the OraSession Object. Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'Create the OraDatabase Object by opening a connection to Oracle. Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&) 'ALLEN's JOB is initially SALESMAN OraDatabase.ExecuteSql("Update EMP set JOB = 'SALESMAN' where ENAME = 'ALLEN'") 'Create initial OraDynaset Object. Set OraDynaset1 = OraDatabase.CreateDynaset("select empno, ename," & _ "job from emp", 0&) MsgBox "OraDynaset1 -- Value of JOB is " & OraDynaset1.Fields("JOB").Value 'Change Allen's JOB OraDatabase.ExecuteSql("Update EMP set JOB = 'CLERK' where ENAME = 'ALLEN'") 'This SnapshotID represents the point in time in which OraDynaset1 was created Set SnapshotID = OraDynaset1.Snapshot 'Create OraDynaset2 from the same point in time as OraDynaset1 Set OraDynaset2 = OraDatabase.CreateDynaset("select JOB from EMP" & _ "where ENAME = 'ALLEN'", 0&, SnapshotID) MsgBox "OraDynaset2 -- Value of JOB from point of time of OraDynaset1 is " & _ OraDynaset2.Fields("JOB").Value 'We set the snapshot to NULL which will get us current point in time. OraDynaset2.Snapshot = Null 'We refresh it and it will get us the data from the current point in time OraDynaset2.Refresh MsgBox "OraDynaset2 -- Value of JOB from current point of time is " & _ OraDynaset2.Fields("JOB").Value 'And back again to the old point in time -- OraDynaset2.Snapshot = SnapshotID OraDynaset2.Refresh MsgBox "OraDynaset2 -- Value of JOB from point of time of OraDynaset1 is " & _ OraDynaset2.Fields("JOB").Value
例: ダイナセットの行数の計算
この例では、すべての行をフェッチするRecordCount
プロパティを使用せずに、ダイナセットの行数を計算します。この例で戻されるレコード数にはAddNew
またはDelete
操作が考慮されず、情報は、ダイナセットが作成された直後の状態であることに注意してください。
Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim OraDynaset As OraDynaset Dim OraDynCount As OraDynaset Dim SnapshotID as SnapshotID 'Create the OraSession Object. Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'Create the OraDatabase Object by opening a connection to Oracle. Set OraDatabase = OraSession.OpenDatabase("ExampleDb", "scott/tiger", 0&) 'Create the Dynaset Set OraDynaset = OraDatabase.CreateDynaset("select * from emp", 0&) Set SnapshotID = OraDynaset.Snapshot 'Use the snapshot for count query to guarantee the same point in time Set OraDynCount = OraDatabase.CreateDynaset("select count(*) NUMROWS" & _ "from emp", 0&, SnapshotID) MsgBox "Number of rows in the table is " & OraDynCount.Fields("NUMROWS").Value