Поделиться через


Функция SQLForeignKeys

Соответствия
Представлена версия: соответствие стандартам ODBC 1.0: 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);  

Аргументы

ОператорHandle
[Входные данные] Дескриптор инструкции.

PKCatalogName
[Входные данные] Имя каталога таблиц первичного ключа. Если драйвер поддерживает каталоги для некоторых таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, пустая строка ("") обозначает те таблицы, которые не имеют каталогов. PKCatalogName не может содержать шаблон поиска строк.

Если для атрибута оператора SQL_ATTR_METADATA_ID задано значение SQL_TRUE, PKCatalogName рассматривается как идентификатор, и его регистр не имеет значения. Если это SQL_FALSE, PKCatalogName является обычным аргументом; он обрабатывается буквально, и его дело является значительным. Дополнительные сведения см. в разделе "Аргументы" в функциях каталога.

NameLength1
[Входные данные] Длина *PKCatalogName в символах.

PKSchemaName
[Входные данные] Имя схемы таблицы первичного ключа. Если драйвер поддерживает схемы для некоторых таблиц, но не для других, например, когда драйвер извлекает данные из разных СУБД, пустая строка ("") обозначает те таблицы, которые не имеют схем. 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
[Входные данные] Имя каталога внешней таблицы ключей. Если драйвер поддерживает каталоги для некоторых таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, пустая строка ("") обозначает те таблицы, которые не имеют каталогов. FKCatalogName не может содержать шаблон поиска строк.

Если атрибут инструкции SQL_ATTR_METADATA_ID имеет значение SQL_TRUE, FKCatalogName обрабатывается как идентификатор, и его регистр не имеет значения. Если это SQL_FALSE, FKCatalogName является обычным аргументом; он обрабатывается буквально, и его дело является значительным.

NameLength4
[Входные данные] Длина *FKCatalogName в символах.

FKSchemaName
[Входные данные] Имя схемы внешней таблицы ключей. Если драйвер поддерживает схемы для некоторых таблиц, но не для других, например, когда драйвер извлекает данные из разных СУБД, пустая строка ("") обозначает те таблицы, которые не имеют схем. 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 можно получить путем вызова SQLGetDiagRec с handleType SQL_HANDLE_STMT и дескриптором инструкцииHandle. В следующей таблице перечислены значения SQLSTATE, которые обычно возвращаются SQLForeignKeys и объясняются каждый из них в контексте этой функции. Нотация "(DM)" предшествует описаниям SQLSTATEs, возвращаемым диспетчером драйверов. Возвращаемый код, связанный с каждым значением SQLSTATE, SQL_ERROR, если не указано иное.

SQLSTATE Error Description
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 для конкретной реализации. Сообщение об ошибке, возвращаемое SQLGetDiagRec в буфере *MessageText , описывает ошибку и ее причину.
HY001 Ошибка выделения памяти Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции.
HY008 Операция отменена Асинхронная обработка была включена для ОператораHandle. Функция была вызвана и до завершения выполнения, SQLCancel или SQLCancelHandle была вызвана в операторе StatementHandle, а затем функция была вызвана снова на ОператорHandle.

Функция была вызвана и до завершения выполнения SQLCancel или SQLCancelHandle была вызвана оператором StatementHandle из другого потока в многопотоковом приложении.
HY009 Недопустимое использование указателя NULL (DM) Аргументы PKTableName и FKTableName оба были пустыми указателями.

Для атрибута инструкции SQL_ATTR_METADATA_ID задано значение SQL_TRUE, аргумент FKCatalogName или PKCatalogName был пустым указателем, а SQL_CATALOG_NAME InfoType возвращает поддерживаемые имена каталогов.

(DM) Атрибут инструкции SQL_ATTR_METADATA_ID был задан как SQL_TRUE, а аргумент FKSchemaName, PKSchemaName, FKTableName или PKTableName был пустым указателем.
HY010 Ошибка последовательности функций (DM) Асинхронно выполняющаяся функция была вызвана для дескриптора соединения, связанного с ОператоромHandle. Эта асинхронная функция по-прежнему выполнялась при вызове функции SQLForeignKeys.

