SQLForeignKeys 関数

適合 性
導入版:ODBC 1.0 規格準拠:ODBC

まとめ
SQLForeignKeys は以下の返事が可能です:

  • 指定されたテーブル内の外部キーのリスト(他のテーブルの主キーを参照する列)。

  • 指定されたテーブル内の主キーを参照する他のテーブルの外部キーのリスト。

ドライバーは指定された文に対して各リストの結果セットとして返します。

Syntax

  
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(PKSchemaName)
[入力]プライマリキーテーブルスキーマ名。 ドライバが一部のテーブルにはスキーマをサポートし、他のテーブルにはサポートしない場合(例えば異なるDBMSからデータを取得する場合など)、空の文字列(「」)はスキーマを持たないテーブルを示します。 PKSchemaName は文字列検索パターンを含めることはできません。

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、 PKSchemaName は識別子として扱われ、その大文字は有意ではありません。 もしそれがSQL_FALSEであれば、 PKSchemaName は通常の引数です。文字通りに扱われており、そのケースは重要です。

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

PKTableName(PKTableName)
[入力]プライマリキーテーブル名。 PKTableName は文字列検索パターンを含めません。

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、 PKTableName は識別子として扱われ、その大切なケースは重要ではありません。 もしそれがSQL_FALSEであれば、 PKTableName は通常の引数となります。文字通りに扱われており、そのケースは重要です。

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

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

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、 FKCatalogName は識別子として扱われ、その大文字は重要ではありません。 SQL_FALSEの場合、 FKCatalogName は通常の引数となります。文字通りに扱われており、そのケースは重要です。

名前の長さ4
[入力]*FKCatalogName(文字数)の長さ。

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

SQL_ATTR_METADATA_ID文属性がSQL_TRUEに設定されている場合、 FKSchemaName は識別子として扱われ、その大文字は重要ではありません。 もしそれがSQL_FALSEであれば、 FKSchemaName は通常の引数です。文字通りに扱われており、そのケースは重要です。

名前の長さ5
[入力]*FKSchemaName(文字数)の長さ。

FKTableName(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。

Diagnostics

SQLForeignKeysがSQL_ERRORまたはSQL_SUCCESS_WITH_INFOを返す場合、SQLGetDiagRecを呼び出し、HandleTypeをSQL_HANDLE_STMT、HandleStatementHandleに割り当てることで、関連するSQLSTATE値を取得できます。 以下の表は 、通常SQLForeignKeysによって返されるSQLSTATE 値と、この関数の文脈でそれぞれを説明しています。「(DM)」という表記は、ドライバーマネージャーが返すSQLstateの記述の前に記載されます。 特に明記されていない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERROR。

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

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

関数が呼び出され、実行が完了する前に、 SQLCancel または SQLCancelHandle がマルチスレッド アプリケーション内の別のスレッドから StatementHandle で呼び出されました。
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) SQLExecuteSQLExecDirect、または SQLMoreResultsStatementHandle が呼び出され、SQL_PARAM_DATA_AVAILABLEが返されました。 この関数は、すべてのストリーミング パラメーターのデータが取得される前に呼び出されました。

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

(DM) SQLExecuteSQLExecDirectSQLBulkOperations、または SQLSetPosStatementHandle に対して呼び出され、SQL_NEED_DATAが返されました。 この関数は、すべての実行時データ パラメーターまたは列に対してデータが送信される前に呼び出されました。
HY013 メモリ管理エラー メモリが不足している可能性があるため、基になるメモリ オブジェクトにアクセスできなかったため、関数呼び出しを処理できませんでした。
HY090 文字列またはバッファーの長さが無効です (DM) 名前の長さの引数のうちの一つの値は0未満で、SQL_NTSと等しくなかった。
名前の長さの引数のいずれかの値が、対応する名前の最大長の値を超えました。 (「コメント」参照)
HY117 不明なトランザクション状態のため、接続が中断されます。 切断関数と読み取り専用関数のみが許可されます。 (DM) 中断状態の詳細については、「 SQLEndTran 関数を参照してください。
HYC00 省略可能な機能が実装されていません カタログ名が指定されており、ドライバーやデータソースはカタログをサポートしていません。

スキーマ名が指定されており、ドライバやデータソースはスキーマをサポートしていません。
SQL_ATTR_CONCURRENCY属性とSQL_ATTR_CURSOR_TYPE ステートメント属性の現在の設定の組み合わせは、ドライバーまたはデータ ソースではサポートされていませんでした。

