位置指定更新 (ODBC)

適用対象:SQL ServerAzure SQL データベースAzure SQL Managed InstanceAzure Synapse Analytics

ODBC では、カーソルで位置指定更新を実行するために、次の 2 とおりの方法をサポートします。

  • SQLSetPos

  • WHERE CURRENT OF 句

より一般的な方法は、 SQLSetPos を使用することです。 これには次のオプションがあります。

SQL_POSITION
現在の行セットの特定行にカーソルを位置付けます。

SQL_REFRESH
カーソルが現在位置付けられている行から取り出した値で、結果セット列にバインドされているプログラム変数を更新します。

SQL_UPDATE
結果セット列にバインドされているプログラム変数に格納されている値で、カーソルの現在行を更新します。

SQL_DELETE
カーソルの現在行を削除します。

SQLSetPos は、ステートメント ハンドル カーソル属性がサーバー カーソルを使用するように設定されている場合に、ステートメントの結果セットと共に使用できます。 結果セットの列を、プログラム変数にバインドする必要があります。 アプリケーションが行をフェッチするとすぐに、SQLSetPos(SQL_POSITION) 呼び出して行にカーソルを置きます。 その後、アプリケーションは SQLSetPos(SQL_DELETE) を呼び出して現在行を削除するか、新しいデータ値をバインドされているプログラム変数に移動し、SQLSetPos(SQL_UPDATE) を呼び出して現在行を更新します。

アプリケーションは、SQLSetPos を使用して行セット内の任意の行を更新または削除できます。 SQLSetPos の呼び出しは、SQL ステートメントの構築と実行に代わる便利な方法です。 SQLSetPos は現在の行セットで動作し、SQLFetchScroll の呼び出し後にのみ使用できます。

行セットのサイズは、SQL_ATTR_ROW_ARRAY_SIZEの属性引数を使用して SQLSetStmtAttr を呼び出すことによって設定されます。 SQLSetPos は新しい行セット サイズを使用しますが、 SQLFetch または SQLFetchScroll を呼び出した後にのみ使用されます。 たとえば、行セットのサイズが変更された場合、 SQLSetPos が呼び出され、 SQLFetch または SQLFetchScroll が呼び出されます。 SQLSetPos の呼び出しでは古い行セット サイズが使用されますが、SQLFetch または SQLFetchScroll では新しい行セット サイズが使用されます。

行セット内の先頭行の行番号は 1 です。 SQLSetPos の RowNumber 引数は、行セット内の行を識別する必要があります。つまり、その値は 1 から最近フェッチされた行数の範囲内である必要があります。 この値には、行セット サイズよりも小さい値を指定できます。 RowNumber が 0 の場合、操作は行セット内のすべての行に適用されます。

SQLSetPos の削除操作により、データ ソースはテーブルの選択された 1 つ以上の行を削除します。 SQLSetPosを持つ行を削除するには、アプリケーションはSQLSetPosを呼び出し、Operation をSQL_DELETEに設定し、RowNumber を削除する行の数に設定します。 RowNumber が 0 の場合は、行セット内のすべての行が削除されます。

SQLSetPos が戻った後、削除された行は現在の行であり、その状態はSQL_ROW_DELETED。 この行は、 SQLGetData または SQLSetPos の呼び出しなど、追加の位置指定操作では使用できません。

行セットのすべての行を削除すると (RowNumber が 0 に等しい)、アプリケーションは、 SQLSetPos の更新操作と同様に行操作配列を使用して、ドライバーが特定の行を削除できないようにできます。

削除対象の各行は、行セット内に存在する行でなければなりません。 フェッチによってアプリケーション バッファーが設定され、行の状態配列が維持されている場合は、これら各行位置の行の状態値が SQL_ROW_DELETED、SQL_ROW_ERROR、または SQL_ROW_NOROW であってはなりません。

位置更新は、 UPDATE、 DELETE、 INSERT 文のWHERE CURRENT OF節を使っても実行できます。 WHERE CURRENT OF には、 SQLGetCursorName 関数が呼び出されたときに ODBC によって生成されるカーソル名が必要です。または、 SQLSetCursorName を呼び出して指定できます。 次に、ODBC アプリケーションで WHERE CURRENT OF 更新の実行に使用する一般的な手順を示します。

  • SQLSetCursorName を呼び出して、ステートメント ハンドルのカーソル名を確立します。

  • FOR UPDATE OF 節を含む SELECT 文を作成し、実行します。

  • SQLFetchScroll を呼び出して行セットを取得するか、SQLFetch を呼び出して行を取得します。

  • SQLSetPos (SQL_POSITION) を呼び出して、行にカーソルを置きます。

  • UPDATEでカーソル名セットを使い、WHERE CURRENT OF節を持つ文をビルドし実行します。

または、SELECT ステートメントを実行する前に、SQLSetCursorNameを呼び出す代わりに、SELECT ステートメント実行した後SQLSetCursorName を呼び出すことも可能です。 SQLGetCursorName は、SQLSetCursorName を使用してカーソル名を設定しない場合、ODBC によって割り当てられた既定のカーソル名を返します。

SQLSetPos は、サーバー カーソルを使用している場合に WHERE CURRENT OF よりも優先されます。 ODBC カーソル ライブラリで静的で更新可能なカーソルを使用している場合、カーソル ライブラリは、基になるテーブルのキー値を指定した WHERE 句を追加することで、WHERE CURRENT OF 更新を実装します。 テーブル内のキーが一意でない場合、意図しない更新が行われることがあります。