Bagikan melalui


Fungsi SQLForeignKeys

Kesesuaian
Versi Diperkenalkan: Kepatuhan Standar ODBC 1.0: ODBC

Ringkasan
SQLForeignKeys dapat mengembalikan:

  • Daftar kunci asing dalam tabel yang ditentukan (kolom dalam tabel yang ditentukan yang merujuk ke kunci primer dalam tabel lain).

  • Daftar kunci asing dalam tabel lain yang merujuk ke kunci primer dalam tabel yang ditentukan.

Driver mengembalikan setiap daftar sebagai hasil yang ditetapkan pada pernyataan yang ditentukan.

Sintaks

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

Argumen

StatementHandle
[Input] Handel pernyataan.

PKCatalogName
[Input] Nama katalog tabel kunci primer. Jika driver mendukung katalog untuk beberapa tabel tetapi tidak untuk yang lain, seperti ketika driver mengambil data dari DBMS yang berbeda, string kosong ("") menunjukkan tabel yang tidak memiliki katalog. PKCatalogName tidak boleh berisi pola pencarian string.

Jika atribut pernyataan SQL_ATTR_METADATA_ID diatur ke SQL_TRUE, PKCatalogName diperlakukan sebagai pengidentifikasi dan kasusnya tidak signifikan. Jika SQL_FALSE, PKCatalogName adalah argumen biasa; itu diperlakukan secara harfiah, dan kasusnya signifikan. Untuk informasi selengkapnya, lihat Argumen di Fungsi Katalog.

NameLength1
[Input] Panjang *PKCatalogName, dalam karakter.

PKSchemaName
[Input] Nama skema tabel kunci primer. Jika driver mendukung skema untuk beberapa tabel tetapi tidak untuk yang lain, seperti ketika driver mengambil data dari DBMS yang berbeda, string kosong ("") menunjukkan tabel yang tidak memiliki skema. PKSchemaName tidak boleh berisi pola pencarian string.

Jika atribut pernyataan SQL_ATTR_METADATA_ID diatur ke SQL_TRUE, PKSchemaName diperlakukan sebagai pengidentifikasi dan kasusnya tidak signifikan. Jika SQL_FALSE, PKSchemaName adalah argumen biasa; itu diperlakukan secara harfiah, dan kasusnya signifikan.

NameLength2
[Input] Panjang *PKSchemaName, dalam karakter.

PKTableName
[Input] Nama tabel kunci primer. PKTableName tidak boleh berisi pola pencarian string.

Jika atribut pernyataan SQL_ATTR_METADATA_ID diatur ke SQL_TRUE, PKTableName diperlakukan sebagai pengidentifikasi dan kasusnya tidak signifikan. Jika SQL_FALSE, PKTableName adalah argumen biasa; itu diperlakukan secara harfiah, dan kasusnya signifikan.

NameLength3
[Input] Panjang *PKTableName, dalam karakter.

FKCatalogName
[Input] Nama katalog tabel kunci asing. Jika driver mendukung katalog untuk beberapa tabel tetapi tidak untuk yang lain, seperti ketika driver mengambil data dari DBMS yang berbeda, string kosong ("") menunjukkan tabel yang tidak memiliki katalog. FKCatalogName tidak boleh berisi pola pencarian string.

Jika atribut pernyataan SQL_ATTR_METADATA_ID diatur ke SQL_TRUE, FKCatalogName diperlakukan sebagai pengidentifikasi dan kasusnya tidak signifikan. Jika SQL_FALSE, FKCatalogName adalah argumen biasa; diperlakukan secara harfiah, dan kasusnya signifikan.

NameLength4
[Input] Panjang *FKCatalogName, dalam karakter.

FKSchemaName
[Input] Nama skema tabel kunci asing. Jika driver mendukung skema untuk beberapa tabel tetapi tidak untuk yang lain, seperti ketika driver mengambil data dari DBMS yang berbeda, string kosong ("") menunjukkan tabel yang tidak memiliki skema. FKSchemaName tidak boleh berisi pola pencarian string.

