SQLForeignKeys 関数

準拠
導入されたバージョン: ODBC 1.0 Standards Compliance: ODBC

まとめ
SQLForeignKeys は次を 返すことができます。

  • 指定したテーブル内の外部キーの一覧 (他のテーブルの主キーを参照する指定したテーブル内の列)。

  • 指定したテーブルの主キーを参照する他のテーブルの外部キーの一覧。

ドライバーは、指定したステートメントの結果セットとして各リストを返します。

構文

  
SQLRETURN SQLForeignKeys(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      PKCatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      PKSchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      PKTableName,  
     SQLSMALLINT    NameLength3,  
     SQLCHAR *      FKCatalogName,  
     SQLSMALLINT    NameLength4,  
     SQLCHAR *      FKSchemaName,  
     SQLSMALLINT    NameLength5,  
     SQLCHAR *      FKTableName,  
     SQLSMALLINT    NameLength6);  

引数

StatementHandle
[入力]ステートメント ハンドル。

PKCatalogName
[入力]主キー テーブル カタログ名。 ドライバーが一部のテーブルのカタログをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、空の文字列 ("") はカタログを持たないテーブルを示します。 PKCatalogName に文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 PKCatalogName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSEの場合、 PKCatalogName は通常の引数です。これはリテラルとして扱われ、その場合は重要です。 詳細については、「 カタログ関数の引数」を参照してください。

NameLength1
[入力]*PKCatalogName の長さ (文字数)。

PKSchemaName
[入力]主キー テーブルのスキーマ名。 ドライバーが一部のテーブルのスキーマをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、空の文字列 ("") はスキーマを持たないテーブルを示します。 PKSchemaName に文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 PKSchemaName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSEの場合、 PKSchemaName は通常の引数です。これはリテラルとして扱われ、その場合は重要です。

NameLength2
[入力]*PKSchemaName の長さ (文字数)。

PKTableName
[入力]主キー テーブル名。 PKTableName に文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 PKTableName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSEの場合、 PKTableName は通常の引数です。これはリテラルとして扱われ、その場合は重要です。

NameLength3
[入力]*PKTableName の長さ (文字数)。

FKCatalogName
[入力]外部キー テーブル カタログ名。 ドライバーが一部のテーブルのカタログをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、空の文字列 ("") はカタログを持たないテーブルを示します。 FKCatalogName に文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 FKCatalogName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSE場合、 FKCatalogName は通常の引数です。これはリテラルとして扱われ、その場合は重要です。

NameLength4
[入力]*FKCatalogName の長さ (文字数)。

FKSchemaName
[入力]外部キー テーブルスキーマ名。 ドライバーが一部のテーブルのスキーマをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、空の文字列 ("") はスキーマを持たないテーブルを示します。 FKSchemaName には文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 FKSchemaName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSEの場合、 FKSchemaName は通常の引数です。これはリテラルとして扱われ、その場合は重要です。

NameLength5
[入力]*FKSchemaName の長さ (文字数)。

FKTableName
[入力]外部キー テーブル名。 FKTableName に 文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定されている場合、 FKTableName は識別子として扱われ、大文字と小文字は区別されません。 SQL_FALSEの場合、 FKTableName は通常の引数です。これはリテラルとして扱われ、その場合は重要です。

NameLength6
[入力]*FKTableName の長さ (文字数)。

戻り値

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR、またはSQL_INVALID_HANDLE。

診断

SQLForeignKeys がSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、関連付けられた SQLSTATE 値を取得するには、HandleType が SQL_HANDLE_STMT で、Handle of StatementHandle を使用して SQLGetDiagRec を呼び出します。 次の表に、 SQLForeignKeys によって通常返される SQLSTATE 値の一覧を示し、この関数のコンテキストでそれぞれについて説明します。"(DM)" という表記は、ドライバー マネージャーによって返される SQLSTATEs の説明の前にあります。 特に明記されていない限り、各 SQLSTATE 値に関連付けられた戻りコードはSQL_ERRORされます。

SQLSTATE エラー 説明
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
08S01 通信リンクエラー ドライバーとドライバーが接続されているデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。
24000 カーソル状態が無効 StatementHandle でカーソルが開き、SQLFetch または SQLFetchScroll が呼び出されました。 このエラーは、SQLFetch または SQLFetchScroll がSQL_NO_DATAを返していない場合にドライバー マネージャーによって返され、SQLFetch または SQLFetchScroll がSQL_NO_DATAを返した場合にドライバーによって返されます。

