SQLFetch 関数
準拠
導入されたバージョン: ODBC 1.0 標準コンプライアンス: ISO 92
まとめ
SQLFetch は、結果セットからデータの次の行セットをフェッチし、バインドされているすべての列のデータを返します。
構文
SQLRETURN SQLFetch(
SQLHSTMT StatementHandle);
引数
StatementHandle
[入力]ステートメント ハンドル。
返品
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_STILL_EXECUTING、SQL_ERROR、またはSQL_INVALID_HANDLE。
診断
SQLFetchがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、関連付けられている SQLSTATE 値は、HandleType SQL_HANDLE_STMT と Handle StatementHandle を使用してSQLGetDiagRec 関数を呼び出すことによって取得できます。 次の表は、通常、 SQLFetch によって返される SQLSTATE 値を示し、この関数のコンテキストでそれぞれについて説明します。表記 "(DM)" は、ドライバー マネージャーによって返される SQLSTATE の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。 1 つの列でエラーが発生した場合は、 SQLGetDiagField を DiagIdentifier SQL_DIAG_COLUMN_NUMBER で呼び出して、エラーが発生した列を特定できます。また SQLGetDiagField はSQL_DIAG_ROW_NUMBERの DiagIdentifier で呼び出して、その列を含む行を特定できます。
SQL_SUCCESS_WITH_INFOまたはSQL_ERRORを返すことができるすべての SQLSTATEs (01xxx SQLSTATEs を除く) に対して、複数行操作の 1 つ以上の行でエラーが発生した場合はSQL_SUCCESS_WITH_INFOが返され、1 行の操作でエラーが発生した場合はSQL_ERRORが返されます。
SQLSTATE | エラー | 説明 |
---|---|---|
01000 | 一般的な警告 | ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
01004 | 文字列データ、右切り捨て | 列に対して返された文字列またはバイナリ データは、非空白文字または NULL 以外のバイナリ データが切り捨てられました。 文字列値の場合は、右に切り捨てられました。 |
01S01 | 行のエラー | 1 つ以上の行のフェッチ中にエラーが発生しました。 (ODBC 3*.x* アプリケーションが ODBC 2*.x* ドライバーを操作しているときにこの SQLSTATE が返される場合は、無視できます)。 |
01S07 | 小数部の切り捨て | 列に対して返されたデータが切り捨てられました。 数値データ型の場合、数値の小数部が切り捨てられました。 時刻、タイムスタンプ、および時刻コンポーネントを含む間隔データ型の場合、時刻の小数部が切り捨てられました。 (関数はSQL_SUCCESS_WITH_INFOを返します。 |
07006 | 制限付きデータ型属性違反 | 結果セット内の列のデータ値を、SQLBindCol の TargetType で指定されたデータ型に変換できませんでした。 列 0 はSQL_C_BOOKMARKのデータ型でバインドされ、SQL_ATTR_USE_BOOKMARKS ステートメント属性は SQL_UB_VARIABLE に設定されました。 列 0 はSQL_C_VARBOOKMARKのデータ型でバインドされ、SQL_ATTR_USE_BOOKMARKS ステートメント属性は SQL_UB_VARIABLE に設定されませんでした。 |
07009 | 記述子インデックスが無効です | ドライバーは、 SQLExtendedFetch をサポートしていない ODBC 2*.x* ドライバーであり、列のバインドで指定された列番号は 0 でした。 列 0 がバインドされ、SQL_ATTR_USE_BOOKMARKS ステートメント属性が SQL_UB_OFF に設定されました。 |
08S01 | 通信リンクエラー | ドライバーとドライバーが接続されたデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。 |
22001 | 文字列データ、右切り捨て | 列に対して返された可変長ブックマークが切り捨てられました。 |
22002 | インジケーター変数は必須ですが、指定されていません | NULL データは、SQLBindCol (または SQLSetDescField または SQLSetDescRec によって設定されたSQL_DESC_INDICATOR_PTR) によって設定されたStrLen_or_IndPtrが null ポインターである列にフェッチされました。 |
22003 | 範囲外の数値 | 1 つ以上のバインドされた列の数値または文字列として数値を返すと、数値の一部全体 (小数部ではなく) が切り捨てられる可能性があります。 詳細については、「付録 D: データ型」の「 SQL から C へのデータ型の変換 」を参照してください。 |
22007 | datetime 形式が無効です | 結果セット内の文字列が日付、時刻、またはタイムスタンプ C 構造体にバインドされ、列の値がそれぞれ無効な日付、時刻、またはタイムスタンプでした。 |
22012 | 0 で除算しました | 算術式から値が返され、結果として 0 で除算されました。 |
22015 | 間隔フィールドのオーバーフロー | 正確な数値または間隔の SQL 型から間隔 C 型に割り当てると、先頭フィールドの有効桁数が失われます。 間隔 C 型にデータをフェッチするときに、間隔 C 型の SQL 型の値の表現がありませんでした。 |
22018 | キャスト指定の文字値が無効です | 結果セット内の文字列が文字 C バッファーにバインドされ、その列にバッファーの文字セットに表現がない文字が含まれていました。 C 型は、正確または概数、datetime、または間隔データ型でした。列の SQL 型は文字データ型でした。列の値が、バインドされた C 型の有効なリテラルではありません。 |
24000 | カーソル状態が無効 | StatementHandle は実行された状態でしたが、結果セットは StatementHandle に関連付けされませんでした。 |
40001 | シリアル化エラー | デッドロックを防ぐために、フェッチが実行されたトランザクションが終了しました。 |
40003 | ステートメントの入力候補が不明です | この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。 |
HY000 | 一般的なエラー | 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージには、エラーとその原因が記述されています。 |
HY001 | メモリ割り当てエラー | ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てませんでした。 |
HY008 | 操作が取り消されました | StatementHandle に対して非同期処理が有効になりました。 SQLFetch 関数が呼び出され、実行が完了する前に、SQLCancel または SQLCancelHandle が StatementHandle で呼び出されました。 その後、 SQLFetch 関数が StatementHandle で再度呼び出されました。 または、 SQLFetch 関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandle がマルチスレッド アプリケーション内の別のスレッドから StatementHandle で呼び出されました。 |
HY010 | 関数シーケンス エラー | (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は、 SQLFetch 関数が呼び出されたときにまだ実行されていました。 (DM) SQLExecute、 SQLExecDirect、または SQLMoreResults StatementHandle が呼び出され、SQL_PARAM_DATA_AVAILABLEが返されました。 この関数は、すべてのストリーミング パラメーターのデータが取得される前に呼び出されました。 (DM) 指定した StatementHandle が実行された状態にありません。 この関数は、最初に SQLExecDirect、 SQLExecute またはカタログ関数を呼び出さずに呼び出されました。 (DM) 非同期実行関数 (この関数ではない) が StatementHandle に対して呼び出されこの関数が呼び出されたときにはまだ実行されていました。 (DM) SQLExecute、 SQLExecDirect、 SQLBulkOperations、または SQLSetPos が StatementHandle に対して呼び出され、SQL_NEED_DATAが返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。 (DM) SQLFetch は、SQLExtendedFetch が呼び出された後、StatementHandle に対して呼び出されSQLFreeStmt SQL_CLOSE オプションが呼び出される前に呼び出されました。 |
HY013 | メモリ管理エラー | メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。 |
HY090 | 文字列またはバッファーの長さが無効です | SQL_ATTR_USE_BOOKMARK ステートメント属性は SQL_UB_VARIABLE に設定され、列 0 は、この結果セットのブックマークの最大長と等しくない長さのバッファーにバインドされました。 (この長さは IRD の SQL_DESC_OCTET_LENGTH フィールドで使用でき、 を呼び出すことによって取得できます。SQLDescribeCol、 SQLColAttribute、または SQLGetDescField)。 |
HY107 | 範囲外の行の値 | SQL_ATTR_CURSOR_TYPE ステートメント属性で指定された値はSQL_CURSOR_KEYSET_DRIVENされましたが、SQL_ATTR_KEYSET_SIZE ステートメント属性で指定された値が 0 より大きく、SQL_ATTR_ROW_ARRAY_SIZE ステートメント属性で指定された値より小さくなっています。 |
HY117 | 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 | (DM) 中断状態の詳細については、「 SQLEndTran 関数を参照してください。 |
HYC00 | 省略可能な機能が実装されていません | ドライバーまたはデータ ソースは、SQLBindCol の TargetType と対応する列の SQL データ型の組み合わせで指定された変換をサポートしていません。 |
HYT00 | タイムアウトの期限が切れました | データ ソースが要求された結果セットを返す前に、クエリのタイムアウト期間の有効期限が切れています。 タイムアウト期間は、SQL_ATTR_QUERY_TIMEOUT SQLSetStmtAttr を使用して設定されます。 |
HYT01 | 接続のタイムアウト | データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。 |
IM001 | ドライバーは、この関数をサポートしていません | (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。 |
IM017 | 非同期通知モードでポーリングが無効になっている | 通知モデルが使用されるたびに、ポーリングは無効になります。 |
IM018 | SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 | ハンドルに対する前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、後処理を実行して操作を完了するために、 SQLCompleteAsync をハンドルで呼び出す必要があります。 |
Comments
SQLFetch は、結果セット内の次の行セットを返します。 結果セットが存在する場合にのみ呼び出すことができます。つまり、結果セットを作成する呼び出しの後、その結果セットの上のカーソルが閉じられる前です。 バインドされている列がある場合は、それらの列のデータが返されます。 アプリケーションで、フェッチされた行数を返す行状態配列またはバッファーへのポインターが指定されている場合は、 SQLFetch もこの情報を返します。 SQLFetch への呼び出しは、SQLFetchScroll の呼び出しと混在させることができますがsqlExtendedFetchの呼び出しと混在させることはできません。 詳細については、「 データ行のフェッチ」を参照してください。
ODBC 3*.x* アプリケーションが ODBC 2*.x* ドライバーで動作する場合、ドライバー マネージャーは、SQLFetch 呼び出しを、SQLExtendedFetch をサポートする ODBC 2*.x* ドライバーのSQLExtendedFetch にマップします。 ODBC 2*.x* ドライバーが SQLExtendedFetch をサポートしていない場合、ドライバー マネージャーは、
詳細については、「付録 G: 下位互換性に関するドライバー ガイドライン」の「ブロック カーソル、スクロール可能なカーソル、および下位互換性」を参照してください。
カーソルの配置
結果セットが作成されると、カーソルは結果セットの開始前に配置されます。 SQLFetch は次の行セットをフェッチします。 これは、FetchOrientationをSQL_FETCH_NEXTに設定してSQLFetchScrollを呼び出すことと同じです。 カーソルの詳細については、「 Cursors および Block Cursors」を参照してください。
SQL_ATTR_ROW_ARRAY_SIZE ステートメント属性は、行セット内の行数を指定します。 SQLFetch によってフェッチされる行セットが結果セットの末尾と重なる場合、SQLFetch は部分的な行セットを返します。 つまり、S + R - 1 が L より大きい場合(S はフェッチされる行セットの開始行、R は行セット サイズ、L は結果セットの最後の行)、最初の L - S + 1 行のみが有効です。 残りの行は空で、状態はSQL_ROW_NOROW。
SQLFetch が返されると、現在の行は行セットの最初の行になります。
次の表に示す規則では、このセクションの 2 番目の表に示す条件に基づいて、 SQLFetch の呼び出し後のカーソルの配置について説明します。
条件 | 新しい行セットの最初の行 |
---|---|
開始前 | 1 |
CurrRowsetStart<= LastResultRow - RowsetSize[1] | CurrRowsetStart + RowsetSize[2] |
CurrRowsetStart>LastResultRow - RowsetSize[1] | 終了後 |
終了後 | 終了後 |
[1] フェッチ間で行セットのサイズが変更された場合、これは前のフェッチで使用された行セット サイズです。
[2] フェッチ間で行セットのサイズが変更された場合、これは新しいフェッチで使用された行セット サイズです。
表記 | 説明 |
---|---|
開始前 | ブロック カーソルは、結果セットの先頭の前に配置されます。 新しい行セットの最初の行が結果セットの先頭の前にある場合、 SQLFetch はSQL_NO_DATAを返します。 |
終了後 | ブロック カーソルは、結果セットの末尾の後に配置されます。 新しい行セットの最初の行が結果セットの末尾の後にある場合、 SQLFetch はSQL_NO_DATAを返します。 |
CurrRowsetStart | 現在の行セットの最初の行の番号。 |
LastResultRow | 結果セット内の最後の行の番号。 |
RowsetSize | 行セットのサイズ。 |
たとえば、結果セットの行数が 100 で、行セットのサイズが 5 であるとします。 次の表は、開始位置が異なる SQLFetch によって返される行セットとリターン コードを示しています。
現在の行セット | リターン コード | 新しい行セット | フェッチされた行の数 |
---|---|---|---|
開始前 | SQL_SUCCESS | 1 から 5 | 5 |
1 から 5 | SQL_SUCCESS | 6 ~ 10 | 5 |
52 から 56 | SQL_SUCCESS | 57 から 61 | 5 |
91 から 95 | SQL_SUCCESS | 96 ~ 100 | 5 |
93 から 97 | SQL_SUCCESS | 98 から 100。 行ステータス配列の行 4 と行 5 は、SQL_ROW_NOROWに設定されます。 | 3 |
96 ~ 100 | SQL_NO_DATA | なし。 | 0 |
99 から 100 | SQL_NO_DATA | なし。 | 0 |
終了後 | SQL_NO_DATA | なし。 | 0 |
バインドされた列のデータを返す
SQLFetchは各行を返し、バインドされた各列のデータをその列にバインドされたバッファーに格納します。 列がバインドされていない場合、 SQLFetch はデータを返しませんが、ブロック カーソルを前方に移動します。 SQLGetData を使用してデータを取得できます。 カーソルが複数行カーソルの場合 (つまり、SQL_ATTR_ROW_ARRAY_SIZEが 1 より大きい)、 SQLGetData は、 SQLGetInfo が SQL_GETDATA_EXTENSIONS の InfoType で呼び出されたときにSQL_GD_BLOCKが返された場合にのみ呼び出すことができます。 (詳細については、 を参照してください。SQLGetData.)
行内のバインドされた列ごとに、 SQLFetch は次の処理を行います。
長さ/インジケーター バッファーをSQL_NULL_DATAに設定し、データが NULL の場合は次の列に進みます。 データが NULL で、長さ/インジケーター バッファーがバインドされていない場合、 SQLFetch は行の SQLSTATE 22002 (インジケーター変数は必須ですが、指定されていません) を返し、次の行に進みます。 長さ/インジケーター バッファーのアドレスを確認する方法については、「 SQLBindCol のバッファー アドレス」を参照。
列のデータが NULL でない場合は、 SQLFetch 手順 2 に進みます。
SQL_ATTR_MAX_LENGTH ステートメント属性が 0 以外の値に設定されていて、列に文字またはバイナリ データが含まれている場合、データはSQL_ATTR_MAX_LENGTH バイトに切り捨てられます。
Note
SQL_ATTR_MAX_LENGTH ステートメント属性は、ネットワーク トラフィックを減らすことを目的としています。 通常、データ ソースによって実装され、ネットワーク経由でデータを返す前にデータが切り捨てられます。 ドライバーとデータ ソースをサポートする必要はありません。 そのため、データが特定のサイズに切り捨てられることを保証するために、アプリケーションはそのサイズのバッファーを割り当て、 cbValueMax 引数にサイズ SQLBindColで指定する必要があります。
データを、SQLBindCol の TargetType で指定された型に変換します。
データが文字やバイナリなどの可変長データ型に変換された場合、 SQLFetch データの長さがデータ バッファーの長さを超えているかどうかを確認します。 文字データの長さ (null 終端文字を含む) がデータ バッファーの長さを超える場合、 SQLFetch はデータ バッファーの長さにデータを切り捨て、null 終端文字の長さを減らします。 その後、データは null で終了します。 バイナリ データの長さがデータ バッファーの長さを超える場合、 SQLFetch はデータ バッファーの長さに切り捨てます。 データ バッファーの長さは、SQLBindCol で BufferLength で指定されます。
SQLFetch 固定長データ型に変換されたデータを切り捨てることはありません。データ バッファーの長さがデータ型のサイズであると常に想定されます。
変換された (場合によっては切り捨てられた) データをデータ バッファーに格納します。 データ バッファーのアドレスを確認する方法については、「 SQLBindCol のバッファー アドレス」を参照。
データの長さを長さ/インジケーター バッファーに格納します。 インジケーター ポインターと長さポインターの両方が同じバッファーに設定されている場合 ( SQLBindCol の呼び出しと同様 )、長さは有効なデータのバッファーに書き込まれ、SQL_NULL_DATAは NULL データのバッファーに書き込まれます。 長さ/インジケーター バッファーがバインドされていない場合、 SQLFetch は長さを返しません。
文字データまたはバイナリ データの場合、データ バッファーが小さすぎるため、変換後と切り捨て前のデータの長さです。 ドライバーが変換後にデータの長さを判断できない場合は、長いデータの場合と同様に、長さをSQL_NO_TOTALに設定します。 SQL_ATTR_MAX_LENGTH ステートメント属性が原因でデータが切り捨てられた場合、この属性の値は、実際の長さではなく長さ/インジケーター バッファーに格納されます。 これは、この属性は、変換前にサーバー上のデータを切り捨てるように設計されているためです。これにより、ドライバーは実際の長さを把握できなくなります。
他のすべてのデータ型の場合、これは変換後のデータの長さです。つまり、データが変換された型のサイズです。
長さ/インジケーター バッファーのアドレスを確認する方法については、「 SQLBindCol のバッファー アドレス」を参照。
変換中に有効桁数を失わずにデータが切り捨てられた場合 (たとえば、実数 1.234 は変換時に整数 1 に切り捨てられます)、 SQLFetch は SQLSTATE 01S07 (小数部の切り捨て) とSQL_SUCCESS_WITH_INFOを返します。 データ バッファーの長さが小さすぎるためにデータが切り捨てられた場合 (たとえば、文字列 "abcdef" が 4 バイト のバッファーに格納されている場合)、 SQLFetch は SQLSTATE 01004 (データ切り捨て) を返し、SQL_SUCCESS_WITH_INFO。 SQL_ATTR_MAX_LENGTH ステートメント属性のためにデータが切り捨てられた場合、 SQLFetch はSQL_SUCCESSを返し、SQLSTATE 01S07 (小数部の切り捨て) または SQLSTATE 01004 (データの切り捨て) を返しません。 変換中に有効桁数が失われた場合 (たとえば、100,000 を超えるSQL_INTEGER値がSQL_C_TINYINTに変換された場合)、 SQLFetch は SQLSTATE 22003 (範囲外の数値) とSQL_ERROR (行セット サイズが 1 の場合) またはSQL_SUCCESS_WITH_INFO (行セット サイズが 1 より大きい場合) を返します。
バインドされたデータ バッファーと長さ/インジケーター バッファーの内容は、 SQLFetch または SQLFetchScroll がSQL_SUCCESSまたはSQL_SUCCESS_WITH_INFOを返さない場合は未定義です。
行の状態の配列
行ステータス配列は、行セット内の各行の状態を返すために使用されます。 この配列のアドレスは、SQL_ATTR_ROW_STATUS_PTR ステートメント属性で指定します。 配列はアプリケーションによって割り当てられ、SQL_ATTR_ROW_ARRAY_SIZE ステートメント属性で指定された数の要素を持つ必要があります。 その値は、 SQLFetch、 SQLFetchScroll、および SQLBulkOperations または SQLSetPos によって設定されます (カーソルが SQLExtendedFetch によって配置された後に呼び出された場合を除きます)。 SQL_ATTR_ROW_STATUS_PTR ステートメント属性の値が null ポインターの場合、これらの関数は行の状態を返しません。
行の状態配列には、次の値が返されます。
行の状態の配列値 | 説明 |
---|---|
SQL_ROW_SUCCESS | 行は正常にフェッチされ、この結果セットから最後にフェッチされてから変更されていません。 |
SQL_ROW_SUCCESS_WITH_INFO | 行は正常にフェッチされ、この結果セットから最後にフェッチされてから変更されていません。 ただし、行に関する警告が返されました。 |
SQL_ROW_ERROR | 行をフェッチ中にエラーが発生しました。 |
SQL_ROW_UPDATED[1]、[2]、および [3] | 行は正常にフェッチされ、この結果セットから最後にフェッチされてから変更されました。 行がこの結果セットから再度フェッチされるか、 SQLSetPos によって更新された場合、状態は行の新しい状態に変更されます。 |
SQL_ROW_DELETED[3] | 行は、この結果セットから最後にフェッチされてから削除されています。 |
SQL_ROW_ADDED[4] | 行は SQLBulkOperations によって挿入されました。 行がこの結果セットから再度フェッチされるか、 SQLSetPos によって更新された場合、その状態はSQL_ROW_SUCCESS。 |
SQL_ROW_NOROW | 行セットは結果セットの末尾に重なり、行の状態配列のこの要素に対応する行は返されませんでした。 |
[1] キーセット、混合、動的カーソルの場合、キー値が更新されると、データの行が削除され、新しい行が追加されたと見なされます。
[2] 一部のドライバーはデータの更新を検出できないため、この値を返すことができません。 ドライバーが再フェッチされた行の更新を検出できるかどうかを判断するには、アプリケーションで、SQL_ROW_UPDATES オプションを使用して SQLGetInfo を呼び出します。
[3] SQLFetch は、 SQLFetchScrollの呼び出しと混在している場合にのみ、この値を返すことができます。 これは、 SQLFetch が結果セットを前方に移動し、排他的に使用されるときに行を再フェッチしないためです。 行が再フェッチされないため、 SQLFetch は、以前にフェッチされた行に加えられた変更を検出しません。 ただし、 SQLFetchScroll が以前にフェッチした行の前にカーソルを置き、 SQLFetch を使用してそれらの行をフェッチする場合、 SQLFetch はこれらの行への変更を検出できます。
[4] SQLBulkOperations によってのみ返されます。 SQLFetch または SQLFetchScroll によって設定されません。
フェッチされたバッファーの行
フェッチされた行バッファーは、フェッチ中にエラーが発生したためにデータが返されなかった行を含め、フェッチされた行の数を返すために使用されます。 つまり、行ステータス配列の値がSQL_ROW_NOROWされていない行の数です。 このバッファーのアドレスは、SQL_ATTR_ROWS_FETCHED_PTR ステートメント属性で指定します。 バッファーはアプリケーションによって割り当てられます。 これは、 SQLFetch および SQLFetchScroll によって設定されます。 SQL_ATTR_ROWS_FETCHED_PTR ステートメント属性の値が null ポインターの場合、これらの関数はフェッチされた行数を返しません。 結果セット内の現在の行の数を確認するために、アプリケーションはSQL_ATTR_ROW_NUMBER属性 SQLGetStmtAttr を呼び出すことができます。
SQLFetchまたはSQLFetchScrollがSQL_SUCCESSまたはSQL_SUCCESS_WITH_INFOを返さない場合、SQL_NO_DATAが返される場合を除き、フェッチされた行バッファーの内容は未定義になります。この場合、フェッチされた行バッファーの値は 0 に設定されます。
エラー処理
エラーと警告は、個々の行または関数全体に適用できます。 診断レコードの詳細については、「 Diagnostics および SQLGetDiagFieldを参照してください。
関数全体のエラーと警告
SQLSTATE HYT00 (タイムアウト期限切れ) や SQLSTATE 24000 (無効なカーソル状態) などのエラーが関数全体に適用される場合、 SQLFetch はSQL_ERRORと該当する SQLSTATE を返します。 行セット バッファーの内容は未定義であり、カーソル位置は変更されません。
警告が関数全体に適用される場合、 SQLFetch はSQL_SUCCESS_WITH_INFOと該当する SQLSTATE を返します。 関数全体に適用される警告の状態レコードは、個々の行に適用される状態レコードの前に返されます。
個々の行のエラーと警告
エラー (SQLSTATE 22012 (0 除算) など) または警告 (SQLSTATE 01004 (データの切り捨て) など) が 1 つの行に適用される場合、 SQLFetchは次の処理を行います。
行ステータス配列の対応する要素を、エラーの場合はSQL_ROW_ERROR、警告の場合はSQL_ROW_SUCCESS_WITH_INFOに設定します。
エラーまたは警告の SQLSTATEs を含む 0 個以上の状態レコードを追加します。
状態レコードの行番号フィールドと列番号フィールドを設定します。 SQLFetchが行番号または列番号を決定できない場合は、その番号をそれぞれSQL_ROW_NUMBER_UNKNOWNまたはSQL_COLUMN_NUMBER_UNKNOWNに設定します。 状態レコードが特定の列に適用されない場合、 SQLFetch は列番号をSQL_NO_COLUMN_NUMBERに設定します。
SQLFetch は、行セット内のすべての行をフェッチするまで行のフェッチを続行します。 行セットのすべての行でエラーが発生しない限り (状態SQL_ROW_NOROWの行は含まれません)、SQL_SUCCESS_WITH_INFOが返されます。その場合は、SQL_ERRORが返されます。 特に、行セットのサイズが 1 で、その行でエラーが発生した場合、 SQLFetch はSQL_ERRORを返します。
SQLFetch は、状態レコードを行番号順に返します。 つまり、不明な行 (存在する場合) のすべての状態レコードが返されます。次に、最初の行 (ある場合) のすべての状態レコードを返し、2 行目のすべての状態レコード (存在する場合) を返します。 各行のステータス レコードは、ステータス レコードの順序付けの通常のルールに従って並べ替えられます。詳細については、 SQLGetDiagField の「状態レコードのシーケンス」を参照。
記述子と SQLFetch
次のセクションでは、 SQLFetch が記述子と対話する方法について説明します。
引数マッピング
ドライバーは、 SQLFetch の引数に基づいて記述子フィールドを設定しません。
その他の記述子フィールド
次の記述子フィールドは、 SQLFetch によって使用されます。
記述子フィールド | Desc。 | フィールド | 次の手順で設定します。 |
---|---|---|---|
SQL_DESC_ARRAY_SIZE | ARD | ヘッダー | ステートメント属性SQL_ATTR_ROW_ARRAY_SIZE |
SQL_DESC_ARRAY_STATUS_PTR | IRD | ヘッダー | ステートメント属性SQL_ATTR_ROW_STATUS_PTR |
SQL_DESC_BIND_OFFSET_PTR | ARD | ヘッダー | ステートメント属性SQL_ATTR_ROW_BIND_OFFSET_PTR |
SQL_DESC_BIND_TYPE | ARD | ヘッダー | ステートメント属性SQL_ATTR_ROW_BIND_TYPE |
SQL_DESC_COUNT | ARD | ヘッダー | SQLBindCol の ColumnNumber 引数 |
SQL_DESC_DATA_PTR | ARD | records | SQLBindCol の TargetValuePtr 引数 |
SQL_DESC_INDICATOR_PTR | ARD | records | SQLBindCol の引数をStrLen_or_IndPtrする |
SQL_DESC_OCTET_LENGTH | ARD | records | SQLBindCol の BufferLength 引数 |
SQL_DESC_OCTET_LENGTH_PTR | ARD | records | SQLBindCol の引数をStrLen_or_IndPtrする |
SQL_DESC_ROWS_PROCESSED_PTR | IRD | ヘッダー | ステートメント属性SQL_ATTR_ROWS_FETCHED_PTR |
SQL_DESC_TYPE | ARD | records | SQLBindCol の TargetType 引数 |
すべての記述子フィールドは、 SQLSetDescField を使用して設定することもできます。
個別の長さとインジケーター バッファー
アプリケーションは、長さとインジケーター値を保持するために使用できる 1 つのバッファーまたは 2 つの個別のバッファーをバインドできます。 アプリケーションが SQLBindCol を呼び出すと、ドライバーは ARD の SQL_DESC_OCTET_LENGTH_PTR フィールドと SQL_DESC_INDICATOR_PTR フィールドを同じアドレスに設定します。このフィールドは、 StrLen_or_IndPtr 引数で渡されます。 アプリケーションが SQLSetDescField または SQLSetDescRec を呼び出すと、これら 2 つのフィールドを異なるアドレスに設定できます。
SQLFetch は、アプリケーションが個別の長さとインジケーター バッファーを指定したかどうかを判断します。 この場合、データが NULL でない場合、 SQLFetch はインジケーター バッファーを 0 に設定し、長さバッファーの長さを返します。 データが NULL の場合、 SQLFetch はインジケーター バッファーをSQL_NULL_DATAに設定し、長さバッファーを変更しません。
コード例
関連する関数
情報 | 参照トピック |
---|---|
結果セット内の列へのバッファーのバインド | SQLBindCol 関数 |
ステートメント処理の取り消し | SQLCancel 関数 |
結果セット内の列に関する情報を返す | SQLDescribeCol 関数 |
SQL ステートメントの実行 | SQLExecDirect 関数 |
準備された SQL ステートメントの実行 | SQLExecute 関数 |
データブロックのフェッチまたは結果セットのスクロール | SQLFetchScroll 関数 |
ステートメントのカーソルを閉じる | SQLFreeStmt 関数 |
データの列の一部またはすべてをフェッチする | SQLGetData 関数 |
結果セット列の数を返す | SQLNumResultCols 関数 |
実行のためのステートメントの準備 | SQLPrepare 関数 |