Jika atribut pernyataan SQL_ATTR_METADATA_ID diatur ke SQL_TRUE, FKSchemaName diperlakukan sebagai pengidentifikasi dan kasusnya tidak signifikan. Jika SQL_FALSE, FKSchemaName adalah argumen biasa; itu diperlakukan secara harfiah, dan kasusnya signifikan.

NameLength5
[Input] Panjang *FKSchemaName, dalam karakter.

FKTableName
[Input] Nama tabel kunci asing. FKTableName tidak boleh berisi pola pencarian string.

Jika atribut pernyataan SQL_ATTR_METADATA_ID diatur ke SQL_TRUE, FKTableName diperlakukan sebagai pengidentifikasi dan kasusnya tidak signifikan. Jika SQL_FALSE, FKTableName adalah argumen biasa; itu diperlakukan secara harfiah, dan kasusnya signifikan.

NameLength6
[Input] Panjang *FKTableName, dalam karakter.

Kembali

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR, atau SQL_INVALID_HANDLE.

Diagnostik

Saat SQLForeignKeys mengembalikan SQL_ERROR atau SQL_SUCCESS_WITH_INFO, nilai SQLSTATE terkait dapat diperoleh dengan memanggil SQLGetDiagRec dengan HandleType SQL_HANDLE_STMT dan Handle of StatementHandle. Tabel berikut mencantumkan nilai SQLSTATE yang biasanya dikembalikan oleh SQLForeignKeys dan menjelaskan masing-masing dalam konteks fungsi ini; notasi "(DM)" mendahului deskripsi SQLSTATEs yang dikembalikan oleh Driver Manager. Kode pengembalian yang terkait dengan setiap nilai SQLSTATE SQL_ERROR, kecuali disebutkan sebaliknya.

SQLSTATE Kesalahan Deskripsi
01000 Peringatan umum Pesan informasi khusus driver. (Fungsi mengembalikan SQL_SUCCESS_WITH_INFO.)
08S01 Kegagalan tautan komunikasi Tautan komunikasi antara driver dan sumber data tempat driver tersambung gagal sebelum fungsi selesai diproses.
24000 Status kursor tidak valid Kursor terbuka pada StatementHandle, dan SQLFetch atau SQLFetchScroll telah dipanggil. Kesalahan ini dikembalikan oleh Driver Manager jika SQLFetch atau SQLFetchScroll belum mengembalikan SQL_NO_DATA, dan dikembalikan oleh driver jika SQLFetch atau SQLFetchScroll telah mengembalikan SQL_NO_DATA.

Kursor terbuka pada StatementHandle, tetapi SQLFetch atau SQLFetchScroll belum dipanggil.
40001 Kegagalan serialisasi Transaksi digulung balik karena kebuntuan sumber daya dengan transaksi lain.
40003 Penyelesaian pernyataan tidak diketahui Koneksi terkait gagal selama eksekusi fungsi ini, dan status transaksi tidak dapat ditentukan.
HY000 Kesalahan umum Terjadi kesalahan yang tidak ada SQLSTATE tertentu dan tidak ada SQLSTATE khusus implementasi yang ditentukan. Pesan kesalahan yang dikembalikan oleh SQLGetDiagRec di buffer *MessageText menjelaskan kesalahan dan penyebabnya.
HY001 Kesalahan alokasi memori Driver tidak dapat mengalokasikan memori yang diperlukan untuk mendukung eksekusi atau penyelesaian fungsi.
HY008 Operasi dibatalkan Pemrosesan asinkron diaktifkan untuk StatementHandle. Fungsi ini dipanggil, dan sebelum selesai dieksekusi, SQLCancel atau SQLCancelHandle dipanggil pada StatementHandle, dan kemudian fungsi dipanggil lagi pada StatementHandle.

Fungsi ini dipanggil, dan sebelum selesai dieksekusi, SQLCancel atau SQLCancelHandle dipanggil pada StatementHandle dari utas yang berbeda dalam aplikasi multithread.
HY009 Penggunaan pointer null tidak valid (DM) Argumen PKTableName dan FKTableName adalah penunjuk null.

Atribut pernyataan SQL_ATTR_METADATA_ID diatur ke SQL_TRUE, argumen FKCatalogName atau PKCatalogName adalah pointer null, dan SQL_CATALOG_NAME InfoType mengembalikan bahwa nama katalog didukung.

(DM) Atribut pernyataan SQL_ATTR_METADATA_ID diatur ke SQL_TRUE, dan argumen FKSchemaName, PKSchemaName, FKTableName, atau PKTableName adalah pointer null.
HY010 Kesalahan urutan fungsi (DM) Fungsi eksekusi asinkron dipanggil untuk handel koneksi yang terkait dengan StatementHandle. Fungsi asinkron ini masih dijalankan ketika fungsi SQLForeignKeys dipanggil.

(DM) SQLExecute, SQLExecDirect, atau SQLMoreResults dipanggil untuk StatementHandle dan dikembalikan SQL_PARAM_DATA_AVAILABLE. Fungsi ini dipanggil sebelum data diambil untuk semua parameter yang dialirkan.

(DM) Fungsi eksekusi asinkron (bukan yang ini) dipanggil untuk StatementHandle dan masih dijalankan ketika fungsi ini dipanggil.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations, atau SQLSetPos dipanggil untuk StatementHandle dan dikembalikan SQL_NEED_DATA. Fungsi ini dipanggil sebelum data dikirim untuk semua parameter atau kolom data-at-execution.
HY013 Kesalahan manajemen memori Panggilan fungsi tidak dapat diproses karena objek memori yang mendasar tidak dapat diakses, mungkin karena kondisi memori yang rendah.
HY090 String atau panjang buffer tidak valid (DM) Nilai salah satu argumen panjang nama kurang dari 0 tetapi tidak sama dengan SQL_NTS.
Nilai salah satu argumen panjang nama melebihi nilai panjang maksimum untuk nama yang sesuai. (Lihat "Komentar.")
HY117 Koneksi ditangguhkan karena status transaksi yang tidak diketahui. Hanya fungsi putuskan sambungan dan baca-saja yang diizinkan. (DM) Untuk informasi selengkapnya tentang status ditangguhkan, lihat Fungsi SQLEndTran.
HYC00 Fitur opsional tidak diimplementasikan Nama katalog ditentukan, dan driver atau sumber data tidak mendukung katalog.

Nama skema ditentukan, dan driver atau sumber data tidak mendukung skema.
Kombinasi pengaturan saat ini dari atribut pernyataan SQL_ATTR_CONCURRENCY dan SQL_ATTR_CURSOR_TYPE tidak didukung oleh driver atau sumber data.

Atribut pernyataan SQL_ATTR_USE_BOOKMARKS diatur ke SQL_UB_VARIABLE, dan atribut pernyataan SQL_ATTR_CURSOR_TYPE diatur ke jenis kursor yang drivernya tidak mendukung marka buku.
HYT00 Waktu habis kedaluwarsa Periode batas waktu kueri kedaluwarsa sebelum sumber data mengembalikan tataan hasil. Periode batas waktu diatur melalui SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 Kesalahan waktu habis koneksi kedaluwarsa Periode batas waktu koneksi kedaluwarsa sebelum sumber data merespons permintaan. Periode batas waktu koneksi diatur melalui SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Driver tidak mendukung fungsi ini (DM) Driver yang terkait dengan StatementHandle tidak mendukung fungsi.
IM017 Polling dinonaktifkan dalam mode pemberitahuan asinkron Setiap kali model pemberitahuan digunakan, polling dinonaktifkan.
IM018 SQLCompleteAsync belum dipanggil untuk menyelesaikan operasi asinkron sebelumnya pada handel ini. Jika panggilan fungsi sebelumnya pada handel mengembalikan SQL_STILL_EXECUTING dan jika mode pemberitahuan diaktifkan, SQLCompleteAsync harus dipanggil pada handel untuk melakukan pasca-pemrosesan dan menyelesaikan operasi.

