Condividi tramite


Funzione SQLForeignKeys

Conformità
Versione introdotta: Conformità agli standard ODBC 1.0: ODBC

Riepilogo
SQLForeignKeys può restituire:

  • Elenco di chiavi esterne nella tabella specificata (colonne nella tabella specificata che fanno riferimento alle chiavi primarie in altre tabelle).

  • Elenco di chiavi esterne in altre tabelle che fanno riferimento alla chiave primaria nella tabella specificata.

Il driver restituisce ogni elenco come set di risultati nell'istruzione specificata.

Sintassi

  
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);  

Argomenti

StatementHandle
[Input] Handle di istruzione.

PKCatalogName
[Input] Nome del catalogo della tabella chiave primaria. Se un driver supporta cataloghi per alcune tabelle ma non per altri, ad esempio quando il driver recupera i dati da diversi DBMS, una stringa vuota ("") indica le tabelle che non dispongono di cataloghi. PKCatalogName non può contenere un criterio di ricerca di stringhe.

Se l'attributo dell'istruzione SQL_ATTR_METADATA_ID è impostato su SQL_TRUE, PKCatalogName viene considerato come identificatore e il relativo case non è significativo. Se è SQL_FALSE, PKCatalogName è un argomento ordinario; viene trattato letteralmente e il relativo case è significativo. Per altre informazioni, vedere Argomenti in Funzioni del catalogo.

NameLength1
[Input] Lunghezza di *PKCatalogName, in caratteri.

PKSchemaName
[Input] Nome dello schema della tabella della chiave primaria. Se un driver supporta gli schemi per alcune tabelle ma non per altri, ad esempio quando il driver recupera i dati da diversi DBMS, una stringa vuota ("") indica le tabelle che non dispongono di schemi. PKSchemaName non può contenere un criterio di ricerca di stringhe.

Se l'attributo dell'istruzione SQL_ATTR_METADATA_ID è impostato su SQL_TRUE, PKSchemaName viene considerato come identificatore e il relativo case non è significativo. Se è SQL_FALSE, PKSchemaName è un argomento ordinario; viene trattato letteralmente e il relativo caso è significativo.

NameLength2
[Input] Lunghezza di *PKSchemaName, in caratteri.

PKTableName
[Input] Nome tabella chiave primaria. PKTableName non può contenere un criterio di ricerca di stringhe.

Se l'attributo dell'istruzione SQL_ATTR_METADATA_ID è impostato su SQL_TRUE, PKTableName viene considerato come identificatore e il relativo case non è significativo. Se è SQL_FALSE, PKTableName è un argomento ordinario; viene trattato letteralmente e il relativo case è significativo.

NameLength3
[Input] Lunghezza di *PKTableName, in caratteri.

FKCatalogName
[Input] Nome del catalogo della tabella di chiavi esterne. Se un driver supporta cataloghi per alcune tabelle ma non per altri, ad esempio quando il driver recupera i dati da diversi DBMS, una stringa vuota ("") indica le tabelle che non dispongono di cataloghi. FKCatalogName non può contenere un criterio di ricerca di stringhe.

Se l'attributo dell'istruzione SQL_ATTR_METADATA_ID è impostato su SQL_TRUE, FKCatalogName viene considerato come identificatore e il relativo case non è significativo. Se è SQL_FALSE, FKCatalogName è un argomento comune; viene trattato letteralmente e il relativo caso è significativo.

NameLength4
[Input] Lunghezza di *FKCatalogName, in caratteri.

FKSchemaName
[Input] Nome dello schema della tabella della chiave esterna. Se un driver supporta gli schemi per alcune tabelle ma non per altri, ad esempio quando il driver recupera i dati da diversi DBMS, una stringa vuota ("") indica le tabelle che non dispongono di schemi. FKSchemaName non può contenere un criterio di ricerca di stringhe.

Se l'attributo dell'istruzione SQL_ATTR_METADATA_ID è impostato su SQL_TRUE, FKSchemaName viene considerato come identificatore e il relativo case non è significativo. Se è SQL_FALSE, FKSchemaName è un argomento ordinario; viene trattato letteralmente e il relativo caso è significativo.

NameLength5
[Input] Lunghezza di *FKSchemaName, in caratteri.

FKTableName
[Input] Nome tabella chiave esterna. FKTableName non può contenere un criterio di ricerca di stringhe.

Se l'attributo dell'istruzione SQL_ATTR_METADATA_ID è impostato su SQL_TRUE, FKTableName viene considerato come identificatore e il relativo case non è significativo. Se è SQL_FALSE, FKTableName è un argomento ordinario; viene trattato letteralmente e il relativo caso è significativo.