StatementHandle でカーソルが開かれていましたが、SQLFetch または SQLFetchScroll が呼び出されませんでした。
40001 シリアル化エラー 別のトランザクションでリソースのデッドロックが発生したため、トランザクションがロールバックされました。
40003 ステートメントの完了が不明です この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージは、エラーとその原因を説明します。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てることができませんでした。
HY008 操作が取り消されました StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、StatementHandleSQLCancel または SQLCancelHandle が呼び出され、その関数が StatementHandle で再度呼び出されました。

関数が呼び出され、実行が完了する前に、マルチスレッド アプリケーションの別のスレッドから StatementHandleSQLCancel または SQLCancelHandle が呼び出されました。
HY009 null ポインターの使用が無効です (DM) 引数 PKTableNameFKTableName はどちらも null ポインターでした。

SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定され、 FKCatalogName 引数または PKCatalogName 引数が null ポインターであり、SQL_CATALOG_NAME InfoType はカタログ名がサポートされていることを返します。

(DM) SQL_ATTR_METADATA_ID ステートメント属性が SQL_TRUE に設定され、 FKSchemaNamePKSchemaNameFKTableName、または PKTableName 引数が null ポインターでした。
HY010 関数シーケンス エラー (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期実行関数が呼び出されました。 この非同期関数は、SQLForeignKeys 関数が呼び出されたときにも実行されていました。

(DM) StatementHandle に対して SQLExecuteSQLExecDirect、または SQLMoreResults が呼び出され、SQL_PARAM_DATA_AVAILABLE返されました。 この関数は、ストリーミングされたすべてのパラメーターのデータが取得される前に呼び出されました。

(DM) 非同期実行関数 (この関数ではなく) が StatementHandle に対して呼び出され、この関数が呼び出されたときにはまだ実行されていました。

(DM) StatementHandle に対して SQLExecuteSQLExecDirectSQLBulkOperations、または SQLSetPos が呼び出され、SQL_NEED_DATA返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。
HY013 メモリ管理エラー メモリ不足の可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。
HY090 文字列またはバッファーの長さが無効です (DM) 名前の長さの引数の 1 つの値が 0 未満でしたが、SQL_NTSと等しくありません。
名前の長さの引数の 1 つの値が、対応する名前の最大長の値を超えました。 (「コメント」を参照してください)。)
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 を呼び出す必要があります。

説明

この関数によって返される情報の使用方法については、「 カタログ データの使用」を参照してください。

*PKTableName に テーブル名が含まれている場合、 SQLForeignKeys は、指定されたテーブルの主キーと、それを参照するすべての外部キーを含む結果セットを返します。 他のテーブルの外部キーの一覧には、指定されたテーブル内の一意の制約を指す外部キーは含まれません。

*FKTableName に テーブル名が含まれている場合、 SQLForeignKeys は、他のテーブルの主キーと、参照先の他のテーブルの主キーを指す、指定されたテーブル内のすべての外部キーを含む結果セットを返します。 指定したテーブル内の外部キーの一覧には、他のテーブルの一意の制約を参照する外部キーが含まれていません。

*PKTableName と *FKTableName の両方にテーブル名が含まれている場合、SQLForeignKeys は*PKTableName で指定されたテーブルの主キーを参照する *FKTableName で指定されたテーブルの外部キーを返します。 これは、最大で 1 つのキーである必要があります。

Note

ODBC カタログ関数の一般的な使用方法、引数、および返されるデータの詳細については、「 カタログ関数」を参照してください。

SQLForeignKeys は、 標準の結果セットとして結果を返します。 主キーに関連付けられている外部キーが要求された場合、結果セットは、FKTABLE_CAT、FKTABLE_SCHEM、FKTABLE_NAME、KEY_SEQ順に並べ替えられます。 外部キーに関連付けられている主キーが要求された場合、結果セットは、PKTABLE_CAT、PKTABLE_SCHEM、PKTABLE_NAME、およびKEY_SEQ順に並べ替えられます。 次の表に、結果セットの列を示します。

