Memperbarui Aplikasi dari Klien Asli SQL Server 2005

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Penting

SQL Server Native Client (sering disingkat SNAC) telah dihapus dari SQL Server 2022 (16.x) dan SQL Server Management Studio 19 (SSMS). SQL Server Native Client (SQLNCLI atau SQLNCLI11) dan Penyedia Microsoft OLE DB warisan untuk SQL Server (SQLOLEDB) tidak direkomendasikan untuk pengembangan aplikasi baru. Beralih ke Microsoft OLE DB Driver (MSOLEDBSQL) baru untuk SQL Server atau Microsoft ODBC Driver terbaru untuk SQL Server ke depannya. Untuk SQLNCLI yang dikirim sebagai komponen SQL Server Database Engine (versi 2012 hingga 2019), lihat pengecualian Siklus Hidup Dukungan ini.

Topik ini membahas perubahan yang melanggar di SQL Server Native Client sejak SQL Server Native Client di SQL Server 2005 (9.x).

Saat Anda meningkatkan dari Microsoft Data Access Components (MDAC) ke SQL Server Native Client, Anda mungkin juga melihat beberapa perbedaan perilaku. Untuk informasi selengkapnya, lihat Memperbarui Aplikasi ke SQL Server Native Client dari MDAC.

SQL Server Native Client 9.0 dikirim dengan SQL Server 2005 (9.x). SQL Server Native Client 10.0 dikirim dengan SQL Server 2008 (10.0.x). SQL Server Native Client 10.5 dikirim dengan SQL Server 2008 R2 (10.50.x). SQL Server Native Client 11.0 dikirim dengan SQL Server 2012 (11.x) dan SQL Server 2014 (12.x).

Perilaku yang diubah di SQL Server Native Client Sejak SQL Server 2005 (9.x) Deskripsi
Bantalan OLE DB hanya untuk skala yang ditentukan. Untuk konversi di mana data yang dikonversi dikirim ke server, SQL Server Native Client (dimulai di SQL Server 2008 (10.0.x)) bantalan berikutnya nol dalam data hanya hingga panjang maksimum nilai tanggalwaktu . SQL Server Native Client 9.0 diisi hingga 9 digit.
Validasi DBTYPE_DBTIMESTAMP untuk ICommandWithParameter::SetParameterInfo. SQL Server Native Client (dimulai di SQL Server 2008 (10.0.x)) mengimplementasikan persyaratan OLE DB untuk bScale di ICommandWithParameter::SetParameterInfo untuk diatur ke presisi detik pecahan untuk DBTYPE_DBTIMESTAMP.
Prosedur tersimpan sp_columns sekarang mengembalikan "TIDAK" alih-alih "TIDAK" untuk kolom IS_NULLABLE. Dimulai di SQL Server Native Client 10.0 (SQL Server 2008 (10.0.x)), sp_columns prosedur tersimpan sekarang mengembalikan "TIDAK" alih-alih "TIDAK" untuk kolom IS_NULLABLE.
SQLSetDescRec, SQLBindParameter, dan SQLBindCol sekarang melakukan pemeriksaan konsistensi. Sebelum SQL Server Native Client 10.0, pengaturan SQL_DESC_DATA_PTR tidak menyebabkan pemeriksaan konsistensi untuk jenis deskriptor apa pun di SQLSetDescRec, SQLBindParameter, atau SQLBindCol.
SQLCopyDesc sekarang melakukan pemeriksaan konsistensi deskriptor. Sebelum SQL Server Native Client 10.0, SQLCopyDesc tidak melakukan pemeriksaan konsistensi ketika bidang SQL_DESC_DATA_PTR diatur pada catatan tertentu.
SQLGetDescRec tidak lagi melakukan pemeriksaan konsistensi deskriptor. Sebelum SQL Server Native Client 10.0, SQLGetDescRec melakukan pemeriksaan konsistensi deskriptor saat bidang SQL_DESC_DATA_PTR diatur. Ini tidak diperlukan oleh spesifikasi ODBC dan di SQL Server Native Client 10.0 (SQL Server 2008 (10.0.x)) dan versi yang lebih baru, pemeriksaan konsistensi ini tidak lagi dilakukan.
Kesalahan berbeda ditampilkan ketika tanggal berada di luar rentang. Untuk jenis tanggalwaktu, nomor kesalahan yang berbeda akan dikembalikan oleh SQL Server Native Client (dimulai di SQL Server 2008 (10.0.x)) untuk tanggal di luar rentang daripada yang dikembalikan dalam versi sebelumnya.

