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