Jenis Yang Ditentukan Pengguna CLR Besar (ODBC)
Berlaku untuk: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics Analytics
Platform System (PDW)
Penting
SQL Server Native Client (SNAC) tidak dikirim dengan:
- SQL Server 2022 (16.x) dan versi yang lebih baru
- SQL Server Management Studio 19 dan versi yang lebih baru
SQL Server Native Client (SQLNCLI atau SQLNCLI11) dan Penyedia Microsoft OLE DB warisan untuk SQL Server (SQLOLEDB) tidak direkomendasikan untuk pengembangan aplikasi baru.
Untuk proyek baru, gunakan salah satu driver berikut:
Untuk SQLNCLI yang dikirim sebagai komponen SQL Server Database Engine (versi 2012 hingga 2019), lihat pengecualian Siklus Hidup Dukungan ini.
Topik ini membahas perubahan pada ODBC di SQL Server Native Client untuk mendukung jenis (UDT) yang ditentukan pengguna (UDT) runtime bahasa umum (CLR) yang besar.
Untuk sampel yang menunjukkan dukungan ODBC untuk UDT CLR besar, lihat Dukungan untuk UDT Besar.
Untuk informasi selengkapnya tentang dukungan untuk UDT CLR besar di Klien Asli SQL Server, lihat Jenis Yang Ditentukan Pengguna CLR Besar.
Format data
SQL Server Native Client menggunakan SQL_SS_LENGTH_UNLIMITED untuk menunjukkan bahwa ukuran kolom lebih besar dari 8.000 byte untuk jenis objek besar (LOB). Dimulai dengan SQL Server 2008, nilai yang sama digunakan untuk UDT CLR ketika ukurannya lebih besar dari 8.000 byte.
Nilai UDT direpresentasikan sebagai array byte. Konversi ke dan dari string hex didukung. Nilai harfiah direpresentasikan sebagai string heksa dengan awalan "0x".
Tabel berikut ini memperlihatkan pemetaan jenis data dalam parameter dan tataan hasil:
Tipe data SQL Server | Tipe data SQL | Nilai |
---|---|---|
runtime bahasa umum UDT | SQL_SS_UDT | -151 (sqlncli.h) |
Tabel berikut membahas struktur yang sesuai dan tipe ODBC C. Pada dasarnya, CLR UDT adalah jenis varbinary dengan metadata tambahan.
Tipe data SQL | Tata letak memori | Jenis data C | Nilai (sqlext.h) |
---|---|---|---|
SQL_SS_UDT | SQLCHAR *(karakter tidak ditandatangani *) | SQL_C_BINARY | SQL_BINARY (-2) |
Bidang Deskriptor untuk Parameter
Informasi yang dikembalikan di bidang IPD adalah sebagai berikut:
Bidang deskriptor | SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
---|---|---|
SQL_DESC_CASE_SENSITIVE | SQL_FALSE | SQL_FALSE |
SQL_DESC_CONCISE_TYPE | SQL_SS_UDT | SQL_SS_UDT |
SQL_DESC_DATETIME_INTERVAL_CODE | 0 | 0 |
SQL_DESC_DATETIME_INTERVAL_PRECISION | n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_FIXED_PREC_SCALE | SQL_FALSE | SQL_FALSE |
SQL_DESC_LENGTH | n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_LOCAL_TYPE_NAME | "udt" | "udt" |
SQL_DESC_OCTET_LENGTH | n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_PRECISION | n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_SCALE | 0 | 0 |
SQL_DESC_TYPE | SQL_SS_UDT | SQL_SS_UDT |
SQL_DESC_TYPE_NAME | "udt" | "udt" |
SQL_DESC_UNSIGNED | SQL_TRUE | SQL_TRUE |
SQL_CA_SS_UDT_CATALOG_NAME | Nama katalog yang berisi UDT. | Nama katalog yang berisi UDT. |
SQL_CA_SS_UDT_SCHEMA_NAME | Nama skema yang berisi UDT. | Nama skema berisi UDT. |
SQL_CA_SS_UDT_TYPE_NAME | Nama UDT. | Nama UDT. |
SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME | Nama UDT yang sepenuhnya memenuhi syarat. | Nama UDT yang sepenuhnya memenuhi syarat. |
Untuk parameter UDT, SQL_CA_SS_UDT_TYPE_NAME harus selalu diatur melalui SQLSetDescField. SQL_CA_SS_UDT_CATALOG_NAME dan SQL_CA_SS_UDT_SCHEMA_NAME bersifat opsional.
Jika UDT didefinisikan dalam database yang sama dengan skema yang berbeda dari tabel, SQL_CA_SS_UDT_SCHEMA_NAME harus diatur.
Jika UDT ditentukan dalam database yang berbeda dari tabel, SQL_CA_SS_UDT_CATALOG_NAME dan SQL_CA_SS_UDT_SCHEMA_NAME harus diatur.
Jika ada kesalahan atau kelalaian dalam pengaturan untuk SQL_CA_SS_UDT_TYPE_NAME, SQL_CA_SS_UDT_CATALOG_NAME, atau SQL_CA_SS_UDT_SCHEMA_NAME, rekaman diagnostik dihasilkan dengan SQLSTATE HY000 dan teks pesan khusus server.
Bidang Deskriptor untuk Hasil
Informasi yang dikembalikan dalam bidang IRD adalah sebagai berikut:
Bidang deskriptor | SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
---|---|---|
SQL_DESC_AUTO_UNIQUE_VALUE | SQL_FALSE | SQL_FALSE |
SQL_DESC_CASE_SENSITIVE | SQL_FALSE | SQL_FALSE |
SQL_DESC_CONCISE_TYPE | SQL_SS_UDT | SQL_SS_UDT |
SQL_DESC_DATETIME_INTERVAL_CODE | 0 | 0 |
SQL_DESC_DATETIME_INTERVAL_PRECISION | n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_DISPLAY_SIZE | 2n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_FIXED_PREC_SCALE | SQL_FALSE | SQL_FALSE |
SQL_DESC_LENGTH | n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_LITERAL_PREFIX | "0x" | "0x" |
SQL_DESC_LITERAL_SUFFIX | "" | "" |
SQL_DESC_LOCAL_TYPE_NAME | "udt" | "udt" |
SQL_DESC_OCTET_LENGTH | n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_PRECISION | n | SQL_SS_LENGTH_UNLIMITED (0) |
SQL_DESC_SCALE | 0 | 0 |
SQL_DESC_SEARCHABLE | SQL_PRED_NONE | SQL_PRED_NONE |
SQL_DESC_TYPE | SQL_SS_UDT | SQL_SS_UDT |
SQL_DESC_TYPE_NAME | "udt" | "udt" |
SQL_DESC_UNSIGNED | SQL_TRUE | SQL_TRUE |
SQL_CA_SS_UDT_CATALOG_NAME | Nama katalog yang berisi UDT. | Nama katalog yang berisi UDT. |
SQL_CA_SS_UDT_SCHEMA_NAME | Nama skema yang berisi UDT. | Nama skema yang berisi UDT. |
SQL_CA_SS_UDT_TYPE_NAME | Nama UDT. | Nama UDT. |
SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME | Nama UDT yang sepenuhnya memenuhi syarat. | Nama UDT yang sepenuhnya memenuhi syarat. |
Metadata Kolom yang Dikembalikan oleh SQLColumns dan SQLProcedureColumns (Metadata Katalog)
Nilai kolom berikut dikembalikan untuk UDT:
Nama kolom | SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
---|---|---|
DATA_TYPE | SQL_SS_UDT | SQL_SS_UDT |
TYPE_NAME | Nama UDT. | Nama UDT. |
COLUMN_SIZE | n | SQL_SS_LENGTH_UNLIMITED (0) |
BUFFER_LENGTH | n | SQL_SS_LENGTH_UNLIMITED (0) |
DECIMAL_DIGITS | NULL | NULL |
SQL_DATA_TYPE | SQL_SS_UDT | SQL_SS_UDT |
SQL_DATETIME_SUB | NULL | NULL |
CHAR_OCTET_LENGTH | n | SQL_SS_LENGTH_UNLIMITED (0) |
SS_UDT_CATALOG_NAME | Nama katalog yang berisi UDT. | Nama katalog yang berisi UDT. |
SS_UDT_SCHEMA_NAME | Nama skema yang berisi UDT. | Nama skema yang berisi UDT. |
SS_UDT_ASSEMBLY_TYPE_NAME | Nama UDT yang sepenuhnya memenuhi syarat. | Nama UDT yang sepenuhnya memenuhi syarat. |
Tiga kolom terakhir adalah kolom khusus driver. Kolom ditambahkan setelah kolom yang ditentukan ODBC, tetapi sebelum kolom khusus driver yang ada dari kumpulan hasil SQLColumns atau SQLProcedureColumns.
Tidak ada baris yang dikembalikan oleh SQLGetTypeInfo, untuk UDT individual atau untuk jenis generik "udt".
Pengikatan dan Konversi
Konversi yang didukung dari jenis data SQL ke C adalah sebagai berikut:
Konversi ke dan dari: | SQL_SS_UDT |
---|---|
SQL_C_WCHAR | Didukung* |
SQL_C_BINARY | Didukung |
SQL_C_CHAR | Didukung* |
* Data biner dikonversi menjadi string hex.
Konversi yang didukung dari jenis data C ke SQL adalah sebagai berikut:
Konversi ke dan dari: | SQL_SS_UDT |
---|---|
SQL_C_WCHAR | Didukung* |
SQL_C_BINARY | Didukung |
SQL_C_CHAR | Didukung* |
* String Hex ke konversi data biner terjadi.
Dukungan SQL_VARIANT untuk UDT
UDT tidak didukung di kolom SQL_VARIANT.
Dukungan BCP untuk UDT
Nilai UDT hanya dapat diimpor dan diekspor sebagai nilai karakter atau biner.
Perilaku Klien Tingkat Bawah untuk UDT
UDT tunduk pada pemetaan jenis dengan klien tingkat bawah, sebagai berikut:
Versi server | SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
---|---|---|
SQL Server 2005 | UDT | varbinary(max) |
SQL Server 2008 dan yang lebih baru | UDT | UDT |
Fungsi ODBC Mendukung UDT CLR Besar
Bagian ini membahas perubahan pada fungsi ODBC SQL Server Native Client untuk mendukung UDT CLR besar.
SQLBindCol
Nilai kolom hasil UDT dikonversi dari jenis data SQL ke C seperti yang dijelaskan di bagian "Pengikatan dan Konversi", sebelumnya dalam topik ini.
SQLBindParameter
Nilai yang diperlukan untuk UDT adalah sebagai berikut:
Tipe data SQL | Jenis parameter | ColumnSizePtr | DecimalDigitsPtr |
---|---|---|---|
SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT | n | 0 |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
SQL_SS_UDT | SQL_SS_LENGTH_UNLIMITED (0) | 0 |
SQLColAttribute
Nilai yang dikembalikan untuk UDT seperti yang dijelaskan di bagian "Bidang Deskriptor untuk Hasil", sebelumnya dalam topik ini.
SQLColumns
Nilai yang dikembalikan untuk UDT seperti yang dijelaskan di bagian "Metadata Kolom yang Dikembalikan oleh SQLColumns dan SQLProcedureColumns (Metadata Katalog)", sebelumnya dalam topik ini.
SQLDescribeCol
Nilai yang dikembalikan untuk UDT adalah sebagai berikut:
Tipe data SQL | DataTypePtr | ColumnSizePtr | DecimalDigitsPtr |
---|---|---|---|
SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT | n | 0 |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
SQL_SS_UDT | SQL_SS_LENGTH_UNLIMITED (0) | 0 |
SQLDescribeParam
Nilai yang dikembalikan untuk UDT adalah sebagai berikut:
Tipe data SQL | DataTypePtr | ColumnSizePtr | DecimalDigitsPtr |
---|---|---|---|
SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT | n | 0 |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
SQL_SS_UDT | SQL_SS_LENGTH_UNLIMITED (0) | 0 |
SQLFetch
Nilai kolom hasil UDT dikonversi dari jenis data SQL ke C seperti yang dijelaskan di bagian "Pengikatan dan Konversi", sebelumnya dalam topik ini.
SQLFetchScroll
Nilai kolom hasil UDT dikonversi dari jenis data SQL ke C seperti yang dijelaskan di bagian "Pengikatan dan Konversi", sebelumnya dalam topik ini.
SQLGetData
Nilai kolom hasil UDT dikonversi dari jenis data SQL ke C seperti yang dijelaskan di bagian "Pengikatan dan Konversi", sebelumnya dalam topik ini.
SQLGetDescField
Bidang deskriptor yang tersedia dengan jenis baru dijelaskan di bagian "Bidang Deskriptor untuk Parameter" dan "Bidang Deskriptor untuk Hasil", sebelumnya dalam topik ini.
SQLGetDescRec
Nilai yang dikembalikan untuk UDT adalah sebagai berikut:
Tipe data SQL | Jenis | SubType | Panjang | Presisi | Sisik |
---|---|---|---|---|---|
SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT | 0 | n | n | 0 |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
SQL_SS_UDT | 0 | SQL_SS_LENGTH_UNLIMITED (0) | SQL_SS_LENGTH_UNLIMITED (0) | 0 |
SQLGetTypeInfo
Nilai yang dikembalikan untuk UDT seperti yang dijelaskan di bagian "Metadata Dikembalikan oleh SQLColumns dan SQLProcedureColumns (Metadata Katalog)", sebelumnya dalam topik ini.
SQLProcedureColumns
Nilai yang dikembalikan untuk UDT seperti yang dijelaskan di bagian "Metadata Dikembalikan oleh SQLColumns dan SQLProcedureColumns (Metadata Katalog)", sebelumnya dalam topik ini.
SQLPutData
Nilai parameter UDT dikonversi dari jenis data C ke SQL seperti yang dijelaskan di bagian "Pengikatan dan Konversi", sebelumnya dalam topik ini.
SQLSetDescField
Bidang deskriptor yang tersedia dengan jenis baru dijelaskan di bagian "Bidang Deskriptor untuk Parameter" dan "Bidang Deskriptor untuk Hasil", sebelumnya dalam topik ini.
SQLSetDescRec
Nilai yang diizinkan untuk UDT adalah sebagai berikut:
Tipe data SQL | Jenis | SubType | Panjang | Presisi | Sisik |
---|---|---|---|---|---|
SQL_SS_UDT (panjang kurang dari atau sama dengan 8.000 byte) |
SQL_SS_UDT | 0 | n | n | 0 |
SQL_SS_UDT (panjang lebih besar dari 8.000 byte) |
SQL_SS_UDT | 0 | SQL_SS_LENGTH_UNLIMITED (0) | SQL_SS_LENGTH_UNLIMITED (0) | 0 |
SQLSpecialColumns
Nilai yang dikembalikan untuk kolom DATA_TYPE, TYPE_NAME, COLUMN_SIZE, BUFFER_LENGTH, dan UDT DECIMAL_DIGTS seperti yang dijelaskan di bagian "Metadata Dikembalikan oleh SQLColumns dan SQLProcedureColumns (Catalog Metadata)", sebelumnya dalam topik ini.