Función SQLForeignKeys

Conformidad
Versión introducida: Cumplimiento de Normas ODBC 1.0: ODBC

Resumen
SQLForeignKeys puede devolver:

  • Una lista de claves foráneas en la tabla especificada (columnas en la tabla especificada que hacen referencia a claves primarias en otras tablas).

  • Una lista de claves foráneas en otras tablas que se refieren a la clave primaria en la tabla especificada.

El controlador devuelve cada lista como un conjunto de resultados en la instrucción especificada.

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

StatementHandle
[Entrada] Identificador de instrucciones.

PKCatalogName
[Entrada] Nombre del catálogo de tabla de claves primaria. Si un controlador soporta catálogos para algunas tablas pero no para otras, como cuando el controlador recupera datos de diferentes SGBD, una cadena vacía ("") denota aquellas tablas que no tienen catálogos. PKCatalogName no puede contener un patrón de búsqueda de cadenas.

Si el atributo de la sentencia SQL_ATTR_METADATA_ID se establece como SQL_TRUE, PKCatalogName se trata como un identificador y su caso no es significativo. Si es SQL_FALSE, PKCatalogName es un argumento ordinario; Se trata literalmente, y su caso es significativo. Para obtener más información, consulte Argumentos en funciones de catálogo.

NameLength1
[Entrada] Longitud de *PKCatalogName, en caracteres.

PKSchemaName
[Entrada] Nombre principal del esquema de la tabla de claves. Si un controlador soporta esquemas para algunas tablas pero no para otras, como cuando recupera datos de diferentes SGBD, una cadena vacía ("") denota aquellas tablas que no tienen esquemas. PKSchemaName no puede contener un patrón de búsqueda de cadenas.

Si el atributo de la sentencia SQL_ATTR_METADATA_ID se establece en SQL_TRUE, PKSchemaName se trata como un identificador y su caso no es significativo. Si es SQL_FALSE, PKSchemaName es un argumento ordinario; Se trata literalmente, y su caso es significativo.

NameLength2
[Entrada] Longitud de *PKSchemaName, en caracteres.

PKTableName
[Entrada] Nombre principal de la tabla de claves. PKTableName no puede contener un patrón de búsqueda de cadenas.

Si el atributo de la sentencia SQL_ATTR_METADATA_ID se establece en SQL_TRUE, PKTableName se trata como un identificador y su caso no es significativo. Si es SQL_FALSE, PKTableName es un argumento ordinario; Se trata literalmente, y su caso es significativo.

NameLength3
[Entrada] Longitud de *PKTableName, en caracteres.

FKCatalogName
[Entrada] Nombre del catálogo de tabla de llaves extranjeras. Si un controlador soporta catálogos para algunas tablas pero no para otras, como cuando el controlador recupera datos de diferentes SGBD, una cadena vacía ("") denota aquellas tablas que no tienen catálogos. FKCatalogName no puede contener un patrón de búsqueda de cadenas.

Si el atributo de la sentencia SQL_ATTR_METADATA_ID se establece en SQL_TRUE, FKCatalogName se trata como un identificador y su caso no es significativo. Si es SQL_FALSE, FKCatalogName es un argumento ordinario; Se trata literalmente, y su caso es significativo.

NombreLongitud4
[Entrada] Longitud de *FKCatalogName, en caracteres.

FKSchemaName
[Entrada] Nombre del esquema de la tabla de clave extranjera. Si un controlador soporta esquemas para algunas tablas pero no para otras, como cuando recupera datos de diferentes SGBD, una cadena vacía ("") denota aquellas tablas que no tienen esquemas. FKSchemaName no puede contener un patrón de búsqueda en cadenas.

Si el atributo de la sentencia SQL_ATTR_METADATA_ID se establece en SQL_TRUE, FKSchemaName se trata como un identificador y su caso no es significativo. Si es SQL_FALSE, FKSchemaName es un argumento ordinario; Se trata literalmente, y su caso es significativo.

NombreLongitud5
[Entrada] Longitud de *FKSchemaName, en caracteres.

FKTableName
[Entrada] Nombre de la tabla de claves extranjeras. FKTableName no puede contener un patrón de búsqueda en cadenas.

Si el atributo de la sentencia SQL_ATTR_METADATA_ID se establece como SQL_TRUE, FKTableName se trata como un identificador y su caso no es significativo. Si es SQL_FALSE, FKTableName es un argumento ordinario; Se trata literalmente, y su caso es significativo.

