次の方法で共有


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

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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 つの行に複数の変更を加える場合は、SetData を 1 回呼び出してすべての変更を実行する方が効率が高くなります。

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

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

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 行以上の行に対してデータ変更を順序付けて処理することが必要な場合、アプリケーション ロジックで順序を確立し、トランザクションを開いてそのロジックをトランザクション内に含める必要があります。

参照

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