NameLength6
[Input] Lunghezza di *FKTableName, in caratteri.

Resi

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR o SQL_INVALID_HANDLE.

Diagnostica

Quando SQLForeignKeys restituisce SQL_ERROR o SQL_SUCCESS_WITH_INFO, è possibile ottenere un valore SQLSTATE associato chiamando SQLGetDiagRec con handleTypedi SQL_HANDLE_STMT e handle di StatementHandle. La tabella seguente elenca i valori SQLSTATE restituiti in genere da SQLForeignKeys e spiega ognuno nel contesto di questa funzione. La notazione "(DM)" precede le descrizioni di SQLSTATEs restituite da Gestione driver. Il codice restituito associato a ogni valore SQLSTATE è SQL_ERROR, a meno che non sia specificato diversamente.

SQLSTATE Errore Descrizione
01000 Avviso generale Messaggio informativo specifico del driver. (La funzione restituisce SQL_SUCCESS_WITH_INFO.
08S01 Errore del collegamento di comunicazione Collegamento di comunicazione tra il driver e l'origine dati a cui è stato connesso il driver non è riuscito prima del completamento dell'elaborazione della funzione.
24000 Stato del cursore non valido È stato aperto un cursore in StatementHandle e è stato chiamato SQLFetch o SQLFetchScroll. Questo errore viene restituito da Gestione driver se SQLFetch o SQLFetchScroll non ha restituito SQL_NO_DATA e viene restituito dal driver se SQLFetch o SQLFetchScroll ha restituito SQL_NO_DATA.

Un cursore è stato aperto in StatementHandle, ma SQLFetch o SQLFetchScroll non è stato chiamato.
40001 Errore di serializzazione È stato eseguito il rollback della transazione a causa di un deadlock della risorsa con un'altra transazione.
40003 Completamento istruzione sconosciuto La connessione associata non è riuscita durante l'esecuzione di questa funzione e non è possibile determinare lo stato della transazione.
HY000 Errore generale: Si è verificato un errore per il quale non è stato specificato SQLSTATE e per il quale non è stato definito alcun SQLSTATE specifico dell'implementazione. Il messaggio di errore restituito da SQLGetDiagRec nel buffer *MessageText descrive l'errore e la relativa causa.
HY001 Errore di allocazione della memoria Il driver non è riuscito ad allocare memoria necessaria per supportare l'esecuzione o il completamento della funzione.
HY008 Operazione annullata L'elaborazione asincrona è stata abilitata per StatementHandle. La funzione è stata chiamata e prima di completare l'esecuzione, SQLCancel o SQLCancelHandle è stata chiamata su StatementHandle e quindi la funzione è stata chiamata nuovamente in StatementHandle.

La funzione è stata chiamata e prima del completamento dell'esecuzione, SQLCancel o SQLCancelHandle è stato chiamato su StatementHandle da un thread diverso in un'applicazione multithread.
HY009 Uso non valido del puntatore Null (DM) Gli argomenti PKTableName e FKTableName erano entrambi puntatori Null.

L'attributo dell'istruzione SQL_ATTR_METADATA_ID è stato impostato su SQL_TRUE, l'argomento FKCatalogName o PKCatalogName è un puntatore Null e l'SQL_CATALOG_NAME InfoType restituisce che i nomi di catalogo sono supportati.

(DM) L'attributo dell'istruzione SQL_ATTR_METADATA_ID è stato impostato su SQL_TRUE e l'argomento FKSchemaName, PKSchemaName, FKTableName o PKTableName è un puntatore Null.
HY010 Errore della sequenza di funzioni (DM) È stata chiamata una funzione in esecuzione asincrona per l'handle di connessione associato a StatementHandle. Questa funzione asincrona era ancora in esecuzione quando è stata chiamata la funzione SQLForeignKeys.

(DM) SQLExecute, SQLExecDirect o SQLMoreResults è stato chiamato per StatementHandle e restituito SQL_PARAM_DATA_AVAILABLE. Questa funzione è stata chiamata prima del recupero dei dati per tutti i parametri trasmessi.

(DM) Una funzione in esecuzione asincrona (non questa) è stata chiamata per StatementHandle ed è ancora in esecuzione quando questa funzione è stata chiamata.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos è stato chiamato per StatementHandle e restituito SQL_NEED_DATA. Questa funzione è stata chiamata prima dell'invio dei dati per tutti i parametri o le colonne data-at-execution.
HY013 Errore di gestione della memoria Impossibile elaborare la chiamata di funzione perché non è stato possibile accedere agli oggetti di memoria sottostanti, probabilmente a causa di condizioni di memoria insufficiente.
HY090 Lunghezza della stringa o del buffer non valida (DM) Il valore di uno degli argomenti di lunghezza del nome è minore di 0 ma non uguale a SQL_NTS.
Il valore di uno degli argomenti lunghezza nome ha superato il valore di lunghezza massima per il nome corrispondente. (Vedere "Comments.")
HY117 La connessione viene sospesa a causa dello stato sconosciuto della transazione. Sono consentite solo funzioni disconnesse e di sola lettura. (DM) Per altre informazioni sullo stato sospeso, vedere Funzione SQLEndTran.
HYC00 Funzionalità facoltativa non implementata È stato specificato un nome di catalogo e il driver o l'origine dati non supporta i cataloghi.

È stato specificato un nome di schema e il driver o l'origine dati non supporta gli schemi.
La combinazione delle impostazioni correnti degli attributi delle istruzioni SQL_ATTR_CONCURRENCY e SQL_ATTR_CURSOR_TYPE non è supportata dal driver o dall'origine dati.

L'attributo di istruzione SQL_ATTR_USE_BOOKMARKS è stato impostato su SQL_UB_VARIABLE e l'attributo dell'istruzione SQL_ATTR_CURSOR_TYPE è stato impostato su un tipo di cursore per cui il driver non supporta i segnalibri.
HYT00 Timeout scaduto Periodo di timeout della query scaduto prima che l'origine dati restituisca il set di risultati. Il periodo di timeout viene impostato tramite SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 Il timeout della connessione è scaduto Periodo di timeout della connessione scaduto prima che l'origine dati rispondesse alla richiesta. Il periodo di timeout della connessione viene impostato tramite SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Il driver non supporta questa funzione (DM) Il driver associato a StatementHandle non supporta la funzione.
IM017 Il polling è disabilitato in modalità di notifica asincrona Ogni volta che viene usato il modello di notifica, il polling è disabilitato.
IM018 SQLCompleteAsync non è stato chiamato per completare l'operazione asincrona precedente su questo handle. Se la chiamata di funzione precedente sull'handle restituisce SQL_STILL_EXECUTING e se la modalità di notifica è abilitata, è necessario chiamare SQLCompleteAsync sull'handle per eseguire la post-elaborazione e completare l'operazione.

Commenti

Per informazioni su come usare le informazioni restituite da questa funzione, vedere Uses of Catalog Data.For information about how the information returned by this function might be used, see Uses of Catalog Data.

Se *PKTableName contiene un nome di tabella, SQLForeignKeys restituisce un set di risultati contenente la chiave primaria della tabella specificata e tutte le chiavi esterne che vi fanno riferimento. L'elenco di chiavi esterne in altre tabelle non include chiavi esterne che puntano a vincoli univoci nella tabella specificata.

Se *FKTableName contiene un nome di tabella, SQLForeignKeys restituisce un set di risultati contenente tutte le chiavi esterne nella tabella specificata che puntano alle chiavi primarie in altre tabelle e le chiavi primarie nelle altre tabelle a cui fanno riferimento. L'elenco di chiavi esterne nella tabella specificata non contiene chiavi esterne che fanno riferimento a vincoli univoci in altre tabelle.

Se *PKTableName e *FKTableName contengono nomi di tabella, SQLForeignKeys restituisce le chiavi esterne nella tabella specificata in *FKTableName che fanno riferimento alla chiave primaria della tabella specificata in *PKTableName. Dovrebbe trattarsi di una chiave al massimo.

Nota

Per altre informazioni sull'utilizzo generale, gli argomenti e i dati restituiti delle funzioni del catalogo ODBC, vedere Funzioni del catalogo.

SQLForeignKeys restituisce i risultati come set di risultati standard. Se vengono richieste le chiavi esterne associate a una chiave primaria, il set di risultati viene ordinato in base a FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME e KEY_SEQ. Se vengono richieste le chiavi primarie associate a una chiave esterna, il set di risultati viene ordinato in base a PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME e KEY_SEQ. Nella tabella seguente sono elencate le colonne nel set di risultati.

Le lunghezze delle colonne VARCHAR non vengono visualizzate nella tabella; le lunghezze effettive dipendono dall'origine dati. Per determinare le lunghezze effettive delle colonne PKTABLE_CAT o FKTABLE_CAT, PKTABLE_SCHEM o FKTABLE_SCHEM, PKTABLE_NAME o FKTABLE_NAME e PKCOLUMN_NAME o FKCOLUMN_NAME, un'applicazione può chiamare SQLGetInfo con le opzioni di SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN e SQL_MAX_COLUMN_NAME_LEN.

Le colonne seguenti sono state rinominate per ODBC 3*.x.* Le modifiche apportate al nome della colonna non influiscono sulla compatibilità con le versioni precedenti perché le applicazioni si associano in base al numero di colonna.

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

Nella tabella seguente sono elencate le colonne nel set di risultati. Le colonne aggiuntive successive alla colonna 14 (REMARKS) possono essere definite dal driver. Un'applicazione deve ottenere l'accesso alle colonne specifiche del driver con il conteggio dalla fine del set di risultati invece di specificare una posizione ordinale esplicita. Per altre informazioni, vedere Dati restituiti dalle funzioni del catalogo.

Nome colonna Column number Tipo di dati Commenti
PKTABLE_CAT (ODBC 1.0) 1 Varchar Nome catalogo tabella chiave primaria; NULL se non applicabile all'origine dati. Se un driver supporta cataloghi per alcune tabelle ma non per altri, ad esempio quando il driver recupera i dati da diversi DBMS, restituisce una stringa vuota ("") per le tabelle che non dispongono di cataloghi.
PKTABLE_SCHEM (ODBC 1.0) 2 Varchar Nome dello schema della tabella della chiave primaria; NULL se non applicabile all'origine dati. Se un driver supporta schemi per alcune tabelle ma non per altri, ad esempio quando il driver recupera i dati da diversi DBMS, restituisce una stringa vuota ("") per le tabelle che non dispongono di schemi.
PKTABLE_NAME (ODBC 1.0) 3 Varchar non NULL Nome tabella chiave primaria.
PKCOLUMN_NAME (ODBC 1.0) 4 Varchar non NULL Nome colonna chiave primaria. Il driver restituisce una stringa vuota per una colonna che non ha un nome.
FKTABLE_CAT (ODBC 1.0) 5 Varchar Nome catalogo tabella chiave esterna; NULL se non applicabile all'origine dati. Se un driver supporta cataloghi per alcune tabelle ma non per altri, ad esempio quando il driver recupera i dati da diversi DBMS, restituisce una stringa vuota ("") per le tabelle che non dispongono di cataloghi.
FKTABLE_SCHEM (ODBC 1.0) 6 Varchar Nome schema tabella chiave esterna; NULL se non applicabile all'origine dati. Se un driver supporta schemi per alcune tabelle ma non per altri, ad esempio quando il driver recupera i dati da diversi DBMS, restituisce una stringa vuota ("") per le tabelle che non dispongono di schemi.
FKTABLE_NAME (ODBC 1.0) 7 Varchar non NULL Nome tabella chiave esterna.
FKCOLUMN_NAME (ODBC 1.0) 8 Varchar non NULL Nome colonna chiave esterna. Il driver restituisce una stringa vuota per una colonna che non ha un nome.
KEY_SEQ (ODBC 1.0) 9 Smallint non NULL Numero di sequenza di colonna nella chiave (a partire da 1).
UPDATE_RULE (ODBC 1.0) 10 Smallint Azione da applicare alla chiave esterna quando l'operazione SQL è UPDATE. Può avere uno dei valori seguenti. La tabella a cui si fa riferimento è la tabella con la chiave primaria. La tabella di riferimento è la tabella con la chiave esterna.

SQL_CASCADE: quando viene aggiornata la chiave primaria della tabella a cui si fa riferimento, viene aggiornata anche la chiave esterna della tabella di riferimento.

SQL_NO_ACTION: se un aggiornamento della chiave primaria della tabella a cui si fa riferimento provocherebbe un "riferimento incerto" nella tabella di riferimento( ovvero le righe nella tabella di riferimento non avrebbero alcuna controparte nella tabella a cui si fa riferimento), l'aggiornamento viene rifiutato. Se un aggiornamento della chiave esterna della tabella di riferimento introdurrebbe un valore che non esiste come valore della chiave primaria della tabella a cui si fa riferimento, l'aggiornamento viene rifiutato. Questa azione è la stessa dell'azione SQL_RESTRICT in ODBC 2*.x*.

SQL_SET_NULL: quando una o più righe nella tabella a cui si fa riferimento vengono aggiornate in modo che uno o più componenti della chiave primaria vengano modificati, i componenti della chiave esterna nella tabella di riferimento che corrispondono ai componenti modificati della chiave primaria vengono impostati su NULL in tutte le righe corrispondenti della tabella di riferimento.

SQL_SET_DEFAULT: quando una o più righe nella tabella a cui viene fatto riferimento vengono aggiornate in modo che uno o più componenti della chiave primaria vengano modificati, i componenti della chiave esterna nella tabella di riferimento che corrispondono ai componenti modificati della chiave primaria vengono impostati sui valori predefiniti applicabili in tutte le righe corrispondenti della tabella di riferimento.

NULL se non applicabile all'origine dati.
DELETE_RULE (ODBC 1.0) 11 Smallint Azione da applicare alla chiave esterna quando l'operazione SQL è DELETE. Può avere uno dei valori seguenti. La tabella a cui si fa riferimento è la tabella con la chiave primaria. La tabella di riferimento è la tabella con la chiave esterna.

SQL_CASCADE: quando viene eliminata una riga nella tabella di riferimento, vengono eliminate anche tutte le righe corrispondenti nelle tabelle di riferimento.

SQL_NO_ACTION: se un'eliminazione di una riga nella tabella a cui si fa riferimento provocherebbe un "riferimento incerto" nella tabella di riferimento, ovvero le righe nella tabella di riferimento non avrebbero alcuna controparte nella tabella di riferimento, l'aggiornamento viene rifiutato. Questa azione è la stessa dell'azione SQL_RESTRICT in ODBC 2*.x*.

SQL_SET_NULL: quando una o più righe nella tabella a cui si fa riferimento vengono eliminate, ogni componente della chiave esterna della tabella di riferimento è impostato su NULL in tutte le righe corrispondenti della tabella di riferimento.

SQL_SET_DEFAULT: quando vengono eliminate una o più righe nella tabella a cui si fa riferimento, ogni componente della chiave esterna della tabella di riferimento viene impostato sul valore predefinito applicabile in tutte le righe corrispondenti della tabella di riferimento.

NULL se non applicabile all'origine dati.
FK_NAME (ODBC 2.0) 12 Varchar Nome chiave esterna. NULL se non applicabile all'origine dati.
PK_NAME (ODBC 2.0) 13 Varchar Nome chiave primaria. NULL se non applicabile all'origine dati.
DEFERRABILITY (ODBC 3.0) 14 Smallint SQL_INITIALLY_DEFERRED, SQL_INITIALLY_IMMEDIATE, SQL_NOT_DEFERRABLE.

Esempio di codice

Come illustrato nella tabella seguente, questo esempio usa tre tabelle, denominate ORDERS, LINES e CUSTOMERS.

ORDERS LINEE CLIENTI
ORDERID ORDERID CUSTID
CUSTID LINEE NOME
OPENDATE PARTID INDIRIZZO
VENDITORE QUANTITÀ PHONE
STATO

Nella tabella ORDERS CUSTID identifica il cliente a cui è stata effettuata la vendita. Si tratta di una chiave esterna che fa riferimento a CUSTID nella tabella CUSTOMERS.

Nella tabella LINES ORDERID identifica l'ordine di vendita a cui è associato l'elemento della riga. Si tratta di una chiave esterna che fa riferimento a ORDERID nella tabella ORDERS.

Questo esempio chiama SQLPrimaryKeys per ottenere la chiave primaria della tabella ORDERS. Il set di risultati avrà una riga; Le colonne significative sono illustrate nella tabella seguente.

TABLE_NAME COLUMN_NAME KEY_SEQ
ORDERS ORDERID 1

L'esempio chiama quindi SQLForeignKeys per ottenere le chiavi esterne in altre tabelle che fanno riferimento alla chiave primaria della tabella ORDERS. Il set di risultati avrà una riga; Le colonne significative sono illustrate nella tabella seguente.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
ORDERS CUSTID LINEE CUSTID 1

Infine, l'esempio chiama SQLForeignKeys per ottenere le chiavi esterne nella tabella ORDERS che fanno riferimento alle chiavi primarie di altre tabelle. Il set di risultati avrà una riga; Le colonne significative sono illustrate nella tabella seguente.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
CLIENTI 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);  
Per informazioni su Vedere
Associazione di un buffer a una colonna in un set di risultati Funzione SQLBindCol
Annullamento dell'elaborazione delle istruzioni Funzione SQLCancel
Recupero di una singola riga o di un blocco di dati in una direzione forward-only Funzione SQLFetch
Recupero di un blocco di dati o scorrimento di un set di risultati Funzione SQLFetchScroll
Restituzione delle colonne di una chiave primaria Funzione SQLPrimaryKeys
Restituzione di statistiche e indici di tabella Funzione SQLStatistics

Vedi anche

Riferimento API ODBC
File di intestazione ODBC