Bagikan melalui


Fitur Tanggal dan Waktu Baru dengan Versi SQL Server Sebelumnya (OLE DB)

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, dan ketika klien dikompilasi dengan versi SQL Server Native Client yang lebih lama dari SQL Server 2008 mengirim 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 melihat jenis tanggal/waktu baru sebagai nvarchar kolom. 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 harfiah yang sesuai). Namun, nama jenis data yang dikembalikan akan menjadi nama jenis SQL Server 2008 yang sebenarnya.

Ketika aplikasi klien tingkat bawah berjalan terhadap server SQL Server 2008 (atau yang lebih baru) di mana skema berubah menjadi 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 OKE OKE
DBTYPE_DBTIMESTAMP Bidang waktu diatur ke nol. IRowsetChange akan gagal karena pemotongan string jika bidang waktu bukan nol.
DBTYPE_DBTIME Waktu(0) OKE OKE
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. OKE
DBTYPE_DBTIMESTAMP Gagal - waktu harfiah tidak valid. OKE
DBTYPE_DBTIMESTAMP Datetime2(3) OKE OKE
DBTYPE_DBTIMESTAMP Datetime2(7) OKE OKE
DBTYPE_DBDATE Waktu smalldatetime Tanggal OKE OKE
DBTYPE_DBTIMESTAMP Bidang waktu diatur ke nol. IRowsetChange akan gagal karena pemotongan string jika bidang waktu bukan nol.
DBTYPE_DBTIME Waktu(0) OKE OKE
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) OKE OKE

OK berarti bahwa jika bekerja dengan SQL Server 2005, itu harus terus bekerja dengan SQL Server 2008 (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 datetime 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 tipe 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 kumpulan baris skema untuk klien yang dikompilasi dengan versi SQL Server Native Client yang lebih lama dari SQL Server 2008.

ICommandWithParameters::GetParameterInfo

Struktur DBPARAMINFO mengembalikan informasi berikut melalui parameter prgParamInfo :

Jenis parameter wType ulParamSize bPresisi bScale
tanggal DBTYPE_WSTR 10 ~0 ~0
waktu DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
Tanggal dan waktu DBTYPE_DBTIMESTAMP 16 Dua puluh tiga 3
tanggalwaktu2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset (pergeseran tanggal dan waktu) 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:

Tipe kolom DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION
tanggal DBTYPE_WSTR 10 NOL NOL
waktu DBTYPE_WSTR 8, 10..16 NOL NOL
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
Tanggal dan waktu DBTYPE_DBTIMESTAMP 16 Dua puluh tiga 3
tanggalwaktu2 DBTYPE_WSTR 19,21..27 NOL NOL
datetimeoffset (pergeseran tanggal dan waktu) DBTYPE_WSTR 26,28..34 NOL NOL

ColumnsInfo::GetColumnInfo

Struktur DBCOLUMNINFO mengembalikan informasi berikut:

Jenis Parameter wType ulColumnSize bPresisi bScale
tanggal DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
Tanggal dan waktu DBTYPE_DBTIMESTAMP 16 Dua puluh tiga 3
tanggalwaktu2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset (pergeseran tanggal dan waktu) 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 SQL Server Native Client.

Kumpulan Baris KOLOM

Nilai kolom berikut dikembalikan untuk jenis tanggal/waktu:

Tipe kolom DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
tanggal DBTYPE_WSTR 10 20 NOL
waktu DBTYPE_WSTR 8, 10..16 16,20..32 NOL
smalldatetime DBTYPE_DBTIMESTAMP NOL NOL 0
Tanggal dan waktu DBTYPE_DBTIMESTAMP NOL NOL 3
tanggalwaktu2 DBTYPE_WSTR 19,21..27 38,42..54 NOL
datetimeoffset (pergeseran tanggal dan waktu) DBTYPE_WSTR 26,28..34 52, 56..68 NOL

PROCEDURE_PARAMETERS Rowset

Nilai kolom berikut dikembalikan untuk jenis tanggal/waktu:

Tipe kolom DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NAMA_TIPE

LOCAL_TYPE_NAME
tanggal DBTYPE_WSTR 10 20 tanggal
waktu DBTYPE_WSTR 8, 10..16 16,20..32 waktu
smalldatetime DBTYPE_DBTIMESTAMP NOL NOL smalldatetime
Tanggal dan waktu DBTYPE_DBTIMESTAMP NOL NOL Tanggal dan waktu
tanggalwaktu2 DBTYPE_WSTR 19,21..27 38,42..54 tanggalwaktu2
datetimeoffset (pergeseran tanggal dan waktu) DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset (pergeseran tanggal dan waktu)

PROVIDER_TYPES Rowset

Baris berikut dikembalikan untuk jenis tanggal/waktu:

Jenis->

kolom
tanggal waktu smalldatetime Tanggal dan waktu tanggalwaktu2 datetimeoffset (pergeseran tanggal dan waktu)
NAMA_TIPE tanggal waktu smalldatetime Tanggal dan waktu tanggalwaktu2 datetimeoffset (pergeseran tanggal dan waktu)
DATA_TYPE DBTYPE_WSTR DBTYPE_WSTR DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP DBTYPE_WSTR DBTYPE_WSTR
COLUMN_SIZE 10 16 16 Dua puluh tiga 27 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS NOL NOL NOL NOL NOL NOL
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 NOL NOL NOL NOL NOL NOL
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 tanggal waktu smalldatetime Tanggal dan waktu tanggalwaktu2 datetimeoffset (pergeseran tanggal dan waktu)
MINIMUM_SCALE NOL NOL NOL NOL NOL NOL
MAXIMUM_SCALE NOL NOL NOL NOL NOL NOL
- GUID NOL NOL NOL NOL NOL NOL
TYPELIB NOL NOL NOL NOL NOL NOL
VERSI NOL NOL NOL NOL NOL NOL
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, 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).

Kemampuan Pembandingan 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)