Secara khusus, SQL Server Native Client 9.0 mengembalikan 22007 untuk semua nilai tahun di luar rentang dalam konversi string ke datetime, dan SQL Server Native Client dimulai dengan versi 10.0 (SQL Server 2008 (10.0.x)) mengembalikan 22008 ketika tanggal berada dalam rentang yang didukung oleh datetime2 tetapi di luar rentang yang didukung oleh tanggalwaktu atau smalldatetime.
nilai tanggalwaktu memotong detik pecahan dan tidak dibulatkan jika pembulatan akan mengubah hari. Sebelum SQL Server Native Client 10.0, perilaku klien untuk nilai tanggalwaktu yang dikirim ke server adalah membulatkannya ke 1/300 detik terdekat. Dimulai di SQL Server Native Client 10.0, skenario ini menyebabkan pemotongan detik pecahan jika pembulatan berubah hari.
Kemungkinan trunction detik untuk nilai tanggalwaktu . Aplikasi yang dibangun dengan Klien Asli SQL Server 2008 (10.0.x) (atau yang lebih baru) yang tersambung ke server SQL Server 2005 akan memotong detik dan detik pecahan untuk bagian waktu data yang dikirim ke server jika Anda mengikat ke kolom tanggalwaktu dengan pengidentifikasi jenis DBTYPE_DBTIMESTAMP (OLE DB) atau SQL_TIMESTAMP (ODBC) dan skala 0.

Contohnya:

Data input: 1994-08-21 21:21:36.000

Data yang disisipkan: 1994-08-21 21:21:00.000
Konversi data OLE DB dari DBTYPE_DBTIME ke DBTYPE_DATE tidak lagi dapat menyebabkan hari berubah. Sebelum SQL Server Native Client 10.0, jika bagian waktu DBTYPE_DATE dalam setengah detik tengah malam, kode konversi OLE DB menyebabkan hari berubah. Dimulai di SQL Server Native Client 10.0, hari tidak akan berubah (detik pecahan dipotong dan tidak dibulatkan).
Perubahan konversi IBCPSession::BCColFmt. Dimulai di SQL Server Native Client 10.0, saat Anda menggunakan IBCPSession::BCOColFmt untuk mengonversi SQLDATETIME atau SQLDATETIME ke jenis string, nilai pecahan diekspor. Misalnya, saat mengonversi jenis SQLDATETIME untuk mengetik SQLNVARCHARMAX, versi SQL Server Native Client yang lebih lama dikembalikan

1989-02-01 00:00:00. SQL Server Native Client 10.0 dan versi yang lebih baru mengembalikan 1989-02-01 00:00:00.00000000.
Ukuran data yang dikirim harus cocok dengan panjang yang ditentukan dalam SQL_LEN_DATA_AT_EXEC. Saat menggunakan SQL_LEN_DATA_AT_EXEC, ukuran data harus sesuai dengan panjang yang Anda tentukan dengan SQL_LEN_DATA_AT_EXEC. Anda dapat menggunakan SQL_DATA_AT_EXEC tetapi ada potensi manfaat performa untuk menggunakan SQL_LEN_DATA_AT_EXEC.
Aplikasi kustom yang menggunakan API BCP sekarang dapat melihat peringatan. API BCP akan menghasilkan pesan peringatan jika panjang data lebih besar dari panjang yang ditentukan untuk bidang untuk semua jenis. Sebelumnya, peringatan ini hanya diberikan untuk jenis karakter, tetapi tidak akan dikeluarkan untuk semua jenis.
Menyisipkan string kosong ke dalam sql_variant terikat sebagai jenis tanggal/waktu menghasilkan kesalahan. Di SQL Server Native Client 9.0, memasukkan string kosong ke dalam sql_variant terikat sebagai jenis tanggal/waktu tidak menghasilkan kesalahan. SQL Server Native Client 10.0 (dan yang lebih baru) menghasilkan kesalahan dalam situasi ini dengan benar.
Validasi parameter SQL_C_TYPE _TIMESTAMP dan DBTYPE_DBTIMESTAMP yang lebih ketat. Sebelum Klien Asli SQL Server 2008 (10.0.x), nilai tanggalwaktu dibulatkan agar sesuai dengan skala kolom datetime dan smalldatetime oleh SQL Server. SQL Server 2008 (10.0.x) Native Client (dan yang lebih baru) menerapkan aturan validasi yang lebih ketat yang ditentukan dalam spesifikasi inti ODBC untuk detik pecahan. Jika nilai parameter tidak dapat dikonversi ke jenis SQL dengan menggunakan skala yang ditentukan atau tersirat oleh pengikatan klien tanpa pemotongan digit berikutnya, kesalahan dikembalikan.
SQL Server mungkin mengembalikan hasil yang berbeda saat pemicu berjalan. Perubahan yang diperkenalkan di SQL Server 2008 (10.0.x) dapat menyebabkan aplikasi memiliki hasil yang berbeda yang dikembalikan dari pernyataan yang menyebabkan pemicu berjalan ketika NOCOUNT OFF berlaku. Dalam situasi ini, aplikasi Anda mungkin menghasilkan kesalahan. Untuk mengatasi kesalahan ini, atur NOCOUNT ON di pemicu atau panggil SQLMoreResults untuk melanjutkan ke hasil berikutnya.

Lihat Juga

Pemrograman Klien Asli SQL Server