Driver Microsoft OLE DB untuk SQL Server

Unduh driver OLE DB

Microsoft OLE DB Driver for SQL Server adalah antarmuka pemrograman aplikasi akses data (API) mandiri yang merupakan bagian dari OLE DB. Ini menghubungkan aplikasi C dan C++ ke Microsoft SQL Database Engine di Azure SQL Database, database SQL di Microsoft Fabric, Azure SQL Managed Instance, dan versi SQL Server yang didukung. Microsoft pertama kali merilisnya pada tahun 2018 sebagai versi 18 dan menyertakannya dalam SQL Server 2019 (15.x).

MSOLEDBSQL19 adalah driver saat ini. Secara umum, ini kompatibel dengan versi sebelumnya dari SQL Server Native Client (SNAC), dan menyediakan fungsionalitas yang melampaui SNAC maupun penyedia SQL Server OLE DB yang disediakan oleh Windows Data Access Components (Windows DAC, sebelumnya Microsoft Data Access Components, atau MDAC).

Pilih titik awal Anda

Garis besar produksi untuk Azure SQL

Gunakan cuplikan ini sebagai titik awal untuk koneksi Azure SQL berorientasi produksi. Aplikasi ini memuat nama server dan nama database dari konfigurasi aplikasi, mengautentikasi dengan identitas terkelola sehingga tidak ada rahasia yang muncul di string koneksi, dan mengaktifkan enkripsi Tabular Data Stream (TDS) 8.0 dengan validasi sertifikat penuh. Mengatur batas waktu koneksi untuk setiap percobaan, dan mencoba lagi saat terjadi kegagalan sementara dengan backoff eksponensial dan jitter.

Cuplikan C++ dalam artikel ini tidak menyertakan direktif include, inisialisasi COM, dan fungsi bantu logging demi keringkasan.

std::wstring BuildConnectionString(const wchar_t* server, const wchar_t* database) {
    std::wstring cs = L"Provider=MSOLEDBSQL19";
    cs += L";Data Source=tcp:"; cs += server; cs += L",1433";
    cs += L";Initial Catalog="; cs += database;
    cs += L";Authentication=ActiveDirectoryMSI";   // managed identity, no stored secret
    cs += L";Use Encryption for Data=Strict";      // TDS 8.0 with certificate validation
    cs += L";Connect Timeout=30";                  // per-attempt connect timeout, in seconds
    cs += L";Connect Retry Count=3";               // idle connection resiliency, not initial connect
    cs += L";Connect Retry Interval=10";
    return cs;
}

// Transient fault codes documented for Azure SQL, plus the resource governance
// codes. Network termination and timeout errors (64, 233, 258, 10053, 10054,
// 10060) are retried a bounded number of times, which is the documented
// guidance for them. 258 is the code the driver reports for a connect timeout.
// 10053 and 10054 can also mean the encryption handshake failed rather than a
// plain network reset, so read the error text before assuming a network fault.
bool IsTransient(LONG nativeError) {
    switch (nativeError) {
        case 615: case 926: case 4060: case 4221:
        case 10928: case 10929: case 10936:
        case 40197: case 40501: case 40613:
        case 42108: case 42109:
        case 49918: case 49919: case 49920:
        case 40020: case 40143: case 40166: case 40540:   // failover subcodes
        case 64: case 233: case 258:
        case 10053: case 10054: case 10060:
            return true;
        default:
            return false;
    }
}

