Fungsi SQLColAttribute
Kesesuaian
Versi Diperkenalkan: Kepatuhan Standar ODBC 3.0: ISO 92
Ringkasan
SQLColAttribute mengembalikan informasi deskriptor untuk kolom dalam kumpulan hasil. Informasi deskriptor dikembalikan sebagai string karakter, nilai yang bergantung pada deskriptor, atau nilai bilangan bulat.
Catatan
Untuk informasi selengkapnya tentang apa Manajer Driver memetakan fungsi ini ketika ODBC 3.aplikasi x bekerja dengan ODBC 2.x driver, lihat Memetakan Fungsi Penggantian untuk Kompatibilitas Aplikasi Mundur.
Sintaks
SQLRETURN SQLColAttribute (
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLUSMALLINT FieldIdentifier,
SQLPOINTER CharacterAttributePtr,
SQLSMALLINT BufferLength,
SQLSMALLINT * StringLengthPtr,
SQLLEN * NumericAttributePtr);
Argumen
StatementHandle
[Input] Handel pernyataan.
Nomor Kolom
[Input] Jumlah rekaman dalam IRD tempat nilai bidang akan diambil. Argumen ini sesuai dengan jumlah kolom data hasil, diurutkan secara berurutan dalam meningkatkan urutan kolom, mulai dari 1. Kolom dapat dijelaskan dalam urutan apa pun.
Kolom 0 dapat ditentukan dalam argumen ini, tetapi semua nilai kecuali SQL_DESC_TYPE dan SQL_DESC_OCTET_LENGTH akan mengembalikan nilai yang tidak ditentukan.
Pengidentifikasi Bidang
[Input] Handel deskriptor. Handel ini menentukan bidang mana dalam IRD yang harus dikueri (misalnya, SQL_COLUMN_TABLE_NAME).
CharacterAttributePtr
[Output] Penunjuk ke buffer untuk mengembalikan nilai di bidang FieldIdentifier dari baris ColumnNumber dari IRD, jika bidang adalah string karakter. Jika tidak, bidang tidak digunakan.
Jika CharacterAttributePtr adalah NULL, StringLengthPtr masih akan mengembalikan jumlah total byte (tidak termasuk karakter penghentian null untuk data karakter) yang tersedia untuk dikembalikan dalam buffer yang ditujukkan oleh CharacterAttributePtr.
BufferLength
[Input] Jika FieldIdentifier adalah bidang yang ditentukan ODBC dan CharacterAttributePtr menunjuk ke string karakter atau buffer biner, argumen ini harus panjang *CharacterAttributePtr. Jika FieldIdentifier adalah bidang yang ditentukan ODBC dan *CharacterAttributePtr adalah bilangan bulat, bidang ini diabaikan. Jika *CharacterAttributePtr adalah string Unicode (saat memanggil SQLColAttributeW), argumen BufferLength harus berupa angka genap. Jika FieldIdentifier adalah bidang yang ditentukan driver, aplikasi menunjukkan sifat bidang ke Driver Manager dengan mengatur argumen BufferLength . BufferLength dapat memiliki nilai berikut:
Jika CharacterAttributePtr adalah penunjuk ke penunjuk, BufferLength harus memiliki nilai SQL_IS_POINTER.
Jika CharacterAttributePtr adalah penunjuk ke string karakter, BufferLength adalah panjang buffer.
Jika CharacterAttributePtr adalah penunjuk ke buffer biner, aplikasi menempatkan hasil makro SQL_LEN_BINARY_ATTR(panjang) di BufferLength. Ini menempatkan nilai negatif di BufferLength.
Jika CharacterAttributePtr adalah penunjuk ke jenis data panjang tetap, BufferLength harus salah satu dari yang berikut ini: SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT, atau SQL_IS_USMALLINT.
StringLengthPtr
[Output] Penunjuk ke buffer untuk mengembalikan jumlah total byte (tidak termasuk byte penghentian null untuk data karakter) yang tersedia untuk dikembalikan dalam *CharacterAttributePtr.
Untuk data karakter, jika jumlah byte yang tersedia untuk dikembalikan lebih besar dari atau sama dengan BufferLength, informasi deskriptor dalam *CharacterAttributePtr dipotong menjadi BufferLength dikurangi panjang karakter null-termination dan dihentikan null oleh driver.
Untuk semua jenis data lainnya, nilai BufferLength diabaikan dan driver mengasumsikan ukuran *CharacterAttributePtr adalah 32 bit.
NumericAttributePtr
[Output] Penunjuk ke buffer bilangan bulat untuk mengembalikan nilai di bidang FieldIdentifier dari baris ColumnNumber dari IRD, jika bidang adalah jenis deskriptor numerik, seperti SQL_DESC_COLUMN_LENGTH. Jika tidak, bidang tidak digunakan. Harap dicatat bahwa beberapa driver hanya dapat menulis buffer 32-bit atau 16-bit yang lebih rendah dan membiarkan bit berurutan lebih tinggi tidak berubah. Oleh karena itu, aplikasi harus menginisialisasi nilai ke 0 sebelum memanggil fungsi ini.
Mengembalikan
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR, atau SQL_INVALID_HANDLE.
Diagnostik
Ketika SQLColAttribute 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 umumnya dikembalikan oleh SQLColAttribute 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.) |
01004 | Data string, terpotong kanan | Buffer *CharacterAttributePtr tidak cukup besar untuk mengembalikan seluruh nilai string, sehingga nilai string terpotong. Panjang nilai string yang tidak terpotong dikembalikan dalam *StringLengthPtr. (Fungsi mengembalikan SQL_SUCCESS_WITH_INFO.) |
07005 | Pernyataan yang disiapkan bukan spesifikasi kursor | Pernyataan yang terkait dengan StatementHandle tidak mengembalikan kumpulan hasil dan FieldIdentifier tidak SQL_DESC_COUNT. Tidak ada kolom untuk dijelaskan. |
07009 | Indeks deskriptor tidak valid | (DM) Nilai yang ditentukan untuk ColumnNumber sama dengan 0, dan atribut pernyataan SQL_ATTR_USE_BOOKMARKS SQL_UB_OFF. Nilai yang ditentukan untuk argumen ColumnNumber lebih besar dari jumlah kolom dalam tataan hasil. |
HY000 | Kesalahan umum | Terjadi kesalahan yang tidak ada SQLSTATE tertentu dan tidak ada SQLSTATE khusus implementasi yang ditentukan. Pesan kesalahan yang dikembalikan oleh SQLGetDiagField dari struktur data diagnostik 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. 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. |
HY010 | Kesalahan urutan fungsi | (DM) Fungsi eksekusi asinkron dipanggil untuk handel koneksi yang terkait dengan StatementHandle. Fungsi ainkron ini masih dijalankan ketika SQLColAttribute 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 ini dipanggil sebelum memanggil SQLPrepare, SQLExecDirect, atau fungsi katalog untuk StatementHandle. (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) *CharacterAttributePtr adalah string karakter, dan BufferLength kurang dari 0 tetapi tidak sama dengan SQL_NTS. |
HY091 | Pengidentifikasi bidang deskriptor tidak valid | Nilai yang ditentukan untuk argumen FieldIdentifier bukan salah satu nilai yang ditentukan dan bukan nilai yang ditentukan implementasi. |
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 | Driver tidak mampu | Nilai yang ditentukan untuk argumen FieldIdentifier tidak didukung oleh driver. |
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. |
Ketika dipanggil setelah SQLPrepare dan sebelum SQLExecute, SQLColAttribute dapat mengembalikan SQLSTATE apa pun yang dapat dikembalikan oleh SQLPrepare atau SQLExecute, tergantung pada kapan sumber data mengevaluasi pernyataan SQL yang terkait dengan StatementHandle.
Untuk alasan performa, aplikasi tidak boleh memanggil SQLColAttribute sebelum menjalankan pernyataan.
Komentar
Untuk informasi tentang cara aplikasi menggunakan informasi yang dikembalikan oleh SQLColAttribute, lihat Metadata Tataan Hasil.
SQLColAttribute mengembalikan informasi baik di *NumericAttributePtr atau di *CharacterAttributePtr. Informasi bilangan bulat dikembalikan dalam *NumericAttributePtr sebagai nilai SQLLEN; semua format informasi lainnya dikembalikan dalam *CharacterAttributePtr. Ketika informasi dikembalikan dalam *NumericAttributePtr, driver mengabaikan CharacterAttributePtr, BufferLength, dan StringLengthPtr. Ketika informasi dikembalikan dalam *CharacterAttributePtr, driver mengabaikan NumericAttributePtr.
SQLColAttribute mengembalikan nilai dari bidang deskriptor IRD. Fungsi ini dipanggil dengan handel pernyataan daripada handel deskriptor. Nilai yang dikembalikan oleh SQLColAttribute untuk nilai FieldIdentifier yang tercantum nanti di bagian ini juga dapat diambil dengan memanggil SQLGetDescField dengan handel IRD yang sesuai.
Bidang deskriptor yang saat ini ditentukan, versi ODBC tempat mereka diperkenalkan, dan argumen di mana informasi dikembalikan untuk mereka ditampilkan nanti di bagian ini; lebih banyak jenis deskriptor dapat didefinisikan oleh driver untuk memanfaatkan sumber data yang berbeda.
ODBC 3.driver x harus mengembalikan nilai untuk setiap bidang deskriptor. Jika bidang deskriptor tidak berlaku untuk driver atau sumber data dan kecuali dinyatakan lain, driver mengembalikan 0 di *StringLengthPtr atau string kosong di *CharacterAttributePtr.
Kompatibilitas mundur
ODBC 3.x fungsi SQLColAttribute menggantikan ODBC 2 yang tidak digunakan lagi.x fungsi SQLColAttributes. Saat memetakan SQLColAttributes ke SQLColAttribute (saat ODBC 2.aplikasi x bekerja dengan ODBC 3.x driver), atau pemetaan SQLColAttribute ke SQLColAttributes (saat ODBC 3.aplikasi x bekerja dengan ODBC 2.x driver), Driver Manager meneruskan nilai FieldIdentifier melalui, memetakannya ke nilai baru, atau mengembalikan kesalahan, sebagai berikut:
Catatan
Awalan yang digunakan dalam nilai FieldIdentifier di ODBC 3.x telah diubah dari yang digunakan dalam ODBC 2.x. Awalan baru adalah "SQL_DESC"; awalan lama adalah "SQL_COLUMN".
Jika nilai #define ODBC 2.x FieldIdentifier sama dengan nilai #define ODBC 3.x FieldIdentifier, nilai dalam panggilan fungsi baru saja diteruskan.
Nilai #define ODBC 2.x FieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION, dan SQL_COLUMN_SCALE berbeda dari nilai #define ODBC 3.x FieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE, dan SQL_DESC_LENGTH. ODBC 2.x driver hanya perlu mendukung ODBC 2.nilai x . ODBC 3.driver x harus mendukung nilai "SQL_COLUMN" dan "SQL_DESC" untuk ketiga FieldIdentifier ini. Nilai-nilai ini berbeda karena presisi, skala, dan panjang didefinisikan secara berbeda dalam ODBC 3.x dari mereka berada di ODBC 2.x. Untuk informasi selengkapnya, lihat Ukuran Kolom, Digit Desimal, Panjang Oktet Transfer, dan Ukuran Tampilan.
Jika nilai #define ODBC 2.x FieldIdentifier berbeda dari nilai #define ODBC 3.x FieldIdentifier, seperti yang terjadi dengan nilai COUNT, NAME, dan NULLABLE, nilai dalam panggilan fungsi dipetakan ke nilai yang sesuai. Misalnya, SQL_COLUMN_COUNT dipetakan ke SQL_DESC_COUNT, dan SQL_DESC_COUNT dipetakan ke SQL_COLUMN_COUNT, tergantung pada arah pemetaan.
Jika FieldIdentifier adalah nilai baru di ODBC 3.x, yang tidak ada nilai yang sesuai di ODBC 2.x, itu tidak akan dipetakan ketika ODBC 3.aplikasi x menggunakannya dalam panggilan ke SQLColAttribute dalam ODBC 2.driver x , dan panggilan akan mengembalikan SQLSTATE HY091 (Pengidentifikasi bidang deskriptor tidak valid).
Tabel berikut mencantumkan jenis deskriptor yang dikembalikan oleh SQLColAttribute. Jenis untuk nilai NumericAttributePtr adalah SQLLEN *.
Pengidentifikasi Bidang | Informasi dikembalikan dalam |
Deskripsi |
---|---|---|
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE jika kolom adalah kolom autoincrementing. SQL_FALSE jika kolom bukan kolom autoincrementing atau bukan numerik. Bidang ini hanya valid untuk kolom tipe data numerik. Aplikasi dapat menyisipkan nilai ke dalam baris yang berisi kolom autoincrement, tetapi biasanya tidak dapat memperbarui nilai dalam kolom. Saat sisipan dibuat ke dalam kolom autoincrement, nilai unik disisipkan ke dalam kolom pada waktu penyisipan. Kenaikan tidak ditentukan, tetapi khusus sumber data. Aplikasi tidak boleh berasumsi bahwa kolom autoincrement dimulai pada titik atau kenaikan tertentu dengan nilai tertentu. |
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) | CharacterAttributePtr | Nama kolom dasar untuk kolom kumpulan hasil. Jika nama kolom dasar tidak ada (seperti dalam kasus kolom yang merupakan ekspresi), maka variabel ini berisi string kosong. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_BASE_COLUMN_NAME IRD, yang merupakan bidang baca-saja. |
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) | CharacterAttributePtr | Nama tabel dasar yang berisi kolom . Jika nama tabel dasar tidak dapat ditentukan atau tidak berlaku, maka variabel ini berisi string kosong. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_BASE_TABLE_NAME IRD, yang merupakan bidang baca-saja. |
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE jika kolom diperlakukan sebagai peka huruf besar/kecil untuk kolase dan perbandingan. SQL_FALSE jika kolom tidak diperlakukan sebagai peka huruf besar/kecil untuk kolase dan perbandingan atau noncharacter. |
SQL_DESC_CATALOG_NAME (ODBC 2.0) | CharacterAttributePtr | Katalog tabel yang berisi kolom . Nilai yang dikembalikan ditentukan implementasi jika kolom adalah ekspresi atau jika kolom adalah bagian dari tampilan. Jika sumber data tidak mendukung katalog atau nama katalog tidak dapat ditentukan, string kosong akan dikembalikan. Bidang rekaman VARCHAR ini tidak dibatasi hingga 128 karakter. |
SQL_DESC_CONCISE_TYPE (ODBC 1.0) | NumericAttributePtr | Jenis data ringkas. Untuk jenis data tanggalwaktu dan interval, bidang ini mengembalikan jenis data ringkas; misalnya, SQL_TYPE_TIME atau SQL_INTERVAL_YEAR. (Untuk informasi selengkapnya, lihat Pengidentifikasi dan Deskriptor Tipe Data di Lampiran D: Jenis Data.) Informasi ini dikembalikan dari bidang rekaman SQL_DESC_CONCISE_TYPE IRD. |
SQL_DESC_COUNT (ODBC 1.0) | NumericAttributePtr | Jumlah kolom yang tersedia dalam tataan hasil. Ini mengembalikan 0 jika tidak ada kolom dalam tataan hasil. Nilai dalam argumen ColumnNumber diabaikan. Informasi ini dikembalikan dari bidang header SQL_DESC_COUNT IRD. |
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) | NumericAttributePtr | Jumlah maksimum karakter yang diperlukan untuk menampilkan data dari kolom. Untuk informasi selengkapnya tentang ukuran tampilan, lihat Ukuran Kolom, Digit Desimal, Panjang Oktet Transfer, dan Ukuran Tampilan dalam Lampiran D: Jenis Data. |
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE jika kolom memiliki presisi tetap dan skala nonzero yang khusus untuk sumber data. SQL_FALSE jika kolom tidak memiliki presisi tetap dan skala nonzero yang khusus untuk sumber data. |
SQL_DESC_LABEL (ODBC 2.0) | CharacterAttributePtr | Label kolom atau judul. Misalnya, kolom bernama EmpName mungkin diberi label Nama Karyawan atau mungkin diberi label dengan alias. Jika kolom tidak memiliki label, nama kolom akan dikembalikan. Jika kolom tidak berlabel dan tidak disebutkan namanya, string kosong akan dikembalikan. |
SQL_DESC_LENGTH (ODBC 3.0) | NumericAttributePtr | Nilai numerik yang merupakan panjang karakter maksimum atau aktual dari string karakter atau jenis data biner. Ini adalah panjang karakter maksimum untuk jenis data panjang tetap, atau panjang karakter aktual untuk jenis data dengan panjang variabel. Nilainya selalu mengecualikan byte penghentian null yang mengakhiri string karakter. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_LENGTH IRD. Untuk informasi selengkapnya tentang panjang, lihat Ukuran Kolom, Digit Desimal, Panjang Oktet Transfer, dan Ukuran Tampilan dalam Lampiran D: Jenis Data. |
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) | CharacterAttributePtr | Bidang rekaman VARCHAR(128) ini berisi karakter atau karakter yang dikenal driver sebagai awalan untuk literal jenis data ini. Bidang ini berisi string kosong untuk jenis data yang awalan harfiahnya tidak berlaku. Untuk informasi selengkapnya, lihat Awalan literal dan Akhiran. |
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) | CharacterAttributePtr | Bidang rekaman VARCHAR(128) ini berisi karakter atau karakter yang dikenal driver sebagai akhiran untuk literal jenis data ini. Bidang ini berisi string kosong untuk jenis data yang akhiran harfiahnya tidak berlaku. Untuk informasi selengkapnya, lihat Awalan literal dan Akhiran. |
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) | CharacterAttributePtr | Bidang rekaman VARCHAR(128) ini berisi nama yang dilokalkan (bahasa asli) untuk jenis data yang mungkin berbeda dari nama reguler jenis data. Jika tidak ada nama yang dilokalkan, maka string kosong dikembalikan. Bidang ini hanya untuk tujuan tampilan. Kumpulan karakter string bergantung pada lokal dan biasanya merupakan kumpulan karakter default server. |
SQL_DESC_NAME (ODBC 3.0) | CharacterAttributePtr | Alias kolom, jika berlaku. Jika alias kolom tidak berlaku, nama kolom dikembalikan. Dalam kedua kasus, SQL_DESC_UNNAMED diatur ke SQL_NAMED. Jika tidak ada nama kolom atau alias kolom, string kosong dikembalikan dan SQL_DESC_UNNAMED diatur ke SQL_UNNAMED. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_NAME IRD. |
SQL_DESC_NULLABLE (ODBC 3.0) | NumericAttributePtr | SQL_ NULLABLE jika kolom dapat memiliki nilai NULL; SQL_NO_NULLS jika kolom tidak memiliki nilai NULL; atau SQL_NULLABLE_UNKNOWN jika tidak diketahui apakah kolom menerima nilai NULL. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_NULLABLE IRD. |
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) | NumericAttributePtr | Jika jenis data di bidang SQL_DESC_TYPE adalah perkiraan jenis data numerik, bidang SQLINTEGER ini berisi nilai 2 karena bidang SQL_DESC_PRECISION berisi jumlah bit. Jika tipe data di bidang SQL_DESC_TYPE adalah tipe data numerik yang tepat, bidang ini berisi nilai 10 karena bidang SQL_DESC_PRECISION berisi jumlah digit desimal. Bidang ini diatur ke 0 untuk semua jenis data non-numerik. |
SQL_DESC_OCTET_LENGTH (ODBC 3.0) | NumericAttributePtr | Panjangnya, dalam byte, dari string karakter atau jenis data biner. Untuk karakter panjang tetap atau jenis biner, ini adalah panjang aktual dalam byte. Untuk karakter panjang variabel atau jenis biner, ini adalah panjang maksimum dalam byte. Nilai ini tidak termasuk terminator null. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_OCTET_LENGTH IRD. Untuk informasi selengkapnya tentang panjang, lihat Ukuran Kolom, Digit Desimal, Panjang Oktet Transfer, dan Ukuran Tampilan dalam Lampiran D: Jenis Data. |
SQL_DESC_PRECISION (ODBC 3.0) | NumericAttributePtr | Nilai numerik yang untuk jenis data numerik menunjukkan presisi yang berlaku. Untuk jenis data SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP, dan semua jenis data interval yang mewakili interval waktu, nilainya adalah presisi komponen detik pecahan yang berlaku. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_PRECISION IRD. |
SQL_DESC_SCALE (ODBC 3.0) | NumericAttributePtr | Nilai numerik yang merupakan skala yang berlaku untuk jenis data numerik. Untuk jenis data DECIMAL dan NUMERIC, ini adalah skala yang ditentukan. Ini tidak ditentukan untuk semua jenis data lainnya. Informasi ini dikembalikan dari bidang catatan SKALA IRD. |
SQL_DESC_SCHEMA_NAME (ODBC 2.0) | CharacterAttributePtr | Skema tabel yang berisi kolom. Nilai yang dikembalikan ditentukan implementasi jika kolom adalah ekspresi atau jika kolom adalah bagian dari tampilan. Jika sumber data tidak mendukung skema atau nama skema tidak dapat ditentukan, string kosong dikembalikan. Bidang rekaman VARCHAR ini tidak dibatasi hingga 128 karakter. |
SQL_DESC_SEARCHABLE (ODBC 1.0) | NumericAttributePtr | SQL_PRED_NONE jika kolom tidak dapat digunakan dalam klausa WHERE. (Ini sama dengan nilai SQL_UNSEARCHABLE di ODBC 2.x.) SQL_PRED_CHAR apakah kolom dapat digunakan dalam klausa WHERE tetapi hanya dengan predikat LIKE. (Ini sama dengan nilai SQL_LIKE_ONLY di ODBC 2.x.) SQL_PRED_BASIC apakah kolom dapat digunakan dalam klausa WHERE dengan semua operator perbandingan kecuali LIKE. (Ini sama dengan nilai SQL_EXCEPT_LIKE di ODBC 2.x.) SQL_PRED_SEARCHABLE apakah kolom dapat digunakan dalam klausa WHERE dengan operator perbandingan apa pun. Kolom jenis SQL_LONGVARCHAR dan SQL_LONGVARBINARY biasanya mengembalikan SQL_PRED_CHAR. |
SQL_DESC_TABLE_NAME (ODBC 2.0) | CharacterAttributePtr | Nama tabel yang berisi kolom . Nilai yang dikembalikan ditentukan implementasi jika kolom adalah ekspresi atau jika kolom adalah bagian dari tampilan. Jika nama tabel tidak dapat ditentukan, string kosong dikembalikan. |
SQL_DESC_TYPE (ODBC 3.0) | NumericAttributePtr | Nilai numerik yang menentukan jenis data SQL. Ketika ColumnNumber sama dengan 0, SQL_BINARY dikembalikan untuk bookmark panjang variabel dan SQL_INTEGER dikembalikan untuk bookmark panjang tetap. Untuk jenis data tanggalwaktu dan interval, bidang ini mengembalikan jenis data verbose: SQL_DATETIME atau SQL_INTERVAL. (Untuk informasi selengkapnya, lihat Pengidentifikasi dan Deskriptor Tipe Data di Lampiran D: Jenis Data. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_TYPE IRD. Catatan: Untuk bekerja melawan ODBC 2.x driver, gunakan SQL_DESC_CONCISE_TYPE sebagai gantinya. |
SQL_DESC_TYPE_NAME (ODBC 1.0) | CharacterAttributePtr | Nama jenis data yang bergantung pada sumber data; misalnya, "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY", atau "CHAR ( ) FOR BIT DATA". Jika jenis tidak diketahui, string kosong dikembalikan. |
SQL_DESC_UNNAMED (ODBC 3.0) | NumericAttributePtr | SQL_NAMED atau SQL_UNNAMED. Jika bidang SQL_DESC_NAME IRD berisi alias kolom atau nama kolom, SQL_NAMED dikembalikan. Jika tidak ada nama kolom atau alias kolom, SQL_UNNAMED dikembalikan. Informasi ini dikembalikan dari bidang rekaman SQL_DESC_UNNAMED IRD. |
SQL_DESC_UNSIGNED (ODBC 1.0) | NumericAttributePtr | SQL_TRUE jika kolom tidak ditandatangani (atau bukan numerik). SQL_FALSE jika kolom ditandatangani. |
SQL_DESC_UPDATABLE (ODBC 1.0) | NumericAttributePtr | Kolom dijelaskan oleh nilai untuk konstanta yang ditentukan: SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN SQL_DESC_UPDATABLE menjelaskan pembaruan kolom dalam tataan hasil, bukan kolom dalam tabel dasar. Pembaruan kolom dasar tempat kolom kumpulan hasil didasarkan mungkin berbeda dari nilai di bidang ini. Apakah kolom dapat diperbarui dapat didasarkan pada jenis data, hak istimewa pengguna, dan definisi kumpulan hasil itu sendiri. Jika tidak jelas apakah kolom dapat diperbarui, SQL_ATTR_READWRITE_UNKNOWN harus dikembalikan. |
SQLColAttribute adalah alternatif yang dapat diperluas untuk SQLDescribeCol. SQLDescribeCol mengembalikan sekumpulan informasi deskriptor tetap berdasarkan ANSI-89 SQL. SQLColAttribute memungkinkan akses ke set informasi deskriptor yang lebih luas yang tersedia di ekstensi vendor ANSI SQL-92 dan DBMS.
Fungsi Terkait
Untuk informasi tentang | Lihat |
---|---|
Mengikat buffer ke kolom dalam tataan hasil | Fungsi SQLBindCol |
Membatalkan pemrosesan pernyataan | Fungsi SQLCancel |
Mengembalikan informasi tentang kolom dalam tataan hasil | Fungsi SQLDescribeCol |
Mengambil blok data atau menggulir melalui kumpulan hasil | Fungsi SQLFetchScroll |
Mengambil beberapa baris data | Fungsi SQLFetch |
Contoh
Kode sampel berikut tidak membebaskan handel dan koneksi. Lihat Fungsi SQLFreeHandle, Contoh Program ODBC, dan Fungsi SQLFreeStmt untuk sampel kode guna menangani dan pernyataan bebas.
// SQLColAttibute.cpp
// compile with: user32.lib odbc32.lib
#define UNICODE
#include <windows.h>
#include <sqlext.h>
#include <strsafe.h>
struct DataBinding {
SQLSMALLINT TargetType;
SQLPOINTER TargetValuePtr;
SQLINTEGER BufferLength;
SQLLEN StrLen_or_Ind;
};
void printStatementResult(SQLHSTMT hstmt) {
int bufferSize = 1024, i;
SQLRETURN retCode;
SQLSMALLINT numColumn = 0, bufferLenUsed;
retCode = SQLNumResultCols(hstmt, &numColumn);
SQLPOINTER* columnLabels = (SQLPOINTER *)malloc( numColumn * sizeof(SQLPOINTER*) );
struct DataBinding* columnData = (struct DataBinding*)malloc( numColumn * sizeof(struct DataBinding) );
printf( "Columns from that table:\n" );
for ( i = 0 ; i < numColumn ; i++ ) {
columnLabels[i] = (SQLPOINTER)malloc( bufferSize*sizeof(char) );
retCode = SQLColAttribute(hstmt, (SQLUSMALLINT)i + 1, SQL_DESC_LABEL, columnLabels[i], (SQLSMALLINT)bufferSize, &bufferLenUsed, NULL);
wprintf( L"Column %d: %s\n", i, (wchar_t*)columnLabels[i] );
}
// allocate memory for the binding
for ( i = 0 ; i < numColumn ; i++ ) {
columnData[i].TargetType = SQL_C_CHAR;
columnData[i].BufferLength = (bufferSize+1);
columnData[i].TargetValuePtr = malloc( sizeof(unsigned char)*columnData[i].BufferLength );
}
// setup the binding
for ( i = 0 ; i < numColumn ; i++ ) {
retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, columnData[i].TargetType,
columnData[i].TargetValuePtr, columnData[i].BufferLength, &(columnData[i].StrLen_or_Ind));
}
printf( "Data from that table:\n" );
// fetch the data and print out the data
for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt) ) {
int j;
for ( j = 0 ; j < numColumn ; j++ )
wprintf( L"%s: %hs\n", columnLabels[j], columnData[j].TargetValuePtr );
printf( "\n" );
}
printf( "\n" );
}
int main() {
int bufferSize = 1024, i, count = 1, numCols = 5;
wchar_t firstTableName[1024], * dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize ), * userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );
HWND desktopHandle = GetDesktopWindow(); // desktop's window handle
SQLWCHAR connStrbuffer[1024];
SQLSMALLINT connStrBufferLen, bufferLen;
SQLRETURN retCode;
SQLHENV henv = NULL; // Environment
SQLHDBC hdbc = NULL; // Connection handle
SQLHSTMT hstmt = NULL; // Statement handle
struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );
SQLWCHAR* selectAllQuery = (SQLWCHAR *)malloc( sizeof(SQLWCHAR) * bufferSize );
// connect to database
retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLCHAR *)(void*)SQL_OV_ODBC3, -1);
retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);
retCode = SQLDriverConnect(hdbc, desktopHandle, L"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);
retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// display the database information
retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferLen);
retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, &bufferLen);
for ( i = 0 ; i < numCols ; i++ ) {
catalogResult[i].TargetType = SQL_C_CHAR;
catalogResult[i].BufferLength = (bufferSize + 1);
catalogResult[i].TargetValuePtr = malloc( sizeof(unsigned char)*catalogResult[i].BufferLength );
}
// Set up the binding. This can be used even if the statement is closed by closeStatementHandle
for ( i = 0 ; i < numCols ; i++ )
retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, catalogResult[i].TargetType, catalogResult[i].TargetValuePtr, catalogResult[i].BufferLength, &(catalogResult[i].StrLen_or_Ind));
retCode = SQLTables( hstmt, (SQLWCHAR*)SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );
retCode = SQLFreeStmt(hstmt, SQL_CLOSE);
retCode = SQLTables( hstmt, dbName, SQL_NTS, userName, SQL_NTS, L"%", SQL_NTS, L"TABLE", SQL_NTS );
for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt), ++count )
if ( count == 1 )
StringCchPrintfW( firstTableName, 1024, L"%hs", catalogResult[2].TargetValuePtr );
retCode = SQLFreeStmt(hstmt, SQL_CLOSE);
wprintf( L"Select all data from the first table (%s)\n", firstTableName );
StringCchPrintfW( selectAllQuery, bufferSize, L"SELECT * FROM %s", firstTableName );
retCode = SQLExecDirect(hstmt, selectAllQuery, SQL_NTS);
printStatementResult(hstmt);
}