NombreLongitud6
[Entrada] Longitud de *FKTableName, en caracteres.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR o SQL_INVALID_HANDLE.

Diagnostics

Cuando SQLForeignKeys devuelve SQL_ERROR o SQL_SUCCESS_WITH_INFO, se puede obtener un valor SQLSTATE asociado llamando a SQLGetDiagRec con un HandleType de SQL_HANDLE_STMT y un Handle de StatementHandle. La siguiente tabla enumera los valores de SQLSTATE que normalmente devuelven SQLForeignKeys y explica cada uno en el contexto de esta función; la notación "(DM)" precede a las descripciones de los SQLSTATE devueltas por el Driver Manager. El código de retorno asociado a cada valor SQLSTATE es SQL_ERROR, a menos que se indique lo contrario.

SQLSTATE Error Description
01000 Advertencia general Mensaje informativo específico del controlador. (Function devuelve SQL_SUCCESS_WITH_INFO).
08S01 Error de vínculo de comunicación Se produjo un error en el vínculo de comunicación entre el controlador y el origen de datos al que se conectó el controlador antes de que la función completara el procesamiento.
24000 Estado de cursor no válido Había un cursor abierto en el StatementHandle, y se había llamado a SQLFetch o SQLFetchScroll . El Administrador de controladores devuelve este error si SQLFetch o SQLFetchScroll no ha devuelto SQL_NO_DATA y el controlador devuelve si SQLFetch o SQLFetchScroll ha devuelto SQL_NO_DATA.

Había un cursor abierto en el HandleStatement, pero no se había llamado a SQLFetch ni SQLFetchScroll .
40001 Error de serialización La transacción se revierte debido a un interbloqueo de recursos con otra transacción.
40003 Finalización de instrucciones desconocida Error en la conexión asociada durante la ejecución de esta función y no se puede determinar el estado de la transacción.
HY000 Error genérico Se produjo un error para el que no había ningún SQLSTATE específico y para el que no se definió SQLSTATE específico de la implementación. El mensaje de error devuelto por SQLGetDiagRec en el búfer *MessageText describe el error y su causa.
HY001 Error de asignación de memoria El controlador no pudo asignar memoria necesaria para admitir la ejecución o finalización de la función.
HY008 Operación cancelada El procesamiento asincrónico se ha habilitado para StatementHandle. Se llamaba a la función y, antes de que completara su ejecución, se llamaba a SQLCancel o SQLCancelHandle en el StatementHandle, y luego la función se llamaba de nuevo en el StatementHandle.

Se llamó a la función y antes de completar la ejecución, se llamó a SQLCancel o SQLCancelHandle en statementHandle desde un subproceso diferente en una aplicación multiproceso.
HY009 Uso no válido del puntero nulo (DM) Los argumentos PKTableName y FKTableName eran ambos punteros nulos.

El atributo de SQL_ATTR_METADATA_ID se estableció en SQL_TRUE, el argumento FKCatalogName o PKCatalogName era un puntero nulo, y el SQL_CATALOG_NAME InfoType devuelve que los nombres de catálogo están soportados.

(DM) El atributo de la sentencia SQL_ATTR_METADATA_ID se estableció en SQL_TRUE, y el argumento FKSchemaName, PKSchemaName, FKTableName o PKTableName era un puntero nulo.
HY010 Error de secuencia de funciones (DM) Se llamó a una función de ejecución asincrónica para el identificador de conexión asociado a StatementHandle. Esta función asíncrona seguía ejecutándose cuando se llamaba a la función SQLForeignKeys.

(DM) SQLExecute, SQLExecDirect o SQLMoreResults se llamó a para statementHandle y devolvió SQL_PARAM_DATA_AVAILABLE. Se llamó a esta función antes de recuperar los datos para todos los parámetros transmitidos.

(DM) Se llamó a una función que ejecuta de forma asincrónica (no esta) para statementHandle y todavía se estaba ejecutando cuando se llamó a esta función.