Komentar

Untuk informasi tentang bagaimana informasi yang dikembalikan oleh fungsi ini mungkin digunakan, lihat Penggunaan Data Katalog.

Jika *PKTableName berisi nama tabel, SQLForeignKeys mengembalikan tataan hasil yang berisi kunci utama tabel yang ditentukan dan semua kunci asing yang merujuknya. Daftar kunci asing dalam tabel lain tidak menyertakan kunci asing yang menunjuk ke batasan unik dalam tabel yang ditentukan.

Jika *FKTableName berisi nama tabel, SQLForeignKeys mengembalikan tataan hasil yang berisi semua kunci asing dalam tabel yang ditentukan yang menunjuk ke kunci utama dalam tabel lain, dan kunci utama dalam tabel lain yang dirujuknya. Daftar kunci asing dalam tabel yang ditentukan tidak berisi kunci asing yang mengacu pada batasan unik dalam tabel lain.

Jika *PKTableName dan *FKTableName berisi nama tabel, SQLForeignKeys mengembalikan kunci asing dalam tabel yang ditentukan dalam *FKTableName yang merujuk ke kunci utama tabel yang ditentukan dalam *PKTableName. Ini harus menjadi satu kunci paling banyak.

Catatan

Untuk informasi selengkapnya tentang penggunaan umum, argumen, dan data fungsi katalog ODBC yang dikembalikan, lihat Fungsi Katalog.

SQLForeignKeys mengembalikan hasil sebagai kumpulan hasil standar. Jika kunci asing yang terkait dengan kunci primer diminta, tataan hasil diurutkan berdasarkan FKTABLE_CAT, FKTABLE_SCHEM, FKTABLE_NAME, dan KEY_SEQ. Jika kunci primer yang terkait dengan kunci asing diminta, tataan hasil diurutkan berdasarkan PKTABLE_CAT, PKTABLE_SCHEM, PKTABLE_NAME, dan KEY_SEQ. Tabel berikut mencantumkan kolom dalam tataan hasil.

Panjang kolom VARCHAR tidak ditampilkan dalam tabel; panjang aktual tergantung pada sumber data. Untuk menentukan panjang aktual PKTABLE_CAT atau FKTABLE_CAT, PKTABLE_SCHEM atau FKTABLE_SCHEM, PKTABLE_NAME atau FKTABLE_NAME, dan kolom PKCOLUMN_NAME atau FKCOLUMN_NAME, aplikasi dapat memanggil SQLGetInfo dengan opsi SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN, dan SQL_MAX_COLUMN_NAME_LEN.

Kolom berikut telah diganti namanya untuk ODBC 3*.x.* Perubahan nama kolom tidak memengaruhi kompatibilitas mundur karena aplikasi yang diikat dengan nomor kolom.

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

Tabel berikut mencantumkan kolom dalam tataan hasil. Kolom tambahan di luar kolom 14 (REMARKS) dapat ditentukan oleh driver. Aplikasi harus mendapatkan akses ke kolom khusus driver dengan menghitung mundur dari akhir tataan hasil alih-alih menentukan posisi ordinal eksplisit. Untuk informasi selengkapnya, lihat Data yang Dikembalikan oleh Fungsi Katalog.

Nama kolom Nomor kolom Jenis Data Komentar
PKTABLE_CAT (ODBC 1.0) 1 Varchar Nama katalog tabel kunci primer; NULL jika tidak berlaku untuk sumber data. Jika driver mendukung katalog untuk beberapa tabel tetapi tidak untuk yang lain, seperti ketika driver mengambil data dari DBMS yang berbeda, itu mengembalikan string kosong ("") untuk tabel yang tidak memiliki katalog.
PKTABLE_SCHEM (ODBC 1.0) 2 Varchar Nama skema tabel kunci primer; NULL jika tidak berlaku untuk sumber data. Jika driver mendukung skema untuk beberapa tabel tetapi tidak untuk yang lain, seperti ketika driver mengambil data dari DBMS yang berbeda, itu mengembalikan string kosong ("") untuk tabel yang tidak memiliki skema.
PKTABLE_NAME (ODBC 1.0) 3 Varchar bukan NULL Nama tabel kunci primer.
PKCOLUMN_NAME (ODBC 1.0) 4 Varchar bukan NULL Nama kolom kunci primer. Driver mengembalikan string kosong untuk kolom yang tidak memiliki nama.
FKTABLE_CAT (ODBC 1.0) 5 Varchar Nama katalog tabel kunci asing; NULL jika tidak berlaku untuk sumber data. Jika driver mendukung katalog untuk beberapa tabel tetapi tidak untuk yang lain, seperti ketika driver mengambil data dari DBMS yang berbeda, itu mengembalikan string kosong ("") untuk tabel yang tidak memiliki katalog.
FKTABLE_SCHEM (ODBC 1.0) 6 Varchar Nama skema tabel kunci asing; NULL jika tidak berlaku untuk sumber data. Jika driver mendukung skema untuk beberapa tabel tetapi tidak untuk yang lain, seperti ketika driver mengambil data dari DBMS yang berbeda, itu mengembalikan string kosong ("") untuk tabel yang tidak memiliki skema.
FKTABLE_NAME (ODBC 1.0) 7 Varchar bukan NULL Nama tabel kunci asing.
FKCOLUMN_NAME (ODBC 1.0) 8 Varchar bukan NULL Nama kolom kunci asing. Driver mengembalikan string kosong untuk kolom yang tidak memiliki nama.
KEY_SEQ (ODBC 1.0) 9 Smallint bukan NULL Nomor urutan kolom dalam kunci (dimulai dengan 1).
UPDATE_RULE (ODBC 1.0) 10 Smallint Tindakan yang akan diterapkan ke kunci asing saat operasi SQL adalah UPDATE. Dapat memiliki salah satu nilai berikut. (Tabel yang dirujuk adalah tabel yang memiliki kunci utama; tabel referensi adalah tabel yang memiliki kunci asing.)

SQL_CASCADE: Saat kunci utama tabel yang dirujuk diperbarui, kunci asing tabel referensi juga diperbarui.

SQL_NO_ACTION: Jika pembaruan kunci utama tabel yang direferensikan akan menyebabkan "referensi menjuntai" dalam tabel referensi (yaitu, baris dalam tabel referensi tidak akan memiliki mitra dalam tabel yang direferensikan), pembaruan ditolak. Jika pembaruan kunci asing dari tabel referensi akan memperkenalkan nilai yang tidak ada sebagai nilai kunci utama tabel yang direferensikan, pembaruan ditolak. (Tindakan ini sama dengan tindakan SQL_RESTRICT di ODBC 2*.x*.)

SQL_SET_NULL: Ketika satu atau beberapa baris dalam tabel yang dirujuk diperbarui sewaktu-waktu satu atau beberapa komponen kunci primer diubah, komponen kunci asing dalam tabel referensi yang sesuai dengan komponen yang diubah dari kunci primer diatur ke NULL di semua baris yang cocok dari tabel referensi.

SQL_SET_DEFAULT: Ketika satu atau beberapa baris dalam tabel yang dirujuk diperbarui sewaktu-waktu sehingga satu atau beberapa komponen kunci primer diubah, komponen kunci asing dalam tabel referensi yang sesuai dengan komponen yang diubah dari kunci primer diatur ke nilai default yang berlaku di semua baris yang cocok dari tabel referensi.

NULL jika tidak berlaku untuk sumber data.
DELETE_RULE (ODBC 1.0) 11 Smallint Tindakan yang akan diterapkan ke kunci asing saat operasi SQL adalah DELETE. Dapat memiliki salah satu nilai berikut. (Tabel yang dirujuk adalah tabel yang memiliki kunci utama; tabel referensi adalah tabel yang memiliki kunci asing.)

SQL_CASCADE: Saat baris dalam tabel yang dirujuk dihapus, semua baris yang cocok dalam tabel referensi juga dihapus.

