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

Peningkatan Tanggal dan Waktu (OLE DB)