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 値を取得するには、SQL_HANDLE_STMTの HandleType と StatementHandle のハンドルを使用して SQLGetDiagRec 関数を呼び出します。 次の表は、SQLFetch によって通常返される SQLSTATE 値の一覧を示し、この関数のコンテキストでそれぞれについて説明します。"(DM)" という表記は、ドライバー マネージャーによって返される SQLSTATE の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。 1 つの列でエラーが発生した場合、SQLGetDiagField を SQL_DIAG_COLUMN_NUMBER の DiagIdentifier で呼び出して、エラーが発生した列を特定できます。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 | インジケーター変数は必須ですが、指定されていません | SQLBindCol によって設定されたStrLen_or_IndPtr (または SQLSetDescField または SQLSetDescRec によって設定されたSQL_DESC_INDICATOR_PTR) が null ポインターである列に 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 関数が呼び出され、実行が完了する前に、StatementHandle で SQLCancel または SQLCancelHandle が呼び出されました。 その後、SQLFetch 関数が StatementHandle で再度呼び出されました。 または、SQLFetch 関数が呼び出され、実行が完了する前に、マルチスレッド アプリケーションの別のスレッドから StatementHandle で SQLCancel または SQLCancelHandle が呼び出されました。 |
HY010 | 関数シーケンス エラー | (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は、SQLFetch 関数が呼び出されたときにまだ実行されていました。 (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) SQLExtendedFetch が呼び出された後、および sqlFreeStmt と SQL_CLOSE オプションが呼び出される前に、StatementHandle に対して SQLFetch が呼び出されました。 |
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* ドライバーで動作する場合、ドライバー マネージャーは SQLExtendedFetch をサポートする ODBC 2*.x* ドライバーの SQLExtendedFetch に SQLFetch 呼び出しをマップします。 ODBC 2*.x* ドライバーが SQLExtendedFetch をサポートしていない場合、ドライバー マネージャーは、SQLFetch 呼び出しを ODBC 2*.x* ドライバーの SQLFetch にマップします。これは、1 つの行のみをフェッチできます。
詳細については、「付録 G: 下位互換性に関するドライバー ガイドライン」の「ブロック カーソル、スクロール可能なカーソル、および下位互換性」を参照してください。
カーソルの配置
結果セットが作成されると、カーソルは結果セットの開始前に配置されます。 SQLFetch は、次の行セットをフェッチします。 これは、FetchOrientation を SQL_FETCH_NEXT に設定して SQLFetchScroll を呼び出すことと同じです。 カーソルの詳細については、「カーソルとブロック カーソル」を参照してください。
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 は、SQL_GETDATA_EXTENSIONSの InfoType で SQLGetInfo が呼び出されたときに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 ステートメント属性は、ネットワーク トラフィックを減らすことを目的としています。 通常、データ ソースによって実装され、ネットワーク経由でデータを返す前にデータが切り捨てられます。 ドライバーとデータ ソースをサポートする必要はありません。 そのため、データが特定のサイズに切り捨てられることを保証するために、アプリケーションはそのサイズのバッファーを割り当て、SQLBindCol の cbValueMax 引数にサイズを指定する必要があります。
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 ポインターの場合、これらの関数は行の状態を返しません。
SQLFetch または SQLFetchScroll がSQL_SUCCESSまたはSQL_SUCCESS_WITH_INFOを返さない場合、行状態配列バッファーの内容は未定義です。
行の状態配列には、次の値が返されます。
行の状態の配列値 | 説明 |
---|---|
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 に設定されます。
エラー処理
エラーと警告は、個々の行または関数全体に適用できます。 診断レコードの詳細については、「診断と 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、SQLColumns、SQLGetData、SQLProcedures」を参照してください。
関連する関数
情報 | 参照トピック |
---|---|
結果セット内の列へのバッファーのバインド | SQLBindCol 関数 |
ステートメント処理の取り消し | SQLCancel 関数 |
結果セット内の列に関する情報を返す | SQLDescribeCol 関数 |
SQL ステートメントの実行 | SQLExecDirect 関数 |
準備された SQL ステートメントの実行 | SQLExecute 関数 |
データブロックのフェッチまたは結果セットのスクロール | SQLFetchScroll 関数 |
ステートメントのカーソルを閉じる | SQLFreeStmt 関数 |
データの列の一部またはすべてをフェッチする | SQLGetData 関数 |
結果セット列の数を返す | SQLNumResultCols 関数 |
実行のためのステートメントの準備 | SQLPrepare 関数 |