SQLParamData 関数
準拠
導入されたバージョン: ODBC 1.0 標準コンプライアンス: ISO 92
まとめ
SQLParamData は、 SQLPutData と共に使用され、ステートメントの実行時にパラメーター データを提供し、ストリーム出力パラメーター データを取得するために SQLGetData と共に使用されます。
構文
SQLRETURN SQLParamData(
SQLHSTMT StatementHandle,
SQLPOINTER * ValuePtrPtr);
引数
StatementHandle
[入力]ステートメント ハンドル。
ValuePtrPtr
[出力]SQL_DESC_DATA_PTR記述子レコード フィールドに含まれるSQLBindValuePtr バッファーのアドレス (パラメーター データの場合) またはSQLBindCol (列データの場合) で指定されたTargetValuePtr バッファーのアドレスを返すバッファーへのポインター。
返品
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR、SQL_INVALID_HANDLE、またはSQL_PARAM_DATA_AVAILABLE。
診断
SQLParamDataがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合は、SQL_HANDLE_STMTのHandleTypeとStatementHandleのHandleを使用してSQLGetDiagRecを呼び出すことによって、関連付けられた SQLSTATE 値を取得できます。 次の表に、 SQLParamData によって通常返される SQLSTATE 値の一覧を示し、この関数のコンテキストでそれぞれについて説明します。表記 "(DM)" は、ドライバー マネージャーによって返される SQLSTATEs の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。
SQLSTATE | エラー | 説明 |
---|---|---|
01000 | 一般的な警告 | ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
07006 | 制限付きデータ型属性違反 | バインドされたパラメーターの SQLBindParameter の ValueType 引数によって識別されるデータ値を、SQLBindParameter の ParameterType 引数で識別されるデータ型に変換できませんでした。 SQL_PARAM_INPUT_OUTPUTまたはSQL_PARAM_OUTPUTとしてバインドされたパラメーターに対して返されたデータ値を、SQLBindParameter の ValueType 引数で識別されるデータ型に変換できませんでした。 (1 つ以上の行のデータ値を変換できなかったが、1 つ以上の行が正常に返された場合、この関数はSQL_SUCCESS_WITH_INFOを返します)。 |
08S01 | 通信リンクエラー | ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。 |
22026 | 文字列データの長さが合致しません | SQLGetInfo のSQL_NEED_LONG_DATA_LEN情報型は "Y" で、長いパラメーター (データ型はSQL_LONGVARCHAR、SQL_LONGVARBINARY、または長いデータ ソース固有のデータ型) に対して送信されるデータが、SQLBindParameter のStrLen_or_IndPtr引数で指定されたデータよりも少なくなりました。 SQLGetInfo のSQL_NEED_LONG_DATA_LEN情報型は "Y" で、長い列 (データ型はSQL_LONGVARCHAR、SQL_LONGVARBINARY、または長いデータ ソース固有のデータ型) に対して送信されるデータが、SQLBulkOperations で追加または更新されたデータ行の列に対応する長さバッファーで指定されたデータよりも少なくSQLSetPos で更新されました。 |
40001 | シリアル化エラー | リソースが別のトランザクションとデッドロックしたため、トランザクションがロールバックされました。 |
40003 | ステートメントの入力候補が不明です | この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。 |
HY000 | 一般的なエラー | 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。 |
HY001 | メモリ割り当てエラー | ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。 |
HY008 | 操作が取り消されました | StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandle が StatementHandle で呼び出されました。その後、関数は StatementHandle で再度呼び出されました。 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandle がマルチスレッド アプリケーション内の別のスレッドから StatementHandle で呼び出されました。 |
HY010 | 関数シーケンス エラー | (DM) 前の関数呼び出しは、 SQLExecDirect、 SQLExecute、 SQLBulkOperations、または SQLSetPos の呼び出しではなく、戻りコードがSQL_NEED_DATAされたか、前の関数呼び出しが SQLPutData の呼び出しでした。 前の関数呼び出しは、 SQLParamData の呼び出しでした。 (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は、 SQLParamData 関数が呼び出されたときにまだ実行されていました。 (DM) 非同期実行関数 (この関数ではない) が StatementHandle に対して呼び出されこの関数が呼び出されたときにはまだ実行されていました。 SQLExecute、 SQLExecDirect、 SQLBulkOperations、または SQLSetPos が StatementHandle に対して呼び出され、SQL_NEED_DATAが返されました。 SQLCancel は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。 |
HY013 | メモリ管理エラー | メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。 |
HY117 | 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 | (DM) 中断状態の詳細については、「 SQLEndTran 関数を参照してください。 |
HYT01 | 接続のタイムアウト | データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。 |
IM001 | ドライバーは、この関数をサポートしていません | (DM) StatementHandle に対応するドライバーは、関数をサポートしていません。 |
IM017 | 非同期通知モードでポーリングが無効になっている | 通知モデルが使用されるたびに、ポーリングは無効になります。 |
IM018 | SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 | ハンドルに対する前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、後処理を実行して操作を完了するために、 SQLCompleteAsync をハンドルで呼び出す必要があります。 |
Comments
SQLParamData を呼び出して、SQLExecute の呼び出しで使用されるパラメーター データ、SQLExecDirect、SQLBulkOperations の呼び出しによって行が更新または追加されたときに使用される列データSQLSetPos の呼び出しによって更新される、2 つの用途の実行時データを提供できます。 実行時に、 SQLParamData は、ドライバーが必要とするデータのインジケーターをアプリケーションに返します。
アプリケーションが SQLExecute、 SQLExecDirect、 SQLBulkOperations、または SQLSetPos を呼び出すと、実行時データが必要な場合、ドライバーはSQL_NEED_DATAを返します。 その後、アプリケーションは SQLParamData を呼び出して、送信するデータを決定します。 ドライバーでパラメーター データが必要な場合、ドライバーは、 *ValuePtrPtr 出力バッファーで、アプリケーションが行セット バッファーに格納した値を返します。 アプリケーションでは、この値を使用して、ドライバーが要求しているパラメーター データを決定できます。 ドライバーが列データを必要とする場合、ドライバーは、次のように、 *ValuePtrPtr 列が最初にバインドされたアドレスをバッファーで返します。
Bound Address + Binding Offset + ((Row Number - 1) x Element Size)
ここで、変数は次の表に示すように定義されます。
Variable | 説明 |
---|---|
バインドされたアドレス | SQLBindCol の TargetValuePtr 引数で指定されたアドレス。 |
バインディング オフセット | SQL_ATTR_ROW_BIND_OFFSET_PTR ステートメント属性で指定されたアドレスに格納されている値。 |
Row Number | 行セット内の行の 1 から始まる番号。 単一行フェッチの場合(既定値)、これは 1 です。 |
要素のサイズ | データ バッファーと長さ/インジケーター バッファーの両方の SQL_ATTR_ROW_BIND_TYPE ステートメント属性の値。 |
また、SQL_NEED_DATAが返されます。これは、 SQLPutData を呼び出してデータを送信する必要があることをアプリケーションに示します。
アプリケーションは、 SQLPutData 列またはパラメーターの実行時データを送信するために必要な回数を呼び出します。 列またはパラメーターのすべてのデータが送信されると、アプリケーションは SQLParamData を再度呼び出します。 SQLParamDataが再びSQL_NEED_DATAを返す場合は、別のパラメーターまたは列のデータを送信する必要があります。 そのため、アプリケーションは再び SQLPutData を呼び出します。 すべてのパラメーターまたは列に対してすべての実行時データが送信された場合、 SQLParamData はSQL_SUCCESSまたはSQL_SUCCESS_WITH_INFOを返します。 *ValuePtrPtr の値は未定義であり、SQL ステートメントを実行するか、 SQLBulkOperations または SQLSetPos 呼び出しを処理できます。
SQLParamDataデータ ソースの行に影響を与えない検索された更新または削除ステートメントのパラメーター データを提供する場合、SQLParamData の呼び出しはSQL_NO_DATAを返します。
ステートメントの実行時にデータ実行時のパラメーター データを渡す方法の詳細については、「SQLBindParameter のパラメーター値の渡し」および「長いデータの送信」を参照してください。 実行時のデータ列データの更新または追加方法の詳細については、「sqlSetPos の使用」、 sqlBulkOperations の「ブックマークを使用した一括更新の実行」、「 SQLBulkOperations」、および「 Long Data and SQLSetPos および SQLBulkOperations」の「SQLSetPos の使用」セクションを参照してください。
SQLParamData を呼び出して、ストリーム出力パラメーターを取得できます。
コード例
関連する関数
情報 | 参照トピック |
---|---|
バッファーをパラメーターにバインドする | SQLBindParameter 関数 |
ステートメント処理の取り消し | SQLCancel 関数 |
ステートメント内のパラメーターに関する情報を返す | SQLDescribeParam 関数 |
SQL ステートメントの実行 | SQLExecDirect 関数 |
準備された SQL ステートメントの実行 | SQLExecute 関数 |
実行時のパラメーター データの送信 | SQLPutData 関数 |