次の方法で共有


SQL Server カーソルでのデータ更新

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

OLE DB ドライバーのダウンロード

SQL Server カーソルによってデータをフェッチおよび更新する場合、OLE DB Driver for SQL Server のコンシューマー アプリケーションについても、他のクライアント アプリケーションと同様の考慮事項や制約があてはまります。

同時実行データアクセス制御に関係するのは、SQL Server カーソル内の行だけです。 コンシューマーから変更可能な行セットが要求されるときは、コンカレンシー制御が DBPROP_LOCKMODE によって制御されます。 同時実行アクセス制御のレベルを変更するには、コンシューマーで行セットを開く前に DBPROP_LOCKMODE プロパティを設定します。

クライアント アプリケーションのデザインにより、トランザクションが長時間開かれたままの状態になる場合、トランザクション分離レベルが原因で行の位置指定が大幅に遅れる可能性があります。 既定では、OLE DB Driver for SQL Server は、DBPROPVAL_TI_READCOMMITTED によって指定される READ COMMITTED 分離レベルを使用します。 行セットのコンカレンシーが読み取り専用のときは、OLE DB Driver for SQL Server では、ダーティ リード分離がサポートされます。 そのため、コンシューマーは変更可能な行セットで、より高い分離レベルを要求できますが、より低い分離レベルは要求できません。

即時更新モードと遅延更新モード

即時更新モードでは、IRowsetChange::SetData を呼び出すたびに、SQL Server との間にラウンドトリップが発生します。 コンシューマーが 1 つの行に複数の変更を加える場合は、SetData を 1 回呼び出してすべての変更を実行する方が効率が高くなります。

遅延更新モードでは、IRowsetUpdate::UpdatecRows パラメーターと rghRows パラメーターに示される行ごとに、SQL Server との間にラウンドトリップが発生します。

どちらのモードでも、行セットに対してトランザクション オブジェクトが開いていないときは、1 つのラウンドトリップが個別のトランザクションを表します。

IRowsetUpdate::Update を使用している場合、示された各行が OLE DB Driver for SQL Server で処理されます。 任意の行の無効なデータ、長さ、または状態値が原因でエラーが発生しても、OLE DB Driver for SQL Server による処理は停止されません。 更新に関係する他のすべての行が変更されることも、そのような行がまったく変更されないこともあります。 OLE DB Driver for SQL Server から DB_S_ERRORSOCCURRED が返されたときは、コンシューマーでは返された prgRowStatus 配列を調べて、特定の行で発生したエラーを判断する必要があります。

コンシューマーでは、特定の順序で行が処理されることを想定しないでください。 1 行以上の行に対してデータ変更を順序付けて処理することが必要な場合、アプリケーション ロジックで順序を確立し、トランザクションを開いてそのロジックをトランザクション内に含める必要があります。

参照

行セット内のデータの更新