(DM) SE llamó a SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos para el statementHandle y devolvió SQL_NEED_DATA. Se llamó a esta función antes de enviar datos para todos los parámetros o columnas de datos en ejecución.
HY013 Error de administración de memoria No se pudo procesar la llamada de función porque no se pudo tener acceso a los objetos de memoria subyacentes, posiblemente debido a condiciones de memoria baja.
HY090 Longitud de búfer o cadena no válida (DM) El valor de uno de los argumentos de longitud del nombre era menor que 0 pero no igual a SQL_NTS.
El valor de uno de los argumentos de longitud de nombre superó el valor de longitud máxima para el nombre correspondiente. (Véase "Comentarios.")
HY117 La conexión se suspende debido al estado de transacción desconocido. Solo se permiten las funciones de desconexión y solo lectura. (DM) Para obtener más información sobre el estado suspendido, vea Función SQLEndTran.
HYC00 Característica opcional no implementada Se especificó un nombre de catálogo, y el controlador o fuente de datos no soporta catálogos.

Se especificó un nombre de esquema, y el controlador o la fuente de datos no soporta esquemas.
La combinación de la configuración actual de la SQL_ATTR_CONCURRENCY y los atributos de instrucción SQL_ATTR_CURSOR_TYPE no se admiten en el controlador o el origen de datos.

El atributo de instrucción SQL_ATTR_USE_BOOKMARKS se estableció en SQL_UB_VARIABLE y el atributo de instrucción SQL_ATTR_CURSOR_TYPE se estableció en un tipo de cursor para el que el controlador no admite marcadores.
HYT00 Se ha agotado el tiempo de espera El período de tiempo de espera de la consulta expiró antes de que el origen de datos devolva el conjunto de resultados. El período de tiempo de espera se establece mediante SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 Se ha agotado el tiempo de espera de la conexión. El período de tiempo de espera de conexión expiró antes de que el origen de datos respondiera a la solicitud. El período de tiempo de espera de conexión se establece a través de SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 El controlador no admite esta función (DM) El controlador asociado a StatementHandle no admite la función .
IM017 El sondeo está deshabilitado en modo de notificación asincrónica Cada vez que se usa el modelo de notificación, el sondeo está deshabilitado.
IM018 No se ha llamado a SQLCompleteAsync para completar la operación asincrónica anterior en este identificador. Si la llamada de función anterior en el identificador devuelve SQL_STILL_EXECUTING y si el modo de notificación está habilitado, se debe llamar a SQLCompleteAsync en el identificador para realizar el procesamiento posterior y completar la operación.

Comentarios

Para información sobre cómo podría usarse la información devuelta por esta función, véase Usos de los datos de catálogo.

Si *PKTableName contiene un nombre de tabla, SQLForeignKeys devuelve un conjunto de resultados que contiene la clave primaria de la tabla especificada y todas las claves externas que se refieren a ella. La lista de claves foráneas en otras tablas no incluye claves foráneas que apunten a restricciones únicas en la tabla especificada.

Si *FKTableName contiene un nombre de tabla, SQLForeignKeys devuelve un conjunto de resultados que contiene todas las claves externas en la tabla especificada que apuntan a claves primarias en otras tablas, y las claves primarias en las otras tablas a las que se refieren. La lista de claves foráneas en la tabla especificada no contiene claves foráneas que se refieran a restricciones únicas en otras tablas.

Si tanto *PKTableName como *FKTableName contienen nombres de tablas, SQLForeignKeys devuelve las claves externas en la tabla especificadas en *FKTableName que se refieren a la clave primaria de la tabla especificada en *PKTableName. Esto debería ser como mucho una llave.

Note

Para obtener más información sobre el uso general, los argumentos y los datos devueltos de funciones de catálogo ODBC, vea Funciones de catálogo.

SQLForeignKeys devuelve los resultados como un conjunto estándar de resultados. Si se solicitan las claves foráneas asociadas a una clave primaria, el conjunto de resultados se ordena por FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME y KEY_SEQ. Si se solicitan las claves primarias asociadas a una clave foránea, el conjunto de resultados se ordena por PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME y KEY_SEQ. En la tabla siguiente se enumeran las columnas del conjunto de resultados.

Las longitudes de las columnas VARCHAR no se muestran en la tabla; Las longitudes reales dependen de la fuente de datos. Para determinar la longitud real de las columnas PKTABLE_CAT o FKTABLE_CAT, PKTABLE_SCHEM o FKTABLE_SCHEM, PKTABLE_NAME o FKTABLE_NAME, y PKCOLUMN_NAME o FKCOLUMN_NAME columnas, una aplicación puede llamar a SQLGetInfo con las opciones SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN y SQL_MAX_COLUMN_NAME_LEN.

