SQLExtendedFetch 関数
準拠
導入されたバージョン: ODBC 1.0 Standards Compliance: Deprecated
まとめ
SQLExtendedFetch は、指定されたデータ行セットを結果セットからフェッチし、バインドされているすべての列のデータを返します。 行セットは、絶対位置または相対位置、またはブックマークで指定できます。
Note
ODBC 3*.x* では、SQLExtendedFetch は SQLFetchScroll に置き換えられました。 ODBC 3*.x* アプリケーションでは SQLExtendedFetch を呼び出さないでください。代わりに SQLFetchScroll を呼び出す必要があります。 ドライバー マネージャーは、ODBC 2*.x* ドライバーを操作するときに SQLFetchScroll を SQLExtendedFetch にマップします。 ODBC 3*.x* ドライバーは、それを呼び出す ODBC 2*.x* アプリケーションで動作する場合、SQLExtendedFetch をサポートする必要があります。 詳細については、「付録 G: 下位互換性のためのドライバー ガイドライン」の「コメント」および「ブロック カーソル」、「スクロール可能なカーソル」、「下位互換性」を参照してください。
構文
SQLRETURN SQLExtendedFetch(
SQLHSTMT StatementHandle,
SQLUSMALLINT FetchOrientation,
SQLLEN FetchOffset,
SQLULEN * RowCountPtr,
SQLUSMALLINT * RowStatusArray);
引数
StatementHandle
[入力]ステートメント ハンドル。
FetchOrientation
[入力]フェッチの種類。 これは、SQLFetchScroll の FetchOrientation と同じです。
FetchOffset
[入力]フェッチする行の番号。 これは SQLFetchScroll の FetchOffset と同じですが、1 つの例外があります。 FetchOrientation がSQL_FETCH_BOOKMARKされている場合、FetchOffset は固定長ブックマークであり、ブックマークからのオフセットではありません。 つまり、 SQLExtendedFetch は、SQL_ATTR_FETCH_BOOKMARK_PTR ステートメント属性ではなく、この引数からブックマークを取得します。 可変長ブックマークはサポートされず、ブックマークからのオフセット (0 以外) での行セットのフェッチはサポートされません。
RowCountPtr
[出力]実際にフェッチされた行数を返すバッファーへのポインター。 このバッファーは、SQL_ATTR_ROWS_FETCHED_PTR ステートメント属性で指定されたバッファーと同じ方法で使用されます。 このバッファーは、SQLExtendedFetch でのみ使用されます。 SQLFetch または SQLFetchScroll では使用されません。
RowStatusArray
[出力]各行の状態を返す配列へのポインター。 この配列は、SQL_ATTR_ROW_STATUS_PTR ステートメント属性で指定された配列と同じ方法で使用されます。
ただし、この配列のアドレスは IRD の SQL_DESC_STATUS_ARRAY_PTR フィールドには格納されません。 さらに、この配列は、SQLExtendedFetch の後に呼び出されたときに、SQL_ADDまたは SQLSetPos の操作で SQLExtendedFetch および SQLBulkOperations によってのみ使用されます。 SQLFetch または SQLFetchScroll では使用されず、SQLFetch または SQLFetchScroll の後で呼び出される場合、SQLBulkOperations または SQLSetPos では使用されません。 また、フェッチ関数が呼び出される前に、SQL_ADDの操作を含む SQLBulkOperations が呼び出される場合にも使用されません。 つまり、ステートメント状態 S7 でのみ使用されます。 ステートメントの状態 S5 または S6 では使用されません。 詳細については、「付録 B: ODBC 状態遷移テーブルのステートメント遷移」を参照してください。
アプリケーションは、RowStatusArray 引数に有効なポインターを提供する必要があります。そうでない場合、SQLExtendedFetch の動作と、SQLExtendedFetch によってカーソルが配置された後の SQLBulkOperations または SQLSetPos への呼び出しの動作は未定義です。
返品
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR、またはSQL_INVALID_HANDLE。
診断
SQLExtendedFetch が SQL_ERROR または SQL_SUCCESS_WITH_INFO を返す場合は、SQLError を呼び出すことによって、関連付けられている SQLSTATE 値を取得できます。 次の表に、SQLExtendedFetch によって一般的に返される SQLSTATE 値を示し、この関数のコンテキストでそれぞれについて説明します。"(DM)" という表記は、ドライバー マネージャーによって返される SQLSTATE の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。 1 つの列でエラーが発生した場合は、エラーが発生した列を特定するために、SQL_DIAG_COLUMN_NUMBERの DiagIdentifier を使用して SQLGetDiagField を呼び出すことができます。SQLGetDiagField は、SQL_DIAG_ROW_NUMBERの DiagIdentifier で呼び出して、その列を含む行を特定できます。
SQLSTATE | エラー | 説明 |
---|---|---|
01000 | 一般的な警告 | ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01004 | 文字列データ、右切り捨て | 列に対して返された文字列またはバイナリ データは、非空白文字または NULL 以外のバイナリ データが切り捨てられました。 文字列値の場合は、右に切り捨てられました。 数値の場合、数値の小数部が切り捨てられました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01S01 | 行のエラー | 1 つ以上の行のフェッチ中にエラーが発生しました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01S06 | 結果セットが最初の行セットを返す前にフェッチを試みる | 要求された行セットは、現在の位置が最初の行を超えたときに結果セットの先頭と重複し 、FetchOrientation がSQL_PRIORされたか 、FetchOrientation が現在のSQL_ROWSET_SIZE以下の負 の FetchOffset でSQL_RELATIVEされました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01S07 | 小数部の切り捨て | 列に対して返されたデータが切り捨てられました。 数値データ型の場合、数値の小数部が切り捨てられました。 時刻、タイムスタンプ、および時刻コンポーネントを含む間隔データ型の場合、時刻の小数部が切り捨てられました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
07006 | 制限付きデータ型属性違反 | SQLBindCol の TargetType で指定された C データ型にデータ値を変換できませんでした。 |
07009 | 記述子インデックスが無効です | 列 0 は SQLBindCol でバインドされ、SQL_ATTR_USE_BOOKMARKS ステートメント属性は SQL_UB_OFF に設定されました。 |
08S01 | 通信リンクエラー | ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。 |
22002 | インジケーター変数は必須ですが、指定されていません | SQLBindCol によって設定されたStrLen_or_IndPtrが null ポインターである列に NULL データがフェッチされました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
22003 | 範囲外の数値 | 1 つ以上の列の数値 (数値または文字列) を返すと、数値の一部全体 (小数部ではなく) が切り捨てられる可能性があります。 (関数はSQL_SUCCESS_WITH_INFOを返します。 詳細については、「 付録 D: データ型」の「間隔データ型と数値データ型 のガイドライン」を参照してください。 |
22007 | datetime 形式が無効です | 結果セット内の文字列が日付、時刻、またはタイムスタンプ C 構造体にバインドされ、列の値がそれぞれ無効な日付、時刻、またはタイムスタンプでした。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
22012 | 0 で除算しました | 算術式から値が返され、結果として 0 で除算されました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
22015 | 間隔フィールドのオーバーフロー | 正確な数値または間隔の SQL 型から間隔 C 型に割り当てると、先頭フィールドの有効桁数が失われます。 間隔 C 型にデータをフェッチするときに、間隔 C 型の SQL 型の値の表現がありませんでした。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
22018 | キャスト指定の文字値が無効です | C 型は、正確または概数、datetime、または間隔データ型でした。列の SQL 型は文字データ型でした。列の値が、バインドされた C 型の有効なリテラルではありません。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
24000 | カーソル状態が無効 | StatementHandle は実行された状態でしたが、結果セットは StatementHandle に関連付けされませんでした。 |
HY000 | 一般的なエラー | 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLError によって返されるエラー メッセージには、エラーとその原因が記述されています。 |
HY001 | メモリ割り当てエラー | ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。 |
HY008 | 操作が取り消されました | StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、StatementHandle で SQLCancel または SQLCancelHandle が呼び出され、その後、その関数が StatementHandle で再度呼び出されました。 関数が呼び出され、実行が完了する前に、SQLCancel または SQLCancelHandle がマルチスレッド アプリケーション内の別のスレッドから StatementHandle で呼び出されました。 |
HY010 | 関数シーケンス エラー | (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は、SQLExtendedFetch 関数が呼び出されたときにまだ実行されていました。 (DM) StatementHandle に対して SQLExecute、SQLExecDirect、または SQLMoreResults が呼び出され、SQL_PARAM_DATA_AVAILABLE返されました。 この関数は、すべてのストリーミング パラメーターのデータが取得される前に呼び出されました。 (DM) 指定された StatementHandle が実行された状態にありません。 この関数は、SQLExecDirect、SQLExecute、またはカタログ関数を最初に呼び出さずに呼び出されました。 (DM) 非同期実行関数 (この関数ではない) が StatementHandle に対して呼び出され、この関数が呼び出されたときにはまだ実行されていました。 (DM) StatementHandle に対して SQLExecute、SQLExecDirect、SQLBulkOperations、または SQLSetPos が呼び出され、SQL_NEED_DATA返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。 (DM) SQLFetch または SQLFetchScroll が呼び出された後、および sqlFreeStmt が SQL_CLOSE オプションで呼び出される前に、StatementHandle に対して SQLExtendedFetch が呼び出されました。 (DM) SQLFetch、SQLFetchScroll、または SQLExtendedFetch が呼び出される前にステートメントに対して SQLBulkOperations が呼び出され、sqlFreeStmt が SQL_CLOSE オプションで呼び出される前に SQLExtendedFetch が呼び出されました。 |
HY013 | メモリ管理エラー | メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。 |
HY106 | フェッチの種類が範囲外 | (DM) 引数 FetchOrientation に指定された値が無効です。 (「コメント」を参照してください。) 引数 FetchOrientation がSQL_FETCH_BOOKMARKされ、SQL_ATTR_USE_BOOKMARKS ステートメント属性が SQL_UB_OFF に設定されました。 SQL_CURSOR_TYPE ステートメント オプションの値がSQL_CURSOR_FORWARD_ONLYされ、引数 FetchOrientation の値がSQL_FETCH_NEXTされませんでした。 引数 FetchOrientation がSQL_FETCH_RESUMEされました。 |
HY107 | 範囲外の行の値 | SQL_CURSOR_TYPEステートメント・オプションで指定された値はSQL_CURSOR_KEYSET_DRIVENされましたが、SQL_KEYSET_SIZE ステートメント属性で指定された値が 0 より大きく、SQL_ROWSET_SIZE ステートメント属性で指定された値より小さい値でした。 |
HY111 | ブックマーク値が無効です | 引数 FetchOrientation がSQL_FETCH_BOOKMARKされ、FetchOffset 引数で指定されたブックマークが無効でした。 |
HY117 | 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 | (DM) 中断状態の詳細については、「SQLEndTran 関数」を参照してください。 |
HYC00 | 省略可能な機能が実装されていません | ドライバーまたはデータ ソースは、指定されたフェッチの種類をサポートしていません。 ドライバーまたはデータ ソースは、SQLBindCol の TargetType と、対応する列の SQL データ型の組み合わせで指定された変換をサポートしていません。 このエラーは、列の SQL データ型がドライバー固有の SQL データ型にマップされている場合にのみ適用されます。 |
HYT00 | タイムアウトの期限が切れました | データ ソースが結果セットを返す前に、クエリのタイムアウト期間が期限切れになりました。 タイムアウト期間は、SQL_QUERY_TIMEOUT SQLSetStmtOption を使用して設定されます。 |
HYT01 | 接続のタイムアウト | データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr を使用して設定されます。 |
IM001 | ドライバーは、この関数をサポートしていません | (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。 |
Comments
SQLExtendedFetch の動作は SQLFetchScroll の動作と同じですが、次の例外があります。
SQLExtendedFetch と SQLFetchScroll は、フェッチされた行数を返すためにさまざまなメソッドを使用します。 SQLExtendedFetch は、*RowCountPtr でフェッチされた行の数を返します。SQLFetchScroll は、SQL_ATTR_ROWS_FETCHED_PTRが指すバッファーに直接フェッチされた行の数を返します。 詳細については、RowCountPtr 引数を参照してください。
SQLExtendedFetch と SQLFetchScroll は、異なる配列内の各行の状態を返します。 詳細については、RowStatusArray 引数を参照してください。
SQLExtendedFetch と SQLFetchScroll では、FetchOrientation がSQL_FETCH_BOOKMARKされたときに、さまざまなメソッドを使用してブックマークを取得します。 SQLExtendedFetch では、可変長ブックマークや、ブックマークから 0 以外のオフセットで行セットをフェッチすることはできません。 詳細については、FetchOffset 引数を参照してください。
SQLExtendedFetch と SQLFetchScroll では、さまざまな行セット サイズが使用されます。 SQLExtendedFetch は SQL_ROWSET_SIZE ステートメント属性の値を使用し 、SQLFetchScroll は SQL_ATTR_ROW_ARRAY_SIZE ステートメント属性の値を使用します。
SQLExtendedFetch には、SQLFetchScroll とは若干異なるエラー処理セマンティクスがあります。 詳細については、SQLFetchScroll の「コメント」セクションの「エラー処理」を参照してください。
SQLExtendedFetch では、バインド オフセット (SQL_ATTR_ROW_BIND_OFFSET_PTR ステートメント属性) はサポートされていません。
SQLExtendedFetch の呼び出しを SQLFetch または SQLFetchScroll の呼び出しと混在させることはできません。フェッチ関数が呼び出される前に SQLBulkOperations が呼び出されると、カーソルが閉じて再度開くまで SQLExtendedFetch を呼び出すことはできません。 つまり、 SQLExtendedFetch はステートメント状態 S7 でのみ呼び出すことができます。 詳細については、「付録 B: ODBC 状態遷移テーブルのステートメント遷移」を参照してください。
ODBC 2*.x* ドライバーの使用中にアプリケーションが SQLFetchScroll を呼び出すと、ドライバー マネージャーはこの呼び出しを SQLExtendedFetch にマップします。 詳細については、SQLFetchScroll の「SQLFetchScroll および ODBC 2*.x* Drivers」を参照してください。
ODBC 2*.x* では、 複数の行をフェッチするために SQLExtendedFetch が呼び出され、 1 つの行をフェッチするために SQLFetch が呼び出されました。 一方、ODBC 3*.x* では、 SQLFetch を呼び出して複数の行をフェッチできます。
関連する関数
情報 | 参照トピック |
---|---|
結果セット内の列へのバッファーのバインド | SQLBindCol 関数 |
一括挿入、更新、または削除操作の実行 | SQLBulkOperations 関数 |
ステートメント処理の取り消し | SQLCancel 関数 |
結果セット内の列に関する情報を返す | SQLDescribeCol 関数 |
SQL ステートメントの実行 | SQLExecDirect 関数 |
準備された SQL ステートメントの実行 | SQLExecute 関数 |
結果セット列の数を返す | SQLNumResultCols 関数 |
カーソルの配置、行セット内のデータの更新、または結果セット内のデータの更新または削除 | SQLSetPos 関数 |
ステートメント属性の設定 | SQLSetStmtAttr 関数 |