パラメーターのバインド
SQL ステートメントの各パラメーター マーカーは、ステートメントを実行する前にアプリケーション内の変数に関連付ける、つまりバインドする必要があります。バインドは SQLBindParameter 関数を呼び出すことによって行います。SQLBindParameter では、プログラム変数 (アドレス、C データ型など) をドライバーに示します。また、序数値を示すことでパラメーター マーカーを識別してから、そのパラメーター マーカーが表す SQL オブジェクト表現 (SQL データ型、有効桁数など) を記述します。
パラメーター マーカーは、ステートメントの実行前にいつでもバインドまたは再バインドできます。次のいずれかの操作を行うまでは、パラメーターのバインドは有効なままです。
Option パラメーターに SQL_RESET_PARAMS を設定して SQLFreeStmt を呼び出すと、そのステートメント ハンドルにバインドされたすべてのパラメーターが解放されます。
ParameterNumber にバインドされたパラメーター マーカーの序数を設定して SQLBindParameter を呼び出すと、前回のバインドが自動的に解放されます。
アプリケーションでは、パラメーターをプログラム変数の配列にバインドし、SQL ステートメントをバッチで処理することもできます。配列のバインドには、次の 2 種類があります。
列方向のバインドは、各パラメーターを変数の独自の配列にバインドすることで行います。
列方向のバインドは、Attribute に SQL_ATTR_PARAM_BIND_TYPE を、ValuePtr に SQL_PARAM_BIND_BY_COLUMN をそれぞれ設定し、SQLSetStmtAttr を呼び出すことによって指定します。
行方向のバインドは、SQL ステートメント内のすべてのパラメーターを 1 単位として、パラメーターの各変数を保持する構造体の配列にバインドすることで行います。
行方向のバインドは、Attribute に SQL_ATTR_PARAM_BIND_TYPE を、ValuePtr にプログラム変数を保持する構造体のサイズをそれぞれ設定し、SQLSetStmtAttr を呼び出すことによって指定します。
SQL Server Native Client ODBC ドライバーでは、文字列パラメーターやバイナリ文字列パラメーターをサーバーに送信するとき、SQLBindParameter の ColumnSize パラメーターに指定された長さになるまで値への埋め込みを行います。ODBC 2.x アプリケーションで ColumnSize に 0 が指定されると、ドライバーはデータ型の有効桁数までそのパラメーター値を埋め込みます。有効桁数は、SQL Server サーバーに接続している場合は 8,000、以前のバージョンの SQL Server に接続している場合は 255 です。バリアント型の列の場合、ColumnSize はバイト単位になります。
SQL Server では、ストアド プロシージャ パラメーターの名前を定義できます。また、ODBC 3.5 では、SQL Server ストアド プロシージャを呼び出すときに使用する名前付きパラメーターのサポートも導入されました。このサポートは次の目的に使用します。
ストアド プロシージャを呼び出し、そのストアド プロシージャ用に定義したパラメーターのサブセットに値を提供します。
アプリケーション内で、ストアド プロシージャの作成時に指定した順序とは異なる順序でパラメーターを指定します。
名前付きパラメーターがサポートされるのは、Transact-SQLEXECUTE ステートメントまたは ODBC CALL エスケープ シーケンスを使用してストアド プロシージャを実行するときだけです。
ストアド プロシージャ パラメーターに SQL_DESC_NAME を設定する場合、クエリ内のすべてのストアド プロシージャ パラメーターにも SQL_DESC_NAME を設定する必要があります。パラメーターが SQL_DESC_NAME に設定されたストアド プロシージャ呼び出しにリテラルを使用する場合、リテラルに 'name=value' の形式を使用する必要があります。ここで、name はストアド プロシージャ パラメーター名 (@p1 など) です。詳細については、「名前によるパラメーターのバインド (名前付きパラメーター)」を参照してください。