(DM) SQLExecute, SQLExecDirect или SQLMoreResults был вызван для ОператораHandle и возвращен SQL_PARAM_DATA_AVAILABLE. Эта функция была вызвана до получения данных для всех потоковых параметров.

(DM) асинхронно выполняющаяся функция (не эта) была вызвана для StatementHandle и по-прежнему выполнялась при вызове этой функции.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations или SQLSetPos были вызваны для ОператораHandle и возвращены SQL_NEED_DATA. Эта функция была вызвана до отправки данных для всех параметров выполнения или столбцов.
HY013 Ошибка управления памятью Не удалось обработать вызов функции, так как к базовым объектам памяти не удалось получить доступ, возможно, из-за низкой памяти.
HY090 Недопустимая длина строки или буфера (DM) Значение одного из аргументов длины имени было меньше 0, но не равно SQL_NTS.
Значение одного из аргументов длины имени превысило максимальное значение длины соответствующего имени. (См. комментарии.)
HY117 Подключение приостановлено из-за неизвестного состояния транзакции. Разрешены только функции отключения и только для чтения. (DM) Дополнительные сведения о приостановленном состоянии см. в статье SQLEndTran Function.
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 возвращает внешние ключи в таблице, указанной в *FKTableName , которая ссылается на первичный ключ таблицы, указанной в *PKTableName. Это должен быть один ключ в большинстве случаев.

Заметка

Дополнительные сведения об общем использовании, аргументах и возвращаемых данных функций каталога 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 столбцов, приложение может вызывать SQLGetInfo с параметрами SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN и SQL_MAX_COLUMN_NAME_LEN.

Следующие столбцы были переименованы для 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, если применимо к источнику данных. Если драйвер поддерживает каталоги для некоторых таблиц, но не для других, например, когда драйвер извлекает данные из разных СУБД, он возвращает пустую строку ("") для тех таблиц, которые не имеют каталогов.
PKTABLE_SCHEM (ODBC 1.0) 2 Varchar Имя схемы таблицы первичного ключа; ЗНАЧЕНИЕ NULL, если применимо к источнику данных. Если драйвер поддерживает схемы для некоторых таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, он возвращает пустую строку ("") для тех таблиц, которые не имеют схем.
PKTABLE_NAME (ODBC 1.0) 3 Varchar не NULL Имя таблицы первичного ключа.
PKCOLUMN_NAME (ODBC 1.0) 4 Varchar не NULL Имя столбца первичного ключа. Драйвер возвращает пустую строку для столбца, который не имеет имени.
FKTABLE_CAT (ODBC 1.0) 5 Varchar Имя каталога внешней таблицы ключей; ЗНАЧЕНИЕ NULL, если применимо к источнику данных. Если драйвер поддерживает каталоги для некоторых таблиц, но не для других, например, когда драйвер извлекает данные из разных СУБД, он возвращает пустую строку ("") для тех таблиц, которые не имеют каталогов.
FKTABLE_SCHEM (ODBC 1.0) 6 Varchar Имя схемы внешней таблицы ключей; ЗНАЧЕНИЕ NULL, если применимо к источнику данных. Если драйвер поддерживает схемы для некоторых таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, он возвращает пустую строку ("") для тех таблиц, которые не имеют схем.
FKTABLE_NAME (ODBC 1.0) 7 Varchar не NULL Имя таблицы внешнего ключа.
FKCOLUMN_NAME (ODBC 1.0) 8 Varchar не NULL Имя столбца внешнего ключа. Драйвер возвращает пустую строку для столбца, который не имеет имени.
KEY_SEQ (ODBC 1.0) 9 Smallint, не NULL Номер последовательности столбцов в ключе (начиная с 1).
UPDATE_RULE (ODBC 1.0) 10 Smallint Действие, применяемое к внешнему ключу при выполнении операции SQL с обновлением. Может иметь одно из следующих значений. (Указанная таблица — это таблица с первичным ключом; ссылка — это таблица с внешним ключом.)

SQL_CASCADE. При обновлении первичного ключа указанной таблицы внешний ключ таблицы ссылок также обновляется.

