Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Соответствие
Введенная версия: Соответствие стандартам 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);
Arguments
Оператор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 — это обычный аргумент; Это воспринимается буквально, и его дело значимо.
НазваниеДлина4
[Ввод] Длина *FKCatalogName, в символах.
FKSchemaName
[Ввод] Название схемы таблицы внешних ключей. Если драйвер поддерживает схемы для одних таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, пустая строка ("") обозначает таблицы без схем.
FKSchemaName не может содержать шаблон поиска по строкам.
Если атрибут оператора SQL_ATTR_METADATA_ID установлен в SQL_TRUE, FKSchemaName рассматривается как идентификатор, и его падеж не является значимым. Если это SQL_FALSE, то FKSchemaName — это обычный аргумент; Это воспринимается буквально, и его дело значимо.
НазваниеДлина5
[Ввод] Длина *FKSchemaName, в символах.
FKTableName
[Ввод] Название таблицы внешних ключей.
FKTableName не может содержать шаблон поиска по строкам.
Если атрибут оператора SQL_ATTR_METADATA_ID установлен в SQL_TRUE, FKTableName рассматривается как идентификатор, и его падеж не является значимым. Если это SQL_FALSE, то FKTableName — это обычный аргумент; Это воспринимается буквально, и его дело значимо.
НазваниеДлина6
[Ввод] Длина *FKTableName, в символах.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR или SQL_INVALID_HANDLE.
Diagnostics
Когда SQLForeignKeys возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO, соответствующее значение SQLSTATE можно получить, вызвав SQLGetDiagRec с помощью HandleType SQL_HANDLE_STMT и HandleType of StatementHandle. В следующей таблице перечислены значения SQLSTATE, обычно возвращаемые SQLForeignKeys , и каждое из них объясняется в контексте этой функции; обозначение «(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, но SQLFetch или SQLFetchScroll не были вызваны. |
| 40001 | Сбой сериализации | Транзакция была откатена из-за взаимоблокировки ресурсов с другой транзакцией. |
| 40003 | Неизвестное завершение инструкции | Связанное соединение завершилось сбоем во время выполнения этой функции, и состояние транзакции невозможно определить. |
| HY000 | Общая ошибка | Произошла ошибка, для которой не было определенного SQLSTATE и для которого не было определено значение SQLSTATE для конкретной реализации. Сообщение об ошибке, возвращаемое SQLGetDiagRec в буфере *MessageText , описывает ошибку и ее причину. |
| HY001 | Ошибка выделения памяти | Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции. |
| HY008 | Операция отменена | Асинхронная обработка была включена для ОператораHandle. Функция вызывалась, и перед завершением выполнения на StatementHandleвызывалась SQLCancel или SQLCancelHandle, а затем функция вызывалась снова на StatementHandle. Функция была вызвана и до завершения выполнения 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 должен вызываться на дескрипторе для выполнения последующей обработки и завершения операции. |
Comments
Для информации о том, как может использоваться информация, возвращаемая этой функцией, см. раздел Использование каталоговых данных.
Если *PKTableName содержит имя таблицы, SQLForeignKeys возвращает набор результатов, содержащий первичный ключ указанной таблицы и все внешние ключи, которые к нему ссылаются. Список внешних ключей в других таблицах не включает внешние ключи, указывающие на уникальные ограничения в указанной таблице.
Если *FKTableName содержит имя таблицы, SQLForeignKeys возвращает набор результатов, содержащий все внешние ключи указанной таблицы, указывающие на первичные ключи в других таблицах, а также первичные ключи в других таблицах, к которым они относятся. Список внешних ключей в указанной таблице не содержит внешних ключей, отсылающих к уникальным ограничениям в других таблицах.
Если и *PKTableName , и *FKTableName содержат имена таблиц, SQLForeignKeys возвращает внешние ключи в таблице, указанной в *FKTableName , которые относятся к первичному ключу таблицы, указанной в *PKTableName. Это должен быть максимум один ключ.
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 столбцов, приложение может вызвать 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 (ПРИМЕЧАНИЯ). Приложение должно получить доступ к столбцам для конкретного драйвера, отсчитывая от конца результирующего набора вместо указания явной порядковой позиции. Дополнительные сведения см. в разделе "Данные, возвращаемые функциями каталога".
| Название столбца | Номер столбца | Тип данных | Comments |
|---|---|---|---|
| PKTABLE_CAT (ODBC 1.0) | 1 | Varchar | Название каталога таблицы первичных ключей; NULL, если это не применимо к источнику данных. Если драйвер поддерживает каталоги для одних таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, он возвращает пустую строку ("") для тех таблиц, в которых нет каталогов. |
| PKTABLE_SCHEM (ODBC 1.0) | 2 | Varchar | Название схемы таблицы первичных ключей; NULL, если это не применимо к источнику данных. Если драйвер поддерживает схемы для одних таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, он возвращает пустую строку ("") для тех таблиц, в которых нет схем. |
| PKTABLE_NAME (ODBC 1.0) | 3 | Варчар, а не NULL | Имя таблицы первичного ключа. |
| PKCOLUMN_NAME (ODBC 1.0) | 4 | Варчар, а не NULL | Название столбца первичного ключа. Драйвер возвращает пустую строку для столбца, который не имеет имени. |
| FKTABLE_CAT (ODBC 1.0) | 5 | Varchar | Название каталога таблицы внешних ключей; NULL, если это не применимо к источнику данных. Если драйвер поддерживает каталоги для одних таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, он возвращает пустую строку ("") для тех таблиц, в которых нет каталогов. |
| FKTABLE_SCHEM (ODBC 1.0) | 6 | Varchar | Название схемы таблицы внешних ключей; NULL, если это не применимо к источнику данных. Если драйвер поддерживает схемы для одних таблиц, но не для других, например, когда драйвер получает данные из разных СУБД, он возвращает пустую строку ("") для тех таблиц, в которых нет схем. |
| 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: Если обновление первичного ключа ссылаемой таблицы вызовет «зависающую ссылку» в таблице ссылок (то есть строки в таблице ссылок не будут иметь аналогов в таблице ссылок), обновление отклоняется. Если обновление внешнего ключа таблицы ссылок вводит значение, которое не существует в качестве значения первичного ключа ссылаемой таблицы, обновление отклоняется. (Это действие совпадает с 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.
| ПРИКАЗЫ | ЛИНИИ | КЛИЕНТЫ |
|---|---|---|
| ORDERID | ORDERID | CUSTID |
| CUSTID | ЛИНИИ | ИМЯ |
| ДАТА ОТКРЫТИЯ | ПАРТИД | АДРЕС |
| ПРОДАВЕЦ | КОЛИЧЕСТВО | ТЕЛЕФОН |
| STATUS |
В таблице ORDERS CUSTID указывает клиента, которому была совершена сделка. Это внешний ключ, который ссылается на CUSTID в таблице CUSTOMERS.
В таблице LINES ORDERID обозначает заказ на продажу, с которым связан этот элемент. Это внешний ключ, который ссылается на ORDERID в таблице ORDERS.
В этом примере вызывается SQLPrimaryKeys для получения первичного ключа таблицы ORDERS. Набор результатов будет состоять из одной строки; Значимые столбцы показаны в следующей таблице.
| ИМЯ_ТАБЛИЦЫ | НАЗВАНИЕ_СТОЛБЦА | KEY_SEQ |
|---|---|---|
| ПРИКАЗЫ | ORDERID | 1 |
Далее пример вызывает SQLForeignKeys для получения внешних ключей в других таблицах, которые ссылаются на первичный ключ таблицы ORDERS. Набор результатов будет состоять из одной строки; Значимые столбцы показаны в следующей таблице.
| PKTABLE_NAME | PKCOLUMN_NAME | FKTABLE_NAME | FKCOLUMN_NAME | KEY_SEQ |
|---|---|---|---|---|
| ПРИКАЗЫ | CUSTID | ЛИНИИ | CUSTID | 1 |
Наконец, в примере используется SQLForeignKeys , чтобы получить внешние ключи в таблице ORDER, которые ссылаются на первичные ключи других таблиц. Набор результатов будет состоять из одной строки; Значимые столбцы показаны в следующей таблице.
| 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 |
| Возврат статистики и индексов таблиц | Функция SQLStatistic |
См. также
Справочник по API ODBC
Файлы заголовков ODBC