SQL_NO_ACTION: Jika penghapusan baris dalam tabel yang direferensikan akan menyebabkan "referensi menggantung" dalam tabel referensi (yaitu, baris dalam tabel referensi tidak akan memiliki mitra dalam tabel yang direferensikan), pembaruan ditolak. (Tindakan ini sama dengan tindakan SQL_RESTRICT di ODBC 2*.x*.)

SQL_SET_NULL: Saat satu atau beberapa baris dalam tabel yang dirujuk dihapus, setiap komponen kunci asing tabel referensi diatur ke NULL di semua baris yang cocok dari tabel referensi.

SQL_SET_DEFAULT: Saat satu atau beberapa baris dalam tabel yang dirujuk dihapus, setiap komponen kunci asing dari tabel referensi diatur ke default yang berlaku di semua baris yang cocok dari tabel referensi.

NULL jika tidak berlaku untuk sumber data.
FK_NAME (ODBC 2.0) 12 Varchar Nama kunci asing. NULL jika tidak berlaku untuk sumber data.
PK_NAME (ODBC 2.0) 13 Varchar Nama kunci primer. NULL jika tidak berlaku untuk sumber data.
DEFERRABILITY (ODBC 3.0) 14 Smallint SQL_INITIALLY_DEFERRED, SQL_INITIALLY_IMMEDIATE, SQL_NOT_DEFERRABLE.

Contoh Kode

Seperti yang diilustrasikan dalam tabel berikut, contoh ini menggunakan tiga tabel, bernama ORDERS, LINES, dan CUSTOMERS.

PESANAN LINES PELANGGAN
ORDERID ORDERID CUSTID
CUSTID LINES NAMA
OPENDATE PARTID ALAMAT
STAF PENJUALAN KUANTITAS TELEPON
STATUS

Dalam tabel ORDERS, CUSTID mengidentifikasi pelanggan kepada siapa penjualan telah dilakukan. Ini adalah kunci asing yang mengacu pada CUSTID dalam tabel PELANGGAN.

Dalam tabel LINES, ORDERID mengidentifikasi pesanan penjualan yang terkait dengan item baris. Ini adalah kunci asing yang mengacu pada ORDERID dalam tabel ORDERS.

Contoh ini memanggil SQLPrimaryKeys untuk mendapatkan kunci utama tabel ORDERS. Tataan hasil akan memiliki satu baris; kolom signifikan diperlihatkan dalam tabel berikut.

TABLE_NAME COLUMN_NAME KEY_SEQ
PESANAN ORDERID 1

Selanjutnya, contoh memanggil SQLForeignKeys untuk mendapatkan kunci asing dalam tabel lain yang mereferensikan kunci utama tabel ORDERS. Tataan hasil akan memiliki satu baris; kolom signifikan diperlihatkan dalam tabel berikut.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
PESANAN CUSTID LINES CUSTID 1

Terakhir, contoh memanggil SQLForeignKeys untuk mendapatkan kunci asing dalam tabel ORDERS yang merujuk ke kunci utama tabel lain. Tataan hasil akan memiliki satu baris; kolom signifikan diperlihatkan dalam tabel berikut.

PKTABLE_NAME PKCOLUMN_NAME FKTABLE_NAME FKCOLUMN_NAME KEY_SEQ
PELANGGAN CUSTID PESANAN 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);  
Untuk informasi tentang Lihat
Mengikat buffer ke kolom dalam tataan hasil Fungsi SQLBindCol
Membatalkan pemrosesan pernyataan Fungsi SQLCancel
Mengambil satu baris atau blok data dalam arah terusan saja Fungsi SQLFetch
Mengambil blok data atau menggulir melalui kumpulan hasil Fungsi SQLFetchScroll
Mengembalikan kolom kunci primer Fungsi SQLPrimaryKeys
Mengembalikan statistik dan indeks tabel Fungsi SQLStatistics

Lihat Juga

Referensi API ODBC
File Header ODBC