VARCHAR 列の長さは表に示されていません。実際の長さはデータ ソースによって異なります。 アプリケーションは、PKTABLE_CATまたはFKTABLE_CAT、PKTABLE_SCHEMまたはFKTABLE_SCHEM、PKTABLE_NAMEまたはFKTABLE_NAME、PKCOLUMN_NAME列またはFKCOLUMN_NAME列の実際の長さを判断するために、SQL_MAX_CATALOG_NAME_LEN、SQL_MAX_SCHEMA_NAME_LEN、SQL_MAX_TABLE_NAME_LEN、およびSQL_MAX_COLUMN_NAME_LENオプションを使用して SQLGetInfo を呼び出すことができます。

ODBC 3*.x に対して次の列の名前が変更されました。* アプリケーションは列番号でバインドされるため、列名の変更は下位互換性に影響しません。

ODBC 2.0 列 ODBC 3*.x* 列
PKTABLE_QUALIFIER PKTABLE_CAT
PKTABLE_OWNER PKTABLE_SCHEM
FKTABLE_QUALIFIER FK_TABLE_CAT
FKTABLE_OWNER FKTABLE_SCHEM

次の表に、結果セットの列を示します。 列 14 (解説) を超える追加の列は、ドライバーによって定義できます。 アプリケーションは、明示的な序数位置を指定する代わりに、結果セットの末尾からカウントダウンすることで、ドライバー固有の列にアクセスする必要があります。 詳細については、「 カタログ関数によって返されるデータ」を参照してください。

列名 列番号 データ型 コメント
PKTABLE_CAT (ODBC 1.0) 1 Varchar 主キー テーブル カタログ名。データ ソースに該当しない場合は NULL。 ドライバーが一部のテーブルのカタログをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、カタログがないテーブルに対して空の文字列 ("") が返されます。
PKTABLE_SCHEM (ODBC 1.0) 2 Varchar 主キー テーブルのスキーマ名。データ ソースに該当しない場合は NULL。 ドライバーが一部のテーブルのスキーマをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、スキーマがないテーブルに対して空の文字列 ("") が返されます。
PKTABLE_NAME (ODBC 1.0) 3 Varchar not NULL 主キー テーブル名。
PKCOLUMN_NAME (ODBC 1.0) 4 Varchar not NULL 主キーの列名。 ドライバーは、名前のない列の空の文字列を返します。
FKTABLE_CAT (ODBC 1.0) 5 Varchar 外部キー テーブル カタログ名。データ ソースに該当しない場合は NULL。 ドライバーが一部のテーブルのカタログをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、カタログがないテーブルに対して空の文字列 ("") が返されます。
FKTABLE_SCHEM (ODBC 1.0) 6 Varchar 外部キー テーブルのスキーマ名。データ ソースに該当しない場合は NULL。 ドライバーが一部のテーブルのスキーマをサポートしているが、他のテーブルではサポートされていない場合 (ドライバーが異なる DBMS からデータを取得する場合など)、スキーマがないテーブルに対して空の文字列 ("") が返されます。
FKTABLE_NAME (ODBC 1.0) 7 Varchar not NULL 外部キー テーブル名。
FKCOLUMN_NAME (ODBC 1.0) 8 Varchar not NULL 外部キーの列名。 ドライバーは、名前のない列の空の文字列を返します。
KEY_SEQ (ODBC 1.0) 9 Smallint (NULL 以外) キーの列シーケンス番号 (1 から始まる)。
UPDATE_RULE (ODBC 1.0) 10 Smallint SQL 操作が UPDATE のときに外部キーに適用されるアクション。 次のいずれかの値を指定できます。 (参照先テーブルは主キーを持つテーブルです。参照元のテーブルは外部キーを持つテーブルです)。

SQL_CASCADE: 参照先テーブルの主キーが更新されると、参照元テーブルの外部キーも更新されます。