SQL_NO_ACTION. Если обновление первичного ключа указанной таблицы приведет к тому, что в таблице ссылок нет никаких аналогов, обновление отклоняется. Если обновление внешнего ключа таблицы ссылок введет значение, которое не существует в качестве значения первичного ключа указанной таблицы, обновление отклоняется. (Это действие совпадает с действием SQL_RESTRICT в ODBC 2*.x*.)

SQL_SET_NULL. При обновлении одной или нескольких строк в указанной таблице таким образом, чтобы один или несколько компонентов первичного ключа были изменены, компоненты внешнего ключа в таблице ссылок, соответствующие измененным компонентам первичного ключа, имеют значение NULL во всех соответствующих строках ссылающейся таблицы.

SQL_SET_DEFAULT. При обновлении одной или нескольких строк в указанной таблице таким образом, чтобы один или несколько компонентов первичного ключа были изменены, компоненты внешнего ключа в таблице ссылок, соответствующие измененным компонентам первичного ключа, задаются значения по умолчанию во всех соответствующих строках таблицы ссылок.

ЗНАЧЕНИЕ NULL, если применимо к источнику данных.
DELETE_RULE (ODBC 1.0) 11 Smallint Действие, применяемое к внешнему ключу при выполнении операции SQL DELETE. Может иметь одно из следующих значений. (Указанная таблица — это таблица с первичным ключом; ссылка — это таблица с внешним ключом.)

SQL_CASCADE. При удалении строки в указанной таблице все соответствующие строки в таблицах ссылок также удаляются.

SQL_NO_ACTION. Если удаление строки в указанной таблице приведет к тому, что в таблице ссылок нет аналогов, обновление отклоняется. (Это действие совпадает с действием SQL_RESTRICT в ODBC 2*.x*.)

SQL_SET_NULL. При удалении одной или нескольких строк в указанной таблице каждый компонент внешнего ключа в таблице ссылок имеет значение NULL во всех соответствующих строках таблицы ссылок.

SQL_SET_DEFAULT. При удалении одной или нескольких строк в указанной таблице каждый компонент внешнего ключа в таблице ссылок имеет применимое значение по умолчанию во всех соответствующих строках таблицы ссылок.

ЗНАЧЕНИЕ 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.

ЗАКАЗЫ LINES КЛИЕНТОВ
ORDERID ORDERID CUSTID
CUSTID LINES ИМЯ
OPENDATE PARTID АДРЕС
ПРОДАВЕЦ QUANTITY Телефон
СТАТУС

В таблице ORDERS CUSTID определяет клиента, которому была выполнена продажа. Это внешний ключ, который относится к CUSTID в таблице CUSTOMERS.

В таблице LINE ORDERID определяет заказ на продажу, с которым связан элемент строки. Это внешний ключ, который ссылается на ORDERID в таблице ORDERS.

В этом примере вызывается SQLPrimaryKeys , чтобы получить первичный ключ таблицы ORDERS. Результирующий набор будет иметь одну строку; Значительные столбцы показаны в следующей таблице.

TABLE_NAME COLUMN_NAME KEY_SEQ
ЗАКАЗЫ ORDERID 1

Далее в примере вызывается SQLForeignKeys , чтобы получить внешние ключи в других таблицах, ссылающихся на первичный ключ таблицы ORDERS. Результирующий набор будет иметь одну строку; Значительные столбцы показаны в следующей таблице.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
ЗАКАЗЫ CUSTID LINES CUSTID 1

Наконец, в примере вызывается SQLForeignKeys , чтобы получить внешние ключи в таблице ORDERS, ссылающейся на первичные ключи других таблиц. Результирующий набор будет иметь одну строку; Значительные столбцы показаны в следующей таблице.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
КЛИЕНТОВ CUSTID ЗАКАЗЫ 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
Получение одной строки или блока данных в направлении только для пересылки Функция SQLFetch
Получение блока данных или прокрутка результирующий набор Функция SQLFetchScroll
Возврат столбцов первичного ключа Функция SQLPrimaryKeys
Возврат статистики и индексов таблицы Функция SQLStatistics

См. также

Справочник по API ODBC
Файлы заголовков ODBC