// Retries only errors that a new connection can clear, with exponential backoff
// plus jitter so that concurrent clients don't retry in lockstep.
HRESULT ConnectWithRetry(IDataInitialize* pDataInit, const std::wstring& connectionString,
                         int maxAttempts, IDBInitialize** ppDbInit) {
    HRESULT hr = E_FAIL;
    *ppDbInit = nullptr;
    for (int attempt = 1; attempt <= maxAttempts; ++attempt) {
        IDBInitialize* pDbInit = nullptr;
        hr = pDataInit->GetDataSource(nullptr, CLSCTX_INPROC_SERVER, connectionString.c_str(),
                                      IID_IDBInitialize, reinterpret_cast<IUnknown**>(&pDbInit));
        if (SUCCEEDED(hr) && SUCCEEDED(hr = pDbInit->Initialize())) {
            Log("INFO", "connected on attempt %d/%d", attempt, maxAttempts);
            *ppDbInit = pDbInit;
            return S_OK;
        }

        // Walks IErrorRecords and returns the first record that carries a real
        // SQL Server error number. Transport and timeout failures report a
        // generic wrapper record first, whose native error is 0. Errors the
        // server returns carry the number on the first record.
        LONG native = LogProviderErrors("connect", hr);
        if (pDbInit) pDbInit->Release();
        if (attempt == maxAttempts || !IsTransient(native)) return hr;

        // Cap the backoff at 64 seconds. This also keeps the shift in range
        // when a caller passes a large maxAttempts.
        int shift = (attempt - 1 < 6) ? attempt - 1 : 6;
        DWORD delayMs = (1UL << shift) * 1000UL + (DWORD)(GetTickCount64() % 500);
        Log("WARN", "retrying in %lu ms (attempt %d/%d)", delayMs, attempt + 1, maxAttempts);
        Sleep(delayMs);
    }
    return hr;
}

Connect Retry Count dan Connect Retry Interval mengaktifkan ketahanan koneksi idle, yang secara transparan memulihkan koneksi yang terputus saat idle. Mereka tidak mencoba ulang koneksi awal, karena itu cuplikan kode ini juga menerapkan mekanisme percobaan ulang di tingkat aplikasi. Simpan keduanya.

Cuplikan ini menyusun string koneksi untuk IDataInitialize::GetDataSource, yang menggunakan nama kata kunci yang dipisahkan spasi seperti yang ditunjukkan di sini, seperti Use Encryption for Data dan Connect Retry Count. IDBInitialize::Initialize dan ADO menggunakan nama yang berbeda untuk pengaturan yang sama, seperti Encrypt dan ConnectRetryCount.

GetDataSource menerima nama dari himpunan yang salah tanpa menimbulkan kesalahan, dan pengaturan tersebut tidak pernah berlaku. Koneksi tersebut kemudian menggunakan pengaturan bawaan driver, yang dapat melemahkan koneksi. Encrypt=Strict pada jalur ini membiarkan enkripsi tetap pada Mandatory di MSOLEDBSQL19, sehingga koneksi tidak lagi menggunakan TDS 8.0 dan menegosiasikan enkripsi dalam prelogin teks biasa, serta membiarkan enkripsi sepenuhnya nonaktif di MSOLEDBSQL. Tidak semua kasus berakhir dalam keadaan terbuka: TrustServerCertificate yang disetel secara keliru dibuang dengan cara yang sama, sehingga properti tetap pada nilai bawaan false dan validasi sertifikat tetap aktif.

Jangan berharap pesan kesalahan akan mendeteksi kekeliruan tersebut. Nama yang tidak termasuk dalam himpunan manapun, seperti ZzzNotAKeyword, menghasilkan catatan Invalid string koneksi attribute , tetapi nama dari himpunan yang salah tidak menghasilkan apa-apa. Untuk memastikan bahwa suatu pengaturan telah diterapkan, baca kembali properti tersebut dengan IDBProperties::GetProperties sebelum Anda menyambung. Untuk kumpulan kata kunci untuk setiap API, lihat Menggunakan kata kunci string koneksi dengan OLE DB Driver for SQL Server.

OLE DB melaporkan diagnostik melalui objek galat, bukan hanya melalui HRESULT, jadi klasifikasikan kegagalan sebelum mencoba ulang. Kesalahan autentikasi atau konfigurasi kemudian gagal seketika alih-alih menghabiskan seluruh anggaran percobaan ulang.

Untuk informasi selengkapnya tentang setiap bagian konfigurasi ini, lihat:

Untuk katalog kesalahan sementara Azure SQL, lihat kode kesalahan gangguan sementara.

