Fitur Tanggal dan Waktu Baru dengan Versi SQL Server Sebelumnya (OLE DB)
Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)
Topik ini menjelaskan perilaku yang diharapkan ketika aplikasi klien yang menggunakan fitur tanggal dan waktu yang ditingkatkan berkomunikasi dengan versi SQL Server yang lebih lama dari SQL Server 2008 (10.0.x), dan ketika klien dikompilasi dengan versi SQL Server Native Client yang lebih lama dari SQL Server 2008 (10.0.x) mengirimkan perintah ke server yang mendukung fitur tanggal dan waktu yang ditingkatkan.
Perilaku Klien Tingkat Bawah
Aplikasi klien yang menggunakan versi SQL Server Native Client yang lebih lama dari SQL Server 2008 (10.0.x) melihat jenis tanggal/waktu baru sebagai kolom nvarchar . Konten kolom adalah representasi harfiah. Untuk informasi selengkapnya, lihat bagian "Format Data: String dan Literal" dari Dukungan Jenis Data untuk Peningkatan Tanggal dan Waktu OLE DB. Ukuran kolom adalah panjang harfiah maksimum untuk presisi yang ditentukan untuk kolom.
API Katalog akan mengembalikan metadata yang konsisten dengan kode jenis data tingkat bawah yang dikembalikan ke klien (misalnya, nvarchar) dan representasi tingkat bawah terkait (misalnya, format literal yang sesuai). Namun, nama jenis data yang dikembalikan akan menjadi nama jenis SQL Server 2008 (10.0.x) asli.
Ketika aplikasi klien tingkat bawah berjalan terhadap server SQL Server 2008 (10.0.x) (atau yang lebih baru) di mana skema berubah ke jenis tanggal/waktu telah dibuat, perilaku yang diharapkan adalah sebagai berikut:
Jenis klien OLE DB | Jenis SQL Server 2005 | Jenis SQL Server 2008 (atau yang lebih baru) | Konversi hasil (server ke klien) | Konversi parameter (klien ke server) |
---|---|---|---|---|
DBTYPE_DBDATE | Tanggalwaktu | Tanggal | OK | OK |
DBTYPE_DBTIMESTAMP | Bidang waktu diatur ke nol. | IRowsetChange akan gagal karena pemotongan string jika bidang waktu bukan nol. | ||
DBTYPE_DBTIME | Waktu(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Bidang tanggal diatur ke tanggal saat ini. | IRowsetChange akan gagal karena pemotongan string jika detik pecahan bukan nol. Tanggal diabaikan. |
||
DBTYPE_DBTIME | Waktu(7) | Gagal - waktu harfiah tidak valid. | OK | |
DBTYPE_DBTIMESTAMP | Gagal - waktu harfiah tidak valid. | OK | ||
DBTYPE_DBTIMESTAMP | Datetime2(3) | OK | OK | |
DBTYPE_DBTIMESTAMP | Datetime2(7) | OK | OK | |
DBTYPE_DBDATE | Waktu smalldatetime | Tanggal | OK | OK |
DBTYPE_DBTIMESTAMP | Bidang waktu diatur ke nol. | IRowsetChange akan gagal karena pemotongan string jika bidang waktu bukan nol. | ||
DBTYPE_DBTIME | Waktu(0) | OK | OK | |
DBTYPE_DBTIMESTAMP | Bidang tanggal diatur ke tanggal saat ini. | IRowsetChange akan gagal karena pemotongan string jika detik pecahan bukan nol. Tanggal diabaikan. |
||
DBTYPE_DBTIMESTAMP | Datetime2(0) | OK | OK |
OK berarti bahwa jika bekerja dengan SQL Server 2005 (9.x), itu harus terus bekerja dengan SQL Server 2008 (10.0.x) (atau yang lebih baru).
Hanya perubahan skema umum berikut yang telah dipertimbangkan:
Menggunakan jenis baru di mana aplikasi secara logis hanya memerlukan nilai tanggal atau waktu. Namun, aplikasi dipaksa untuk menggunakan tanggalwaktu atau smalldatetime karena jenis tanggal dan waktu terpisah tidak tersedia.
Menggunakan jenis baru untuk mendapatkan presisi atau akurasi detik pecahan tambahan.
Beralih ke datetime2 karena ini adalah jenis data pilihan untuk tanggal dan waktu.
Aplikasi yang menggunakan metadata server yang diperoleh melalui ICommandWithParameters::GetParameterInfo atau set baris skema untuk mengatur informasi jenis parameter melalui ICommandWithParameters::SetParameterInfo akan gagal selama konversi klien di mana representasi string dari jenis sumber lebih besar dari representasi string dari jenis tujuan. Misalnya, jika pengikatan klien menggunakan DBTYPE_DBTIMESTAMP dan kolom server adalah tanggal, SQL Server Native Client akan mengonversi nilai menjadi "yyyy-dd-mm hh:mm:ss.fff", tetapi metadata server akan dikembalikan sebagai nvarchar(10). Luapan yang dihasilkan menyebabkan DBSTATUS_E_CATCONVERTVALUE. Masalah serupa muncul dengan konversi data oleh IRowsetChange, karena metadata set baris diatur dari metadata resultset.
Metadata Parameter dan Set Baris
Bagian ini menjelaskan metadata untuk parameter, kolom hasil, dan set baris skema untuk klien yang dikompilasi dengan versi SQL Server Native Client yang lebih lama dari SQL Server 2008 (10.0.x).
ICommandWithParameters::GetParameterInfo
Struktur DBPARAMINFO mengembalikan informasi berikut melalui parameter prgParamInfo :
Jenis parameter | wType | ulParamSize | bPresisi | bScale |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | ~0 | ~0 |
waktu | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datetime | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
tanggalwaktu2 | DBTYPE_WSTR | 19,21..27 | ~0 | ~0 |
tanggalwaktulewat | DBTYPE_WSTR | 26,28..34 | ~0 | ~0 |
Perhatikan bahwa beberapa rentang nilai ini tidak berkelanjutan; misalnya, 9 hilang di 8,10..16. Hal ini disebabkan oleh penambahan titik desimal ketika presisi pecahan lebih besar dari nol.
IColumnsRowset::GetColumnsRowset
Kolom berikut dikembalikan:
Jenis kolom | DBCOLUMN_TYPE | DBCOLUMN_COLUMNSIZE | DBCOLUMN_PRECISION | DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | NULL | NULL |
waktu | DBTYPE_WSTR | 8, 10..16 | NULL | NULL |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datetime | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
tanggalwaktu2 | DBTYPE_WSTR | 19,21..27 | NULL | NULL |
tanggalwaktulewat | DBTYPE_WSTR | 26,28..34 | NULL | NULL |
ColumnsInfo::GetColumnInfo
Struktur DBCOLUMNINFO mengembalikan informasi berikut:
Jenis Parameter | wType | ulColumnSize | bPresisi | bScale |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | ~0 | ~0 |
time(1..7) | DBTYPE_WSTR | 8, 10..16 | ~0 | ~0 |
smalldatetime | DBTYPE_DBTIMESTAMP | 16 | 16 | 0 |
datetime | DBTYPE_DBTIMESTAMP | 16 | 23 | 3 |
tanggalwaktu2 | DBTYPE_WSTR | 19,21..27 | ~0 | ~0 |
tanggalwaktulewat | DBTYPE_WSTR | 26,28..34 | ~0 | ~0 |
Kumpulan Baris Skema
Bagian ini membahas metadata untuk parameter, kolom hasil, dan himpunan baris skema untuk jenis data baru. Informasi ini berguna adalah Anda memiliki penyedia klien yang dikembangkan menggunakan alat yang lebih lama dari SQL Server 2008 (10.0.x) SQL Server Native Client.
Kumpulan Baris KOLOM
Nilai kolom berikut dikembalikan untuk jenis tanggal/waktu:
Jenis kolom | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | DATETIME_PRECISION |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | 20 | NULL |
waktu | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | NULL |
smalldatetime | DBTYPE_DBTIMESTAMP | NULL | NULL | 0 |
datetime | DBTYPE_DBTIMESTAMP | NULL | NULL | 3 |
tanggalwaktu2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | NULL |
tanggalwaktulewat | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | NULL |
PROCEDURE_PARAMETERS Rowset
Nilai kolom berikut dikembalikan untuk jenis tanggal/waktu:
Jenis kolom | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | TYPE_NAME LOCAL_TYPE_NAME |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | 20 | date |
waktu | DBTYPE_WSTR | 8, 10..16 | 16,20..32 | waktu |
smalldatetime | DBTYPE_DBTIMESTAMP | NULL | NULL | smalldatetime |
datetime | DBTYPE_DBTIMESTAMP | NULL | NULL | datetime |
tanggalwaktu2 | DBTYPE_WSTR | 19,21..27 | 38,42..54 | tanggalwaktu2 |
tanggalwaktulewat | DBTYPE_WSTR | 26,28..34 | 52, 56..68 | tanggalwaktulewat |
PROVIDER_TYPES Rowset
Baris berikut dikembalikan untuk jenis tanggal/waktu:
Jenis-> Kolom |
date | waktu | smalldatetime | datetime | tanggalwaktu2 | tanggalwaktulewat |
---|---|---|---|---|---|---|
TYPE_NAME | date | waktu | smalldatetime | datetime | tanggalwaktu2 | tanggalwaktulewat |
DATA_TYPE | DBTYPE_WSTR | DBTYPE_WSTR | DBTYPE_DBTIMESTAMP | DBTYPE_DBTIMESTAMP | DBTYPE_WSTR | DBTYPE_WSTR |
COLUMN_SIZE | 10 | 16 | 16 | 23 | 27 | 34 |
LITERAL_PREFIX | ' | ' | ' | ' | ' | ' |
LITERAL_SUFFIX | ' | ' | ' | ' | ' | ' |
CREATE_PARAMS | NULL | NULL | NULL | NULL | NULL | NULL |
IS_NULLABLE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE | VARIANT_TRUE |
CASE_SENSITIVE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
DAPAT DICARI | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE | DB_SEARCHABLE |
UNSIGNED_ATTRIBUTE | NULL | NULL | NULL | NULL | NULL | NULL |
FIXED_PREC_SCALE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
AUTO_UNIQUE_VALUE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
LOCAL_TYPE_NAME | date | waktu | smalldatetime | datetime | tanggalwaktu2 | tanggalwaktulewat |
MINIMUM_SCALE | NULL | NULL | NULL | NULL | NULL | NULL |
MAXIMUM_SCALE | NULL | NULL | NULL | NULL | NULL | NULL |
GUID | NULL | NULL | NULL | NULL | NULL | NULL |
TYPELIB | NULL | NULL | NULL | NULL | NULL | NULL |
VERSION | NULL | NULL | NULL | NULL | NULL | NULL |
IS_LONG | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
BEST_MATCH | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_TRUE | VARIANT_FALSE | VARIANT_FALSE |
IS_FIXEDLENGTH | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE | VARIANT_FALSE |
Perilaku Server Tingkat Bawah
Saat tersambung ke server versi yang lebih lama dari SQL Server 2008 (10.0.x), setiap upaya untuk menggunakan nama jenis server baru (misalnya, dengan ICommandWithParameters::SetParameterInfo atau ITableDefinition::CreateTable) akan menghasilkan DB_E_BADTYPENAME.
Jika jenis baru terikat untuk parameter atau hasil tanpa penggunaan nama jenis, dan jenis baru digunakan untuk menentukan jenis server secara implisit atau tidak ada konversi yang valid dari jenis server ke jenis klien, DB_E_ERRORSOCCURRED dikembalikan, dan DBBINDSTATUS_UNSUPPORTED_CONVERSION diatur sebagai status pengikatan untuk aksesor yang digunakan di Execute.
Jika ada konversi klien yang didukung dari jenis buffer ke jenis server untuk versi server pada koneksi, semua jenis buffer klien dapat digunakan. Dalam konteks ini, jenis server berarti jenis yang ditentukan oleh ICommandWithParameters::SetParameterInfo, atau disiratkan oleh jenis buffer jika ICommandWithParameters::SetParameterInfo belum dipanggil. Ini berarti bahwa DBTYPE_DBTIME2 dan DBTYPE_DBTIMESTAMPOFFSET dapat digunakan dengan server tingkat bawah, atau ketika DataTypeCompatibility=80, jika konversi klien ke jenis server yang didukung berhasil. Tentu saja, jika jenis server salah, kesalahan mungkin masih dilaporkan oleh server jika tidak dapat melakukan konversi implisit ke jenis server aktual.
Perilaku SSPROP_INIT_DATATYPECOMPATIBILITY
Saat SSPROP_INIT_DATATYPECOMPATIBILITY diatur ke SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, jenis tanggal/waktu baru dan metadata terkait muncul ke klien saat muncul untuk klien tingkat bawah, seperti yang dijelaskan dalam Perubahan Salin Massal untuk Tipe Tanggal dan Waktu yang Ditingkatkan (OLE DB dan ODBC).
Perbandingan untuk IRowsetFind
Semua operator perbandingan diizinkan untuk jenis tanggal/waktu baru, karena muncul sebagai jenis string daripada jenis tanggal/waktu.
Lihat Juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk