SQLExecute 関数
準拠
導入されたバージョン: ODBC 1.0 標準準拠: ISO 92
まとめ
SQLExecute は、パラメーター マーカー変数の現在の値を使用して、準備されたステートメントを実行します (ステートメントにパラメーター マーカーが存在する場合)。
構文
SQLRETURN SQLExecute(
SQLHSTMT StatementHandle);
引数
StatementHandle
[入力]ステートメント ハンドル。
戻り値
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_STILL_EXECUTING、SQL_ERROR、SQL_NO_DATA、SQL_INVALID_HANDLE、またはSQL_PARAM_DATA_AVAILABLE。
診断
SQLExecute がSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合は、関連付けられている SQLSTATE 値を取得するには、SQL_HANDLE_STMTの HandleType と StatementHandle のハンドルを使用して SQLGetDiagRec を呼び出します。 次の表に、 SQLExecute によって一般的に返される SQLSTATE 値を示し、この関数のコンテキストでそれぞれについて説明します。ドライバー マネージャーによって返される SQLSTATEs の説明の前に表記 "(DM)" が付きます。 特に記載がない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERRORされます。
SQLSTATE | エラー | 説明 |
---|---|---|
01000 | 一般的な警告 | ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01001 | カーソル操作の競合 | StatementHandle に関連付けられている準備されたステートメントには、位置指定された更新ステートメントまたは delete ステートメントが含まれており、行または複数の行が更新または削除されませんでした。 (複数の行の更新の詳細については、SQLSetStmtAttr のSQL_ATTR_SIMULATE_CURSOR属性の説明を参照してください)。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01003 | set 関数で削除された NULL 値 | StatementHandle に関連付けられている準備されたステートメントには、SET 関数 (AVG、MAX、MIN など) が含まれていましたが、COUNT セット関数および NULL 引数の値は、関数が適用される前に削除されませんでした。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01004 | 文字列データ、右切り捨て | 出力パラメーターに対して返された文字列またはバイナリ データは、非空白文字または NULL 以外のバイナリ データの切り捨てになります。 文字列値の場合は、右に切り捨てられました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01006 | 権限が取り消されない | StatementHandle に関連付けられた準備済みステートメントは REVOKE ステートメントであり、ユーザーは指定された特権を持っていませんでした。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01007 | 特権が付与されていません | StatementHandle に関連付けられた準備済みステートメントは GRANT ステートメントであり、指定された特権をユーザーに付与できませんでした。 |
01S02 | オプションの値が変更されました | 指定されたステートメント属性は、実装の作業条件のために無効であるため、同様の値が一時的に置き換えられました。 (SQLGetStmtAttr を呼び出して、一時的に置き換えられる値が何であるかを判断できます)。置き換え値は、カーソルが閉じられるまで StatementHandle に対して有効です。この時点で、ステートメント属性は前の値に戻ります。 変更できるステートメント属性は、SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、SQL_ATTR_KEYSET_SIZE、SQL_ATTR_MAX_LENGTH、SQL_ATTR_MAX_ROWS、SQL_ATTR_QUERY_TIMEOUT、およびSQL_ATTR_SIMULATE_CURSORです。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01S07 | 小数部の切り捨て | 入力/出力または出力パラメーターに対して返されたデータは、数値データ型の小数部が切り捨てられたか、時刻、タイムスタンプ、または間隔データ型の時間コンポーネントの小数部が切り捨てられた場合に切り捨てられました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
07002 | COUNT フィールドが正しくありません | SQLBindParameter で指定されたパラメーターの数が、*StatementText に含まれるSQLステートメント内のパラメーターの数より少なかった。 SQLBindParameter は、ParameterValuePtr を null ポインターに設定StrLen_or_IndPtr、SQL_NULL_DATAまたはSQL_DATA_AT_EXECに設定されず、InputOutputType がSQL_PARAM_OUTPUTに設定されていないため、SQLBindParameter で指定されたパラメーターの数が *StatementText に含まれるSQLステートメント内のパラメーターの数より大きくなっています。 |
07006 | 制限付きデータ型属性違反 | バインドされたパラメーターの SQLBindParameter の ValueType 引数によって識別されるデータ値を、SQLBindParameter の ParameterType 引数で識別されるデータ型に変換できませんでした。 SQL_PARAM_INPUT_OUTPUTまたはSQL_PARAM_OUTPUTとしてバインドされたパラメーターに対して返されたデータ値は、SQLBindParameter の ValueType 引数で識別されるデータ型に変換できませんでした。 (1 つ以上の行のデータ値を変換できませんでしたが、1 つ以上の行が正常に返された場合、この関数はSQL_SUCCESS_WITH_INFOを返します)。 |
07007 | 制限付きパラメーター値違反 | パラメーター型SQL_PARAM_INPUT_OUTPUT_STREAMは、パーツ内のデータを送受信するパラメーターにのみ使用されます。 このパラメーター型では、入力バインド バッファーは使用できません。 このエラーは、パラメーターの型がSQL_PARAM_INPUT_OUTPUTされ、SQLBindParameter で指定された *StrLen_or_IndPtr がSQL_NULL_DATA、SQL_DEFAULT_PARAM、SQL_LEN_DATA_AT_EXEC(len)、またはSQL_DATA_AT_EXECと等しくない場合に発生します。 |
07S01 | 既定のパラメーターの使用が無効です | SQLBindParameter で設定されたパラメーター値がSQL_DEFAULT_PARAMされ、対応するパラメーターが ODBC 標準プロシージャ呼び出しのパラメーターではありません。 |
08S01 | 通信リンクエラー | ドライバーとドライバーが接続されているデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。 |
21S02 | 派生テーブルの次数が列リストと一致しない | StatementHandle に関連付けられた準備済みステートメントには CREATE VIEW ステートメントが含まれており、非修飾列リスト (SQL ステートメントの列識別子引数のビューに指定された列の数) には、SQL ステートメントのクエリ仕様引数によって定義された派生テーブル内の列数よりも多くの名前が含まれていました。 |
22001 | 文字列データ、右切り捨て | 列に文字またはバイナリ値を割り当てると、非空白文字 (文字) または null 以外 (バイナリ) 文字またはバイトが切り捨てられました。 |
22002 | インジケーター変数は必須ですが、指定されていません | SQLBindParameter によって設定されたStrLen_or_IndPtrが null ポインターである出力パラメーターに NULL データがバインドされました。 |
22003 | 範囲外の数値 | StatementHandle に関連付けられた準備済みステートメントには、バインドされた数値パラメーターが含まれており、パラメーター値により、関連付けられているテーブル列に割り当てられると、数値の一部全体が切り捨てられます (小数部ではなく)。 1 つ以上の入力/出力パラメーターまたは出力パラメーターに対して数値 (数値または文字列) を返すと、数値の一部全体 (小数部ではなく) が切り捨てられます。 |
22007 | datetime 形式が無効です | StatementHandle に関連付けられている準備済みステートメントには、バインドされたパラメーターとして日付、時刻、またはタイムスタンプの構造体を含むSQLステートメントが含まれており、パラメーターはそれぞれ無効な日付、時刻、またはタイムスタンプでした。 入出力パラメーターまたは出力パラメーターが日付、時刻、またはタイムスタンプ C 構造体にバインドされ、返されたパラメーターの値はそれぞれ無効な日付、時刻、またはタイムスタンプでした。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
22008 | Datetime フィールドオーバーフロー | StatementHandle に関連付けられた準備されたステートメントには、datetime 式を含むSQLステートメントが含まれ、計算されると、日付、時刻、またはタイムスタンプ構造が無効になります。 入力/出力パラメーターまたは出力パラメーターに対して計算された datetime 式の結果、無効な日付、時刻、またはタイムスタンプ C 構造体が生成されました。 |
22012 | 0 で除算しました | StatementHandle に関連付けられている準備されたステートメントには、0 による除算の原因となった算術式が含まれていました。 入力/出力パラメーターまたは出力パラメーターに対して計算された算術式の結果、0 で除算されます。 |
22015 | Interval フィールドのオーバーフロー | *StatementText には、正確な数値または間隔パラメーターが含まれていました。このパラメーターをデータ型SQL間隔に変換すると、有効桁数が失われます。 *StatementText には、複数のフィールドを持つ間隔パラメーターが含まれていました。このパラメーターを列の数値データ型に変換すると、数値データ型に表現が含まれていませんでした。 *StatementText には、interval SQL型に割り当てられたパラメーター データが含まれており、間隔SQL型に C 型の値の表現がありませんでした。 正確な数値または間隔SQL型の入出力パラメーターを間隔 C 型に割り当てると、有効桁数が失われます。 入力/出力または出力パラメーターが間隔 C 構造体に割り当てられた場合、間隔データ構造内のデータの表現はありませんでした。 |
22018 | キャスト指定の文字値が無効です | *StatementText には、正確または近似の数値、datetime、または間隔のデータ型である C 型が含まれていました。列のSQL型が文字データ型であり、列の値がバインドされた C 型の有効なリテラルではなかった。 入力/出力または出力パラメーターが返されたとき、SQL型は正確または近似数値、datetime、または間隔データ型でした。C 型はSQL_C_CHAR;、列の値はバインドされたSQL型の有効なリテラルではありません。 |
22019 | エスケープ文字が無効です | StatementHandle に関連付けられた準備済みステートメントには、WHERE 句に ESCAPE を含む LIKE 述語が含まれており、ESCAPE の後のエスケープ文字の長さが 1 に等しくなっていない。 |
22025 | エスケープ シーケンスが無効です | StatementHandle に関連付けられた準備済みステートメントには WHERE 句に "LIKEpatternvalueESCAPEescapecharacter" が含まれており、パターン値のエスケープ文字の後の文字が "%" または "_" の 1 つではなかった。 |
23000 | 整合性制約違反 | StatementHandle に関連付けられている準備済みステートメントにパラメーターが含まれていました。 関連付けられたテーブル列で NOT NULL として定義された列に対してパラメーター値が NULL であったか、一意の値のみを含む列に重複する値が指定されたか、またはその他の整合性制約に違反しました。 |
24000 | カーソル状態が無効 | カーソルが SQLFetch または SQLFetchScroll によって StatementHandle に配置されました。 このエラーは、 SQLFetch または SQLFetchScroll がSQL_NO_DATAを返していない場合はドライバー マネージャーによって返され、 SQLFetch または SQLFetchScroll がSQL_NO_DATAを返した場合はドライバーによって返されます。 StatementHandle でカーソルが開かれていました。 StatementHandle に関連付けられた準備済みステートメントには、配置された更新または削除の statemen,t が含まれており、カーソルは結果セットの開始前または結果セットの末尾の後に配置されました。 |
40001 | シリアル化エラー | 別のトランザクションでリソースのデッドロックが発生したため、トランザクションがロールバックされました。 |
40003 | ステートメントの入力候補が不明です | この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。 |
42000 | 構文エラーまたはアクセス違反 | ユーザーには、 StatementHandle に関連付けられた準備済みステートメントを実行する権限がありませんでした。 |
44000 | WITH CHECK OPTION 違反 | StatementHandle に関連付けられた準備済みステートメントには、表示テーブルまたは表示テーブルから派生した INSERT ステートメントが含まれていました。このステートメントは WITH CHECK OPTION を指定して作成され、INSERT ステートメントの影響を受ける 1 つ以上の行が表示テーブルに存在しなくなります。 StatementHandle に関連付けられた準備済みステートメントには、表示テーブルまたは WITH CHECK OPTION を指定して作成された表示テーブルから派生したテーブルに対して実行される UPDATE ステートメントが含まれていました。これにより、UPDATE ステートメントの影響を受ける 1 つ以上の行が表示テーブルに存在しなくなります。 |
HY000 | 一般的なエラー | 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージは、エラーとその原因について説明します。 |
HY001 | メモリ割り当てエラー | ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てることができませんでした。 |
HY008 | 操作が取り消されました | StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandle が StatementHandle で呼び出されました。 その後、 StatementHandle で関数が再び呼び出されました。 関数が呼び出され、実行が完了する前に、マルチスレッド アプリケーション内の別のスレッドから StatementHandle で SQLCancel または SQLCancelHandle が呼び出されました。 |
HY010 | 関数シーケンス エラー | (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期的に実行される関数が呼び出されました。 この非同期関数は、 SQLExecute 関数が呼び出されたときにまだ実行されていました。 (DM) StatementHandle に対して SQLExecute、SQLExecDirect、または SQLMoreResults が呼び出され、SQL_PARAM_DATA_AVAILABLE返されました。 この関数は、ストリーミングされたすべてのパラメーターのデータが取得される前に呼び出されました。 (DM) 非同期実行関数 (この関数ではなく) が StatementHandle に対して呼び出され、この関数が呼び出されたときにまだ実行されていました。 (DM) StatementHandle に対して SQLExecute、SQLExecDirect、SQLBulkOperations、または SQLSetPos が呼び出され、SQL_NEED_DATA返されました。 この関数は、実行時のすべてのデータ パラメーターまたは列に対してデータが送信される前に呼び出されました。 (DM) StatementHandle は準備されていません。 |
HY013 | メモリ管理エラー | メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。 |
HY090 | 文字列またはバッファーの長さが無効です | SQLBindParameter で設定されたパラメーター値が null ポインターで、パラメーターの長さの値が 0、SQL_NULL_DATA、SQL_DATA_AT_EXEC、SQL_DEFAULT_PARAM、または SQL_LEN_DATA_AT_EXEC_OFFSET 以下でした。 SQLBindParameter で設定されたパラメーター値が null ポインターではありません。C データ型がSQL_C_BINARYまたはSQL_C_CHAR。パラメーターの長さの値は 0 未満でしたが、SQL_NTS、SQL_NULL_DATA、SQL_DEFAULT_PARAM、SQL_DATA_AT_EXEC、またはSQL_LEN_DATA_AT_EXEC_OFFSET以下でした。 SQLBindParameter によってバインドされたパラメーター長の値がSQL_DATA_AT_EXECに設定されました。SQL型は、SQL_LONGVARCHAR、SQL_LONGVARBINARY、または長いデータ ソース固有のデータ型のいずれかであり、SQLGetInfo のSQL_NEED_LONG_DATA_LEN情報型は "Y" でした。 |
HY105 | パラメーターの型が無効です | SQLBindParameter の引数 InputOutputType に指定された値がSQL_PARAM_OUTPUTされ、パラメーターが入力パラメーターでした。 |
HY109 | カーソル位置が無効です | 準備されたステートメントは位置指定された更新ステートメントまたは delete ステートメントであり、カーソルは削除された行またはフェッチできなかった行に ( SQLSetPos または SQLFetchScroll によって) 配置されました。 |
HY117 | 不明なトランザクション状態が原因で接続が中断されます。 切断と読み取り専用の関数のみが許可されます。 | (DM) 中断状態の詳細については、「 SQLEndTran 関数」を参照してください。 |
HYC00 | 省略可能な機能が実装されていません | SQL_ATTR_CONCURRENCYとSQL_ATTR_CURSOR_TYPEステートメント属性の現在の設定の組み合わせは、ドライバーまたはデータ ソースではサポートされていませんでした。 SQL_ATTR_USE_BOOKMARKS ステートメント属性がSQL_UB_VARIABLEに設定され、SQL_ATTR_CURSOR_TYPE ステートメント属性がカーソルの種類に設定され、ドライバーがブックマークをサポートしていません。 |
HYT00 | タイムアウトに達しました | データ ソースが結果セットを返す前に、クエリのタイムアウト期間が期限切れになりました。 タイムアウト期間は、 SQLSetStmtAttr (SQL_ATTR_QUERY_TIMEOUT) によって設定されます。 |
HYT01 | 接続のタイムアウト | 接続タイムアウト期間は、データ ソースが要求に応答する前に期限切れになりました。 接続タイムアウト期間は、 SQLSetConnectAttr (SQL_ATTR_CONNECTION_TIMEOUT) によって設定されます。 |
IM001 | ドライバーは、この関数をサポートしていません。 | (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。 |
IM017 | 非同期通知モードでポーリングが無効になっている | 通知モデルが使用されるたびに、ポーリングは無効になります。 |
IM018 | SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 | ハンドルの前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、処理後の処理を実行して操作を完了するには、そのハンドルで SQLCompleteAsync を呼び出す必要があります。 |
SQLExecute は、データ ソースがステートメントに関連付けられているSQLステートメントを評価するタイミングに基づいて、SQLPrepare から返すことができる任意の SQLSTATE を返すことができます。
コメント
SQLExecute は、 SQLPrepare によって準備されたステートメントを実行します。 アプリケーションが SQLExecute の呼び出しの結果を処理または破棄した後、アプリケーションは新しいパラメーター値を使用して SQLExecute を再度呼び出すことができます。 準備された実行の詳細については、「 準備された実行」を参照してください。
SELECT ステートメントを複数回実行するには、SELECT ステートメントを再実行する前に、アプリケーションで SQLCloseCursor を呼び出す必要があります。
データ ソースが手動コミット モード (明示的なトランザクション開始を必要とする) で、トランザクションがまだ開始されていない場合、ドライバーはSQLステートメントを送信する前にトランザクションを開始します。 詳細については、「トランザクション」を参照してください。
アプリケーションが SQLPrepare を使用して準備し、 SQLExecute で COMMIT ステートメントまたは ROLLBACK ステートメントを送信する場合、DBMS 製品間で相互運用することはできません。 トランザクションをコミットまたはロールバックするには、 SQLEndTran を呼び出します。
SQLExecute が実行時データ パラメーターを検出すると、SQL_NEED_DATAが返されます。 アプリケーションは、 SQLParamData と SQLPutData を 使用してデータ を送信します。 SQLBindParameter、SQLParamData、SQLPutData、および長いデータの送信に関するページを参照してください。
SQLExecute が、データ ソースの行に影響を与えない検索された更新、挿入、または削除のステートメントを実行した場合、SQLExecute の呼び出しはSQL_NO_DATAを返します。
SQL_ATTR_PARAMSET_SIZE ステートメント属性の値が 1 より大きく、SQL ステートメントに少なくとも 1 つのパラメーター マーカーが含まれている場合、SQLExecute は、SQLBindParameter の呼び出しで *ParameterValuePtr 引数が指す配列内のパラメーター値のセットごとに、SQL ステートメントを 1 回実行します。 詳細については、「 パラメーター値の配列」を参照してください。
ブックマークが有効になっていて、ブックマークをサポートできないクエリが実行された場合、ドライバーは属性値を変更し、SQLSTATE 01S02 (オプション値が変更されました) を返すことによって、ブックマークをサポートする環境に環境を強制する必要があります。 属性を変更できない場合、ドライバーは SQLSTATE HY024 (無効な属性値) を返す必要があります。
注意
接続プールを使用する場合、アプリケーションは、データベースまたはデータベースのコンテキストを変更するSQLステートメント (SQL Serverの USEdatabase ステートメントなど) を実行しないでください。このステートメントは、データ ソースで使用されるカタログを変更します。
コード例
SQLBindParameter、SQLBulkOperations、SQLPutData、および SQLSetPos に関するページを参照してください。
関連する関数
対象 | 解決方法については、 |
---|---|
結果セット内の列へのバッファーのバインド | SQLBindCol 関数 |
ステートメント処理の取り消し | SQLCancel 関数 |
カーソルを閉じる | SQLCloseCursor 関数 |
コミットまたはロールバック操作の実行 | SQLEndTran 関数 |
SQL ステートメントの実行 | SQLExecDirect 関数 |
複数行のデータをフェッチする | SQLFetch 関数 |
データブロックをフェッチする、または結果セットをスクロールする | SQLFetchScroll 関数 |
ステートメント ハンドルの解放 | SQLFreeStmt 関数 |
カーソル名を返す | SQLGetCursorName 関数 |
データの列の一部またはすべてをフェッチする | SQLGetData 関数 |
データを送信する次のパラメーターを返す | SQLParamData 関数 |
実行のためのステートメントの準備 | SQLPrepare 関数 |
実行時のパラメーター データの送信 | SQLPutData 関数 |
カーソル名の設定 | SQLSetCursorName 関数 |
ステートメント属性の設定 | SQLSetStmtAttr 関数 |