Fitur utama

  • Autentikasi Microsoft Entra ID: Koneksi tanpa kata sandi dengan alur identitas terkelola, prinsipal layanan, interaktif, dan terintegrasi.
  • Enkripsi ketat: koneksi TDS 8.0 dengan validasi sertifikat penuh, dan TLS 1.3 pada versi 19.2.0 dan versi setelahnya.
  • Ketahanan koneksi saat idle: Pemulihan koneksi secara transparan yang terputus saat idle.
  • Beberapa set hasil aktif (MARS): Lebih dari satu permintaan yang tertunda per koneksi.
  • Salin massal: Penyisipan throughput tinggi melalui antarmuka salin massal.
  • Parameter bernilai tabel: Satu set hasil lengkap yang diteruskan ke server sebagai satu parameter.
  • Grup ketersediaan Always On: Dukungan listener dengan MultiSubnetFailover untuk failover cepat.
  • Dukungan UTF-8 dan UTF-16: Data karakter dalam kedua pengodean.
  • Klasifikasi data: Metadata sensitivitas untuk kolom yang diklasifikasikan.
  • Operasi asinkron: Operasi sumber data dan rowset tanpa blokir.

Get started

Article Description
Terhubung dan membuat kueri dengan C++ Instal driver, hubungkan ke Azure SQL Database, database SQL di Fabric, atau SQL Server, jalankan kueri yang diparameterkan, dan verifikasi hasilnya.
Kapan menggunakan Driver OLE DB Kapan memilih OLE DB Driver for SQL Server dibandingkan driver SQL Server lainnya.
Mengunduh Unduhan installer untuk setiap versi driver yang didukung.
Persyaratan sistem Sistem operasi yang didukung, versi SQL Server, dan prasyarat untuk menginstal terlebih dahulu.
Aplikasi bangunan File header dan pustaka, tata letak instalasi, dan apa yang berubah saat Anda melakukan upgrade dari MDAC.
Membuat aplikasi Urutan panggilan yang diikuti aplikasi, mulai dari menghubungkan hingga menjalankan perintah hingga membaca hasil.
Siklus hidup dukungan Versi driver mana yang didukung, dan kapan masing-masing keluar dari dukungan.

Mengonfigurasi dan menyambungkan

Article Description
Kata kunci string koneksi Setiap kata kunci string koneksi yang diterima oleh driver, beserta nilai yang didukung.
Objek sumber data Buat dan inisialisasi objek sumber data dan sesi yang menjadi dasar koneksi.
Menggunakan ADO dengan driver Akses fitur driver seperti MARS, notifikasi kueri, dan tipe XML melalui ADO.
Ketersediaan tinggi dan pemulihan bencana Terhubung melalui listener grup ketersediaan, dan kata kunci yang mengontrol perilaku failover.
Ketahanan koneksi idle Secara otomatis memulihkan koneksi yang terputus saat tidak aktif.
Dukungan LocalDB Hubungkan ke instance LocalDB untuk pengembangan dan pengujian lokal.

Autentikasi dan amankan

Article Description
Menggunakan ID Microsoft Entra Mode autentikasi Microsoft Entra yang didukung oleh driver, termasuk managed identity dan interactive.
Enkripsi dan validasi sertifikat Atur Enkripsi dan TrustServerCertificate, serta kendalikan bagaimana sertifikat server divalidasi.
Mengubah kata sandi secara programatik Tangani kata sandi yang kedaluwarsa dan atur kata sandi baru tanpa meninggalkan aplikasi Anda.
Dukungan nama Service principal (SPN) dalam koneksi klien Atur nama prinsipal layanan pada koneksi agar autentikasi timbal balik Kerberos berhasil.
Menggunakan klasifikasi data Baca label sensitivitas yang dikembalikan SQL Server untuk kolom yang diklasifikasikan.

Menjalankan perintah dan memproses hasil

Article Description
Perintah Antarmuka ICommand dan model objek perintah yang menjadi dasar pelaksanaan perintah.
Sintaks perintah Campuran sintaks ODBC SQL, ISO, dan Transact-SQL yang diterima oleh driver dalam teks perintah.
Parameter perintah Tandai parameter dalam teks perintah, dan ikat tipe yang didukung driver untuk masing-masing.
Menggunakan beberapa set hasil aktif (MARS) Biarkan lebih dari satu kumpulan hasil yang masih tertunda tetap terbuka pada satu koneksi.
Melakukan operasi asinkron Mulailah operasi tanpa memblokir thread pemanggil, lalu polling atau tunggu hingga selesai.
Bekerja dengan notifikasi kueri Daftar untuk notifikasi ketika hasil kueri berubah di server.
Artikel panduan hasil pemrosesan Contoh yang telah dikerjakan yang menjalankan prosedur atau fungsi tersimpan dan membaca kode pengembalian, parameter output, dan baris.