SQL_NO_ACTION: 参照先テーブルの主キーを更新すると、参照元テーブルに "未解決の参照" が発生する場合 (つまり、参照先テーブルの行に参照テーブルに対応する行が存在しない場合)、更新は拒否されます。 参照元テーブルの外部キーの更新で、参照先テーブルの主キーの値として存在しない値が導入された場合、更新は拒否されます。 (このアクションは、ODBC 2*.x* のSQL_RESTRICT アクションと同じです。

SQL_SET_NULL: 参照先テーブル内の 1 つ以上の行が、主キーの 1 つ以上のコンポーネントが変更されるように更新されると、参照元テーブルの変更されたコンポーネントに対応する参照元テーブル内の外部キーのコンポーネントは、参照元テーブルのすべての一致する行で NULL に設定されます。

SQL_SET_DEFAULT: 参照先テーブルの 1 つ以上の行が、主キーの 1 つ以上のコンポーネントが変更されるように更新されると、参照元テーブルの変更されたコンポーネントに対応する参照元テーブル内の外部キーのコンポーネントは、参照元テーブルのすべての一致する行の該当する既定値に設定されます。

データ ソースに該当しない場合は NULL。
DELETE_RULE (ODBC 1.0) 11 Smallint SQL 操作が DELETE のときに外部キーに適用されるアクション。 次のいずれかの値を指定できます。 (参照先テーブルは主キーを持つテーブルです。参照元のテーブルは外部キーを持つテーブルです)。

SQL_CASCADE: 参照先テーブルの行が削除されると、参照元テーブル内の一致するすべての行も削除されます。

SQL_NO_ACTION: 参照先テーブル内の行を削除すると、参照元テーブルに "未解決の参照" が発生する場合 (つまり、参照先テーブルの行に、参照先テーブルに対応する行が存在しない) 場合、更新は拒否されます。 (このアクションは、ODBC 2*.x* のSQL_RESTRICT アクションと同じです。

SQL_SET_NULL: 参照先テーブルの 1 つ以上の行が削除されると、参照元テーブルの外部キーの各コンポーネントは、参照元テーブルの一致するすべての行で NULL に設定されます。

SQL_SET_DEFAULT: 参照先テーブル内の 1 つ以上の行が削除されると、参照元テーブルの外部キーの各コンポーネントは、参照元テーブルのすべての一致する行の適用可能な既定値に設定されます。

データ ソースに該当しない場合は NULL。
FK_NAME (ODBC 2.0) 12 Varchar 外部キー名。 データ ソースに該当しない場合は NULL。
PK_NAME (ODBC 2.0) 13 Varchar 主キー名。 データ ソースに該当しない場合は NULL。
DEFERRABILITY (ODBC 3.0) 14 Smallint SQL_INITIALLY_DEFERRED、SQL_INITIALLY_IMMEDIATE、SQL_NOT_DEFERRABLE。

コード例

次の表に示すように、この例では ORDERS、LINES、CUSTOMERS という名前の 3 つのテーブルを使用します。

ORDERS LINES 顧客
Orderid Orderid CUSTID
CUSTID LINES 名前
OPENDATE PARTID アドレス
営業 担当者 電話
状態

ORDERS テーブルでは、CUSTID は販売先の顧客を識別します。 これは、CUSTOMERS テーブルの CUSTID を参照する外部キーです。

LINES テーブルの ORDERID は、明細が関連付けられている販売注文を識別します。 これは、ORDERS テーブル内の ORDERID を参照する外部キーです。

この例では 、SQLPrimaryKeys を 呼び出して ORDERS テーブルの主キーを取得します。 結果セットには 1 つの行があります。重要な列を次の表に示します。

TABLE_NAME COLUMN_NAME KEY_SEQ
ORDERS Orderid 1

次に、この例では SQLForeignKeys を 呼び出して、ORDERS テーブルの主キーを参照する他のテーブルの外部キーを取得します。 結果セットには 1 つの行があります。重要な列を次の表に示します。

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
ORDERS CUSTID LINES CUSTID 1

最後に、 SQLForeignKeys を呼び出して、他のテーブルの主キーを参照する ORDERS テーブル内の外部キーを取得します。 結果セットには 1 つの行があります。重要な列を次の表に示します。

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
顧客 CUSTID ORDERS CUSTID 1
#define TAB_LEN SQL_MAX_TABLE_NAME_LEN + 1  
#define COL_LEN SQL_MAX_COLUMN_NAME_LEN + 1  
  
LPSTR   szTable;              /* Table to display */  
  
UCHAR szPkTable[TAB_LEN];   /* Primary key table name */  
UCHAR szFkTable[TAB_LEN];   /* Foreign key table name */  
UCHAR szPkCol[COL_LEN];     /* Primary key column */  
UCHAR szFkCol[COL_LEN];     /* Foreign key column */  
  
SQLHSTMT      hstmt;  
SQLINTEGER    cbPkTable, cbPkCol, cbFkTable, cbFkCol, cbKeySeq;  
SQLSMALLINT   iKeySeq;  
SQLRETURN     retcode;  
  
// Bind the columns that describe the primary and foreign keys.  
// Ignore the table schema, name, and catalog for this example.  
  
SQLBindCol(hstmt, 3, SQL_C_CHAR, szPkTable, TAB_LEN, &cbPkTable);  
SQLBindCol(hstmt, 4, SQL_C_CHAR, szPkCol, COL_LEN, &cbPkCol);  
SQLBindCol(hstmt, 5, SQL_C_SSHORT, &iKeySeq, TAB_LEN, &cbKeySeq);  
SQLBindCol(hstmt, 7, SQL_C_CHAR, szFkTable, TAB_LEN, &cbFkTable);  
SQLBindCol(hstmt, 8, SQL_C_CHAR, szFkCol, COL_LEN, &cbFkCol);  
  
strcpy_s(szTable, sizeof(szTable), "ORDERS");  
  
/* Get the names of the columns in the primary key. */  
  
retcode = SQLPrimaryKeys(hstmt,  
         NULL, 0,             /* Catalog name */  
         NULL, 0,             /* Schema name */  
         szTable, SQL_NTS);   /* Table name */  
  
while ((retcode == SQL_SUCCESS) || (retcode == SQL SUCCESS_WITH_INFO)) {  
  
   /* Fetch and display the result set. This will be a list of the */  
   /* columns in the primary key of the ORDERS table. */  
  
   retcode = SQLFetch(hstmt);  
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
      fprintf(out, "Table: %s Column: %s Key Seq: %hd \n", szPkTable, szPkCol,  
      iKeySeq);  
}  
  
/* Close the cursor (the hstmt is still allocated). */  
  
SQLFreeStmt(hstmt, SQL_CLOSE);  
  
/* Get all the foreign keys that refer to ORDERS primary key.*/   
  
retcode = SQLForeignKeys(hstmt,  
         NULL, 0,            /* Primary catalog */  
         NULL, 0,            /* Primary schema */  
         szTable, SQL_NTS,   /* Primary table */  
         NULL, 0,            /* Foreign catalog */  
         NULL, 0,            /* Foreign schema */  
         NULL, 0);           /* Foreign table */  
  
while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) {  
  
/* Fetch and display the result set. This will be all of the */  
/* foreign keys in other tables that refer to the ORDERS */  
/* primary key. */  
  
   retcode = SQLFetch(hstmt);  
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
      fprintf(out, "%-s ( %-s ) <-- %-s ( %-s )\n", szPkTable,  
               szPkCol, szFkTable, szFkCol);  
}  
  
/* Close the cursor (the hstmt is still allocated). */  
  
SQLFreeStmt(hstmt, SQL_CLOSE);  
  
/* Get all the foreign keys in the ORDERS table. */  
  
retcode = SQLForeignKeys(hstmt,  
         NULL, 0,             /* Primary catalog */  
         NULL, 0,             /* Primary schema */  
         NULL, 0,             /* Primary table */  
         NULL, 0,             /* Foreign catalog */  
         NULL, 0,             /* Foreign schema */  
         szTable, SQL_NTS);   /* Foreign table */  
  
while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) {  
  
/* Fetch and display the result set. This will be all of the */  
/* primary keys in other tables that are referred to by foreign */  
/* keys in the ORDERS table. */  
  
   retcode = SQLFetch(hstmt);  
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
      fprintf(out, "%-s ( %-s )--> %-s ( %-s )\n", szFkTable, szFkCol, szPkTable, szPkCol);  
}  
  
/* Free the hstmt. */  
SQLFreeStmt(hstmt, SQL_DROP);  
対象 解決方法については、
結果セット内の列にバッファーをバインドする SQLBindCol 関数
ステートメント処理の取り消し SQLCancel 関数
1 つの行またはデータ ブロックを順方向にフェッチする SQLFetch 関数
データブロックのフェッチまたは結果セットのスクロール SQLFetchScroll 関数
主キーの列を返す SQLPrimaryKeys 関数
テーブルの統計とインデックスを返す SQLStatistics 関数

参照

ODBC API リファレンス
ODBC ヘッダー ファイル