SQL Server カーソルでのデータ更新
SQL Server カーソルによってデータをフェッチおよび更新する場合、SQL Server Native Client OLE DB プロバイダのコンシューマ アプリケーションについても、他のクライアント アプリケーションと同様の考慮事項や制約があてはまります。
同時実行データアクセス制御に関係するのは、SQL Server カーソル内の行だけです。コンシューマから変更可能な行セットが要求されるときは、同時実行制御が DBPROP_LOCKMODE によって制御されます。同時実行アクセス制御のレベルを変更するには、コンシューマで行セットを開く前に DBPROP_LOCKMODE プロパティを設定します。
クライアント アプリケーションのデザインにより、トランザクションが長時間開かれたままの状態になる場合、トランザクション分離レベルが原因で行の位置指定が大幅に遅れる可能性があります。既定では、SQL Server Native Client OLE DB プロバイダは、DBPROPVAL_TI_READCOMMITTED によって指定される READ COMMITTED 分離レベルを使用します。行セットの同時実行が読み取り専用のときは、ダーティ リード分離がサポートされます。そのため、コンシューマは変更可能な行セットで、より高い分離レベルを要求できますが、より低い分離レベルは要求できません。
即時更新モードと遅延更新モード
即時更新モードでは、IRowsetChange::SetData を呼び出すたびに、SQL Server との間にラウンドトリップが発生します。コンシューマが 1 つの行に複数の変更を加える場合は、SetData を 1 回呼び出してすべての変更を実行する方が効率が高くなります。
遅延更新モードでは、IRowsetUpdate::Update の cRows パラメータと rghRows パラメータに示される行ごとに、SQL Server との間にラウンドトリップが発生します。
どちらのモードでも、行セットに対してトランザクション オブジェクトが開いていないときは、1 つのラウンドトリップが個別のトランザクションを表します。
IRowsetUpdate::Update を使用している場合、示された各行が SQL Server Native Client OLE DB プロバイダで処理されます。任意の行の無効なデータ、長さ、または状態値が原因でエラーが発生しても、SQL Server Native Client OLE DB プロバイダによる処理は停止されません。更新に関係する他のすべての行が変更されることも、そのような行がまったく変更されないこともあります。SQL Server Native Client OLE DB プロバイダから DB_S_ERRORSOCCURRED が返されたときは、コンシューマでは返された prgRowStatus 配列を調べて、特定の行で発生したエラーを判断する必要があります。
コンシューマでは、特定の順序で行が処理されることを想定しないでください。1 行以上の行に対してデータ変更を順序付けて処理することが必要な場合、アプリケーション ロジックで順序を確立し、トランザクションを開いてそのロジックをトランザクション内に含める必要があります。