SQL_ATTR_USE_BOOKMARKS ステートメント属性はSQL_UB_VARIABLEに設定され、SQL_ATTR_CURSOR_TYPE ステートメント属性は、ドライバーがブックマークをサポートしていないカーソルの種類に設定されました。
HYT00 タイムアウトの期限が切れました データ ソースが結果セットを返す前に、クエリのタイムアウト期間が期限切れになりました。 タイムアウト期間は、SQL_ATTR_QUERY_TIMEOUT SQLSetStmtAttr によって設定されます。
HYT01 接続がタイムアウトしました データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr によって設定されます。
IM001 ドライバーは、この関数をサポートしていません (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。
IM017 非同期通知モードでポーリングが無効になっている 通知モデルが使用されるたびに、ポーリングは無効になります。
IM018 SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 ハンドルに対する前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、後処理を実行して操作を完了するために、 SQLCompleteAsync をハンドルで呼び出す必要があります。

Comments

この関数で返される情報がどのように使われるかについては、「 カタログデータの用途」を参照してください。

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

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

*PKTableName と*FKTableName の両方にテーブル名が含まれている場合、 SQLForeignKeys は*FKTableName で指定されたテーブル内の外部キーを返し、これらは*PKTableNameで指定されたテーブルの主キーを参照します。 これはせいぜい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列(REMARKS)以降の追加列はドライバーによって定義可能です。 アプリケーションは、明示的な序数位置を指定するのではなく、結果セットの末尾からカウントダウンすることで、ドライバー固有の列にアクセスできるようにする必要があります。 詳細については、「 カタログ関数によって返されるデータ」を参照してください。

列名 列番号 データの種類 Comments
PKTABLE_CAT(ODBC 1.0) 1 Varchar プライマリキーテーブルカタログ名;データソースに適用できない場合はNULLです。 ドライバが一部のテーブルにはカタログをサポートしているが、他のテーブルではサポートしない場合(例えば異なるDBMSからデータを取得する場合など)、カタログを持たないテーブルに対して空の文字列("")を返します。
PKTABLE_SCHEM(ODBC 1.0) 2 Varchar プライマリキーテーブルスキーマ名;データソースに適用できない場合はNULLです。 ドライバが一部のテーブルにはスキーマをサポートしているが、他のテーブルではサポートしない場合、例えば異なるDBMSからデータを取得する場合、スキーマを持たないテーブルに対して空の文字列("")を返します。
PKTABLE_NAME(ODBC 1.0) 3 ヴァルチャーはNULLではありません 主キー テーブル名。
PKCOLUMN_NAME(ODBC 1.0) 4 ヴァルチャーは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 ヴァルチャーはNULLではありません 外部キー テーブル名。
FKCOLUMN_NAME(ODBC 1.0) 8 ヴァルチャーは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です。
繰延可能性(ODBC 3.0) 14 Smallint SQL_INITIALLY_DEFERRED、SQL_INITIALLY_IMMEDIATE、SQL_NOT_DEFERRABLE。

コード例

以下の表に示されているように、この例はORDERS、LINES、CUSTOMERSという3つのテーブルを使用しています。

注文 ライン 顧客
オーダーID オーダーID カスティッド
カスティッド ライン 名前
開業日 パルティッド 住所
営業担当者 数量 PHONE
状態

ORDERS テーブルでは、CUSTIDが販売が行われた顧客を特定します。 これはCUSTOMERSテーブル内のCUSTIDを参照する外部キーです。

LINESテーブルでは、ORDERIDがそのラインアイテムに関連付けられた販売注文を識別します。 これはORDERSテーブル内のORDERIDを参照する外部キーです。

この例ではORDERSテーブルの主キーを取得する ためにSQLPrimaryKeys を呼び出します。 結果セットは1行になります。重要な列は以下の表に示されています。

TABLE_NAME カラム名 KEY_SEQ
注文 オーダーID 1

次に、例では SQLForeignKeys を呼び出して、ORDERSテーブルのプライマリキーを参照する他のテーブルの外部キーを取得します。 結果セットは1行になります。重要な列は以下の表に示されています。

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
注文 カスティッド ライン カスティッド 1

最後に、この例では SQLForeignKeys を呼び出して、他のテーブルの主キーを参照するORDERSテーブル内の外部キーを取得します。 結果セットは1行になります。重要な列は以下の表に示されています。

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
顧客 カスティッド 注文 カスティッド 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 関数
順方向に単一行またはデータブロックを取得する方法 SQLFetch 関数
データブロックのフェッチまたは結果セットのスクロール SQLFetchScroll 関数
主キーの列を返す SQLPrimaryKeys 関数
表の統計と指数の返還 SQLStatistics 関数

こちらもご覧ください

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