Las siguientes columnas han sido renombradas como ODBC 3*.x.* Los cambios en el nombre de las columnas no afectan la compatibilidad hacia atrás porque las aplicaciones se vinculan por número de columna.

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

En la tabla siguiente se enumeran las columnas del conjunto de resultados. El conductor puede definir columnas adicionales más allá de la columna 14 (OBSERVACIONES). Una aplicación debe obtener acceso a columnas específicas del controlador contando desde el final del conjunto de resultados en lugar de especificar una posición ordinal explícita. Para obtener más información, vea Datos devueltos por funciones de catálogo.

Nombre de la columna Número de columna Tipo de dato Comentarios
PKTABLE_CAT (ODBC 1.0) 1 Varchar Nombre del catálogo de tabla de claves primaria; NULL si no es aplicable a la fuente de datos. Si un controlador soporta catálogos para algunas tablas pero no para otras, como cuando el controlador recupera datos de diferentes SGBD, devuelve una cadena vacía ("") para aquellas tablas que no tienen catálogos.
PKTABLE_SCHEM (ODBC 1.0) 2 Varchar Nombre del esquema de la tabla de claves primaria; NULL si no es aplicable a la fuente de datos. Si un controlador soporta esquemas para algunas tablas pero no para otras, como cuando recupera datos de diferentes SGBD, devuelve una cadena vacía ("") para aquellas tablas que no tienen esquemas.
PKTABLE_NAME (ODBC 1.0) 3 Varchar no NULL Nombre de la tabla de clave principal.
PKCOLUMN_NAME (ODBC 1.0) 4 Varchar no NULL Nombre de la columna clave principal. El controlador devuelve una cadena vacía para una columna que no tiene nombre.
FKTABLE_CAT (ODBC 1.0) 5 Varchar Nombre del catálogo de tabla de claves extranjeras; NULL si no es aplicable a la fuente de datos. Si un controlador soporta catálogos para algunas tablas pero no para otras, como cuando el controlador recupera datos de diferentes SGBD, devuelve una cadena vacía ("") para aquellas tablas que no tienen catálogos.
FKTABLE_SCHEM (ODBC 1.0) 6 Varchar Nombre del esquema de la tabla de clave extranjera; NULL si no es aplicable a la fuente de datos. Si un controlador soporta esquemas para algunas tablas pero no para otras, como cuando recupera datos de diferentes SGBD, devuelve una cadena vacía ("") para aquellas tablas que no tienen esquemas.
FKTABLE_NAME (ODBC 1.0) 7 Varchar no NULL Nombre de la tabla de clave externa.
FKCOLUMN_NAME (ODBC 1.0) 8 Varchar no NULL Nombre de la columna de clave extranjera. El controlador devuelve una cadena vacía para una columna que no tiene nombre.
KEY_SEQ (ODBC 1.0) 9 Smallint not NULL Número de secuencia de columna en clave (empezando por 1).
UPDATE_RULE (ODBC 1.0) 10 Smallint Acción que se aplicará a la clave externa cuando la operación SQL es UPDATE. Puede tener uno de los siguientes valores. (La tabla referenciada es la tabla que tiene la clave primaria; la tabla de referencia es la tabla que contiene la clave foránea.)

SQL_CASCADE: Cuando se actualiza la clave primaria de la tabla de referencia, también se actualiza la clave externa de la tabla de referencia.

SQL_NO_ACTION: Si una actualización de la clave primaria de la tabla referenciada causaría una "referencia colgante" en la tabla de referencia (es decir, las filas de la tabla de referencia no tendrían contrapartes en la tabla referenciada), la actualización se rechaza. Si una actualización de la clave externa de la tabla de referencia introduciría un valor que no existe como valor de la clave primaria de la tabla referenciada, la actualización se rechaza. (Esta acción es la misma que la acción SQL_RESTRICT en ODBC 2*.x*.)

SQL_SET_NULL: Cuando una o más filas de la tabla de referencia se actualizan de tal manera que uno o más componentes de la clave primaria cambian, los componentes de la clave externa en la tabla de referencia que corresponden a los componentes modificados de la clave primaria se establecen en NULL en todas las filas coincidentes de la tabla de referencia.

SQL_SET_DEFAULT: Cuando una o más filas de la tabla de referencia se actualizan de tal manera que uno o más componentes de la clave primaria cambian, los componentes de la clave externa en la tabla de referencia que corresponden a los componentes modificados de la clave primaria se establecen a los valores predeterminados aplicables en todas las filas coincidentes de la tabla de referencia.

NULL si no es aplicable a la fuente de datos.
DELETE_RULE (ODBC 1.0) 11 Smallint Acción que se aplicará a la clave externa cuando la operación SQL es DELETE. Puede tener uno de los siguientes valores. (La tabla referenciada es la tabla que tiene la clave primaria; la tabla de referencia es la tabla que contiene la clave foránea.)

SQL_CASCADE: Cuando se elimina una fila de la tabla referenciada, también se eliminan todas las filas coincidentes en las tablas de referencia.

SQL_NO_ACTION: Si eliminar una fila en la tabla referenciada causaría una "referencia colgante" en la tabla de referencia (es decir, las filas de la tabla de referencia no tendrían contrapartes en la tabla referenciada), la actualización se rechaza. (Esta acción es la misma que la acción SQL_RESTRICT en ODBC 2*.x*.)

SQL_SET_NULL: Cuando se eliminan una o más filas de la tabla referenciada, cada componente de la clave externa de la tabla de referencia se establece en NULL en todas las filas coincidentes de la tabla de referencia.

SQL_SET_DEFAULT: Cuando se eliminan una o más filas de la tabla referenciada, cada componente de la clave externa de la tabla de referencia se establece al valor predeterminado correspondiente en todas las filas correspondientes de la tabla de referencia.

NULL si no es aplicable a la fuente de datos.
FK_NAME (ODBC 2.0) 12 Varchar Nombre clave extranjero. NULL si no es aplicable a la fuente de datos.
PK_NAME (ODBC 2.0) 13 Varchar Nombre clave principal. NULL si no es aplicable a la fuente de datos.
DIFERENCIA (ODBC 3.0) 14 Smallint SQL_INITIALLY_DEFERRED, SQL_INITIALLY_IMMEDIATE, SQL_NOT_DEFERRABLE.

Ejemplo de código

Como se ilustra en la siguiente tabla, este ejemplo utiliza tres tablas, denominadas ORDERS, LINES y CUSTOMERS.

PEDIDOS LÍNEAS CLIENTES
ORDERID ORDERID CUSTID
CUSTID LÍNEAS NAME
FECHA DE APERTURA PARTID DIRECCIÓN
VENDEDOR CANTIDAD TELÉFONO
STATUS

En la tabla de PEDIDOS, CUSTID identifica al cliente al que se ha realizado la venta. Es una clave externa que se refiere a CUSTID en la tabla CLIENTES.

En la tabla LINES, ORDERID identifica la orden de venta con la que está asociada la partida. Es una clave externa que se refiere a ORDERID en la tabla ORDERS.

Este ejemplo llama a SQLPrimaryKeys para obtener la clave primaria de la tabla ORDERS. El conjunto de resultados tendrá una fila; Las columnas significativas se muestran en la siguiente tabla.

NOMBRE_DE_TABLA nombre de columna KEY_SEQ
PEDIDOS ORDERID 1

A continuación, el ejemplo llama a SQLForeignKeys para obtener las claves externas en otras tablas que hacen referencia a la clave primaria de la tabla ORDERS. El conjunto de resultados tendrá una fila; Las columnas significativas se muestran en la siguiente tabla.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
PEDIDOS CUSTID LÍNEAS CUSTID 1

Finalmente, el ejemplo llama a SQLForeignKeys para obtener las claves externas en la tabla ORDERS que se refieren a las claves primarias de otras tablas. El conjunto de resultados tendrá una fila; Las columnas significativas se muestran en la siguiente tabla.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
CLIENTES CUSTID PEDIDOS 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);  
Para obtener información sobre Vea
Enlazar un búfer a una columna de un conjunto de resultados Función SQLBindCol
Cancelación del procesamiento de instrucciones Función SQLCancel
Obtención de una sola fila o bloque de datos en dirección solo directa Función SQLFetch
Capturar un bloque de datos o desplazarse por un conjunto de resultados Función SQLFetchScroll
Devolver las columnas de una clave principal Función SQLPrimaryKeys
Devolución de estadísticas e índices de tablas Función SQLStatistics

Véase también

Referencia de la API ODBC
Archivos de encabezado de ODBC