Bekerja dengan rowset dan kursor

Article Description
Kumpulan baris Antarmuka rowset dan properti yang menentukan jenis rowset yang Anda peroleh.
Mengambil baris Gunakan IRowset untuk mengambil baris secara berurutan, membaca nilai kolom, dan melepaskan baris.
Memperbarui data dalam rowset Minta IRowsetChange atau IRowsetUpdate untuk memperoleh rowset yang dapat dimodifikasi, dan mengatur pengunciannya.
Bookmarks Simpan posisi baris dan kembali ke posisi tersebut nanti, alih-alih mengambil ulang secara berurutan.
Kumpulan baris dan kursor SQL Server Saat driver menggunakan kumpulan hasil bawaan dan saat driver akan membuka kursor server sebagai gantinya.

Penyalinan massal

Article Description
Melakukan operasi salinan massal Pindahkan volume baris besar ke dalam atau keluar dari tabel melalui file data atau variabel program.
Salin data secara massal menggunakan IRowsetFastLoad Salin data secara massal ke dalam tabel SQL Server dengan IRowsetFastLoad antarmuka.
Kirim data BLOB menggunakan IRowsetFastLoad dan ISequentialStream Gunakan IRowsetFastLoad untuk streaming data BLOB dengan panjang bervariasi per baris ke SQL Server.

Parameter dengan nilai tabel

Article Description
Ikhtisar parameter bernilai tabel Bagaimana parameter bernilai tabel meneruskan beberapa baris data ke server dalam satu parameter.
Referensi parameter bernilai tabel Pembuatan baris parameter dan penemuan tipe parameter.
Menyisipkan data ke dalam parameter bernilai tabel Model push dan model pull untuk menyediakan baris parameter bernilai tabel.
Gunakan parameter bernilai tabel Buat parameter bernilai tabel dan teruskan baris-barisnya ke prosedur tersimpan.

Bekerja dengan data besar dan biner

Article Description
BLOBs dan objek OLE Baca dan tulis kolom BLOB sebagai stream melalui ISequentialStream.
Mendapatkan data besar Ambil nilai kolom besar dalam potongan daripada satu buffer terikat.
Mengatur data besar Kirim nilai kolom besar ke server dari objek penyimpanan konsumen.
Dukungan FILESTREAM Simpan nilai biner besar yang dapat Anda baca melalui SQL Server atau melalui sistem file.
artikel panduan FILESTREAM Contoh yang telah dikerjakan yang membaca dan menulis kolom FILESTREAM dengan antarmuka streaming.

Kelola tabel, indeks, dan prosedur tersimpan

Article Description
Tabel dan indeks Buat, ubah, dan tempatkan tabel serta indeks melalui ITableDefinition dan IIndexDefinition.
Membuat tabel SQL Server Tentukan kolom dan panggil ITableDefinition::CreateTable untuk membuat tabel.
Membuat indeks SQL Server Definisikan indeks baru pada tabel yang sudah ada dengan IIndexDefinition::CreateIndex.
Prosedur tersimpan Panggil prosedur tersimpan dengan sintaks ODBC CALL atau RPC, dan baca kode pengembalian serta parameter outputnya.

Jenis data

Article Description
Ikhtisar tipe data Bagaimana tipe SQL Server dipetakan ke tipe OLE DB saat Anda mengikat parameter dan kolom.
Pemetaan tipe data dalam rowset dan parameter Tabel pemetaan tipe lengkap untuk kolom rowset dan parameter perintah.
Menggunakan tipe nilai besar Ikat tipe varchar(max), nvarchar(max), dan varbinary(max).
Menggunakan tipe data XML Simpan dan ambil dokumen dan fragmen XML dalam kolom XML.
Menggunakan tipe yang didefinisikan pengguna Ikat tipe CLR yang ditentukan pengguna, yang diekspos oleh driver sebagai nilai biner dengan metadata tipe.
Dukungan kolom sparse Dukungan driver untuk kolom sparse, yang dioptimalkan untuk menyimpan nilai null.
Dukungan UTF-8 Bekerja dengan kolasi server UTF-8 dan pengkodean klien UTF-8.
Dukungan UTF-16 Bagaimana driver menangani pasangan surrogate saat mengisi buffer klien.
Perbaikan tanggal dan waktu Ikatkan tipe date, time, datetime2, dan datetimeoffset, beserta konversi yang diizinkan.

Transactions

Article Description
Ikhtisar transaksi dukungan transaksi lokal, dan Koordinator Transaksi Terdistribusi Microsoft untuk transaksi terdistribusi.
Tingkat isolasi Atur tingkat isolasi untuk sebuah sesi, dan konkurensi yang diizinkan setiap level.
Bekerja dengan isolasi snapshot Gunakan versi baris untuk meningkatkan konkurensi baca tanpa memblokir penulis.
Mendukung transaksi terdistribusi Daftarkan sesi dalam transaksi terdistribusi dengan ITransactionJoin::JoinTransaction.

Mendiagnosis dan memecahkan masalah

Article Description
Troubleshooting Diagnosis kegagalan penyedia, autentikasi, sertifikat, jaringan, parameter, konversi, dan timeout berdasarkan gejalanya.
Kesalahan Bagaimana pengemudi melaporkan kegagalan, dan antarmuka mana yang membawa detailnya.
Mengambil informasi kesalahan Telusuri antarmuka kesalahan untuk membaca teks pesan, SQLSTATE, dan nomor kesalahan asli.
Mengakses informasi diagnostik dalam log peristiwa yang diperluas Aktifkan pelacakan driver dan baca log peristiwa lanjutan yang dihasilkan.
Masalah umum Isu yang belum terselesaikan pada driver saat ini, beserta solusi sementara jika tersedia.
Catatan rilis Apa yang berubah di setiap rilis driver, yang terbaru duluan.

Migrasi ke driver saat ini

Ada tiga generasi penyedia Microsoft OLE DB untuk SQL Server. Gunakan MSOLEDBSQL19 untuk aplikasi baru dan yang sudah ada, dan konversi string koneksi yang sudah ada ke aplikasi tersebut. Penyedia OLE DB tidak lagi dinyatakan usang dan dirilis ulang pada tahun 2018.

Generation string penyedia Status
Microsoft OLE DB Driver for SQL Server (artikel ini) MSOLEDBSQL19, MSOLEDBSQL Supported. MSOLEDBSQL19 adalah driver saat ini dan yang sebaiknya digunakan untuk pengembangan baru.
SQL Server Native Client (SNAC) SQLNCLI11, SQLNCLI Dihapus dari SQL Server 2022 dan SQL Server Management Studio 19. Tidak direkomendasikan untuk pengembangan baru.
Penyedia Microsoft OLE DB untuk SQL Server SQLOLEDB Disertakan dalam Windows Data Access Components. Tidak lagi dipelihara. Tidak direkomendasikan untuk pengembangan baru.
Article Description
Perbedaan versi utama MSOLEDBSQL Memecah perubahan antara OLE DB Driver 19 dan versi 18, termasuk default enkripsi, perubahan tipe properti, dan langkah migrasi.
Memperbarui aplikasi dari MDAC Apa yang berubah antara OLE DB Provider lama untuk SQL Server dan driver saat ini, serta apa yang harus diperiksa sebelum Anda memperbarui.
Memperbarui aplikasi dari Klien Asli SQL Server 2005 Perubahan terbaru pada OLE DB Driver for SQL Server sejak SQL Server Native Client di SQL Server 2005 (9.x).

Reference

Article Description
Driver OLE DB untuk fitur SQL Server Indeks fitur khusus driver dan lokasi dokumentasi masing-masing.
Pemrograman OLE DB Model API COM yang diekspos driver, dan cara driver tersebut berkomunikasi dengan SQL Server melalui TDS.
Artikel panduan OLE DB Indeks artikel panduan OLE DB, dikelompokkan berdasarkan tugas.
Antarmuka OLE DB Antarmuka dan metode OLE DB yang menunjukkan perilaku spesifik penyedia pada driver ini.
Dukungan untuk rowset skema Perilaku rowset skema khusus penyedia, termasuk metadata yang dikembalikan dari server tertaut.
Menemukan informasi lebih lanjut Spesifikasi, sampel, dan sumber daya komunitas di luar set dokumentasi ini.

Meminta fitur

Untuk meminta fitur, kirimkan ide melalui umpan balik SQL Server.