Driver OLE DB di Microsoft per SQL Server

Download del driver OLE DB

Il Microsoft OLE DB Driver per SQL Server è un'interfaccia di programmazione applicativa (API) autonoma per l'accesso ai dati che fa parte di OLE DB. Collega applicazioni in C e C++ al Microsoft SQL motore di database in database SQL di Azure, SQL database in Microsoft Fabric, Istanza gestita di SQL di Azure e nelle versioni supportate di SQL Server. Microsoft lo ha rilasciato per la prima volta nel 2018 come versione 18 e l'ha incluso in SQL Server 2019 (15.x).

MSOLEDBSQL19 è l'attuale pilota. È generalmente retrocompatibile con SQL Server Native Client (SNAC) e offre funzionalità oltre sia SNAC che il provider SQL Server OLE DB che Windows Data Access Components (Windows DAC, precedentemente Microsoft Data Access Components, o MDAC) fornisce.

Scegliere il punto di partenza

Baseline di produzione per Azure SQL

Usare questo frammento di codice come punto di partenza per una connessione Azure SQL orientata alla produzione. Carica il nome del server e il nome del database dalla configurazione dell'applicazione, si autentica con un'identità gestita in modo che non compaia alcun segreto nella stringa di connessione e abilita la crittografia Tabular Data Stream (TDS) 8.0 con validazione completa del certificato. Imposta un timeout per ogni tentativo di connessione e riprova i fallimenti transitori con retrocesso esponenziale e jitter.

Il frammento in C++ in questo articolo omette include, inizializzazione COM e l'aiuto per la loging, per brevità.

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 e Connect Retry Interval abilitano la resilienza delle connessioni inattive, che ripristina automaticamente una connessione caduta durante l'inattività. Non riprovano il collegamento iniziale, motivo per cui questo frammento implementa anche il retry a livello di applicazione. Tieni entrambi.

Questo snippet costruisce la sua stringa di connessione per IDataInitialize::GetDataSource, che utilizza i nomi di parole chiave distanziate mostrati qui, come Use Encryption for Data e Connect Retry Count. IDBInitialize::Initialize e ADO usano nomi diversi per le stesse impostazioni, come Encrypt e ConnectRetryCount.

GetDataSource accetta un nome dal set sbagliato senza generare errori, e l'impostazione non si verifica mai. La connessione poi usa il driver predefinito, il che può indebolirla. Encrypt=Strict su questo percorso lascia la crittografia su MandatoryMSOLEDBSQL19, quindi la connessione interrompe TDS 8.0 e negozia la crittografia nel prelogin cleartext, lasciando la crittografia completamente disattivata su MSOLEDBSQL. Non in tutti i casi il sistema passa a una modalità aperta: l'impostazione errata TrustServerCertificate viene scartata allo stesso modo, lasciando la proprietà al valore predefinito false e lasciando attiva la convalida del certificato.

Non fare affidamento su un messaggio di errore per individuare lo sbaglio. Un nome che non appartiene a nessun insieme, come ZzzNotAKeyword, produce un Invalid stringa di connessione attribute record, ma un nome proveniente dall'insieme sbagliato non produce nulla. Per confermare che un'impostazione abbia avuto effetto, leggi nuovamente la proprietà con IDBProperties::GetProperties prima di connetterti. Per il set di parole chiave che accompagna ogni API, vedi Using stringa di connessione keywords with OLE DB Driver per SQL Server.

OLE DB fornisce le informazioni diagnostiche tramite l'oggetto errore anziché tramite il solo HRESULT, quindi classifica gli errori prima di riprovare. Un errore di autenticazione o di configurazione provoca un fallimento immediato, anziché consumare l'intero limite di tentativi.

Per altre informazioni su ogni parte di questa configurazione, vedere:

Per il catalogo degli errori transitori di Azure SQL, vedere codici di errore transitorio.

Funzionalità principali

  • Autenticazione Microsoft Entra ID: Connessioni senza password con identità gestita, service principal, flussi interattivi e integrati.
  • Crittografia rigorosa: connessioni TDS 8.0 con validazione completa dei certificati, e TLS 1.3 nella versione 19.2.0 e successive.
  • Resilienza della connessione inattiva: Ripristino trasparente di una connessione che si è interrotta mentre era inattiva.
  • Set di risultati attivi multipli (MARS): più di una richiesta in sospeso per una connessione.
  • Copia in massa: inserti ad alta produttività tramite le interfacce di copia in massa.
  • Parametri a valori di tabella: un intero set di risultati passato al server come un singolo parametro.
  • Gruppi di disponibilità Always On: supporto del listener con MultiSubnetFailover per il failover rapido.
  • Supporto per UTF-8 e UTF-16: Dati di caratteri in entrambe le codifiche.
  • Classificazione dei dati: Metadati di sensibilità per colonne classificate.
  • Operazioni asincrone: operazioni di sorgenti dati non bloccanti e di set di righe.

Inizia subito

Article Description
Quando utilizzare il driver OLE DB Quando scegliere il driver OLE DB Driver per SQL Server rispetto agli altri driver di SQL Server.
Download Download dell'installer per ogni versione supportata del driver.
Requisiti di sistema Sistemi operativi supportati, versioni di SQL Server e prerequisiti per installare prima.
Applicazioni edilizie Header e file della libreria, layout di installazione e cosa cambia quando si aggiorna da MDAC.
Creazione di un'applicazione La sequenza di chiamate che un'applicazione segue, dalla connessione all'esecuzione di un comando fino alla lettura dei risultati.
Ciclo di vita del supporto Quali versioni del driver sono supportate e quando ognuna lascia il supporto.

Configurazione e connessione

Article Description
Parole chiave della stringa di connessione Ogni parola chiave della stringa di connessione accettata dal driver, con i relativi valori consentiti.
Oggetti origine dati Crea e inizializza la sorgente di dati e gli oggetti di sessione da cui si costruisce una connessione.
Utilizzo di ADO con il driver Funzionalità del driver Reach come MARS, notifiche di query e il tipo xml da ADO.
Disponibilità elevata e ripristino di emergenza Connettiti tramite un listener del gruppo di disponibilità e specifica le parole chiave che controllano il comportamento di failover.
Resilienza della connessione inattiva Ripristina automaticamente una connessione che si è interrotta mentre era inattiva.
Supporto LocalDB Connettiti a un'istanza LocalDB per sviluppo e test locali.

Autenticazione e sicurezza

Article Description
Come usare Microsoft Entra ID Le modalità di autenticazione Microsoft Entra supportate dal driver, inclusa identità gestita e interattiva.
Crittografia e convalida di certificati Imposta Encrypt e TrustServerCertificate, e controlla come il certificato server viene validato.
Modifica delle password in modo programmativo Gestisci una password scaduta e impostarne una nuova senza uscire dalla tua applicazione.
Supporto del nome principale del servizio (SPN) nelle connessioni client Imposta il nome del principale del servizio su una connessione in modo che l'autenticazione reciproca di Kerberos abbia successo.
Uso della classificazione dei dati Leggi le etichette di sensibilità che SQL Server restituisce per le colonne classificate.

Eseguire comandi e processare i risultati

Article Description
Comandi L'interfaccia ICommand e il modello di comando su cui si basa l'esecuzione del comando.
Sintassi di comando La combinazione di sintassi SQL ODBC, ISO e Transact-SQL accettata dal driver nel testo del comando.
Parametri di comando Segna i parametri nel testo del comando e assegna i tipi supportati dal driver per ciascuno.
Utilizzo di più set di risultati attivi (MARS) Tieni aperto più di un set di risultati in attesa su una singola connessione.
Esecuzione di operazioni asincrone Avvia un'operazione senza bloccare il thread chiamante ed esegui il polling oppure attendi il completamento.
Utilizzo delle notifiche di query Registrati per ricevere una notifica quando il risultato di una query cambia sul server.
Articoli pratici sull'elaborazione dei risultati Esempi lavorati che eseguono una procedura o funzione memorizzata e leggono codici di ritorno, parametri di output e righe.

Lavorare con righe e cursori

Article Description
Insiemi di righe Le interfacce di rowset e le proprietà che decidono quale tipo di rowset scegliere.
Righe di ritiro Usalo IRowset per recuperare le righe in sequenza, leggere i valori delle colonne e rilasciare righe.
Aggiornamento dei dati nei rowset Richiedi IRowsetChange o IRowsetUpdate per ottenere un rowset modificabile e controllarne il blocco.
Segnalibri Salva la posizione di una riga e tornaci più tardi, anziché recuperarla nuovamente in sequenza.
Righe e cursori SQL Server Quando il driver utilizza un set di risultati predefinito e apre invece un cursore del server.

Copia in blocco

Article Description
Esecuzione di operazioni di copia in blocco Sposta grandi volumi di righe dentro o fuori da una tabella tramite file di dati o variabili di programma.
Copia in massa dei dati usando IRowsetFastLoad Copia i dati in massa in una tabella SQL Server con l'interfacciaIRowsetFastLoad.
Invia dati BLOB usando IRowsetFastLoad e ISequentialStream Usalo IRowsetFastLoad per trasmettere dati BLOB di lunghezza variabile per riga a SQL Server.

Parametri con valori di tabella

Article Description
Panoramica dei parametri con valori di tabella Come i parametri a valori di tabella passano più righe di dati al server in un unico parametro.
Riferimento del parametro con valori di tabella Creazione di set di righe di parametri e scoperta del tipo di parametro.
Inserimento dei dati in parametri a valori di tabella Il modello push e il modello pull per fornire righe dei parametri con valori di tabella.
Usa parametri a valori di tabella Creare un parametro a valori di tabella e passare le sue righe a una procedura memorizzata.

Lavoro con dati grandi e binari

Article Description
BLOB e oggetti OLE Leggi e scrivi le colonne BLOB come flussi attraverso ISequentialStream.
Ottenere dati di grandi dimensioni Recupera un grande valore di colonna in blocchi invece di un buffer vincolato.
Impostazione di dati di grandi dimensioni Invia un valore di colonna grande al server da un oggetto di archiviazione consumer.
Supporto FILESTREAM Memorizza grandi valori binari che puoi leggere tramite SQL Server o tramite il file system.
Articoli pratici su FILESTREAM Esempi pratici che leggono e scrivono colonne FILESTREAM tramite interfacce di streaming.

Gestione di tabelle, indici e procedure memorizzate

Article Description
Tabelle e indici Creare, modificare e rilasciare tabelle e indici tramite ITableDefinition e IIndexDefinition.
Creazione di tabelle SQL Server Definisci colonne e chiama ITableDefinition::CreateTable per creare una tabella.
Creazione di indici SQL Server Definisci un nuovo indice su una tabella esistente con IIndexDefinition::CreateIndex.
Procedure memorizzate Chiama una procedura memorizzata con la sintassi CALL di ODBC o RPC e leggine il codice restituito e i parametri di uscita.

Tipi di dati

Article Description
Panoramica dei tipi di dati Come i tipi SQL Server si mappano ai tipi OLE DB quando associ parametri e colonne.
Mappatura dei tipi di dati in set di righe e parametri La tabella completa di mappatura dei tipi per colonne di righe e parametri di comando.
Uso di tipi di grande valore Associare i tipi varchar(max), nvarchar(max) e varbinary(max).
Utilizzo di tipi di dati XML Memorizza e recupera documenti XML e frammenti in una colonna xml.
Utilizzo di tipi definiti dall'utente Associa i tipi CLR definiti dall'utente, che il driver espone come valori binari con metadati del tipo.
Supporto delle colonne spoglie Supporto del driver per colonne sparse, ottimizzate per memorizzare valori nulli.
Supporto UTF-8 Utilizza le collazioni del server UTF-8 e la codifica del client UTF-8.
Supporto UTF-16 Come il driver gestisce le coppie surrogate quando riempie un buffer client.
Miglioramenti di data e orario Associare i tipi date, time, datetime2 e datetimeoffset e le conversioni che consentono.

Transactions

Article Description
Panoramica delle transazioni Supporto alle transazioni locali e il Microsoft Distributed Transaction Coordinator per le transazioni distribuite.
Livelli di isolamento Imposta il livello di isolamento per una sessione e quale concorrenza consente ogni livello.
Lavorare con l'isolamento degli snapshot Usa il controllo delle versioni di riga per aumentare la concorrenza in lettura senza bloccare le operazioni di scrittura.
Supporto delle transazioni distribuite Inserisci una sessione in una transazione distribuita con ITransactionJoin::JoinTransaction.

Diagnosticare e risolvere i problemi

Article Description
Errori Come il driver segnala i guasti e quali interfacce portano i dettagli.
Recupero delle informazioni sugli errori Percorre le interfacce di errore per leggere il testo del messaggio, SQLSTATE e il numero di errore nativo.
Accesso alle informazioni di diagnostica nel log degli eventi estesi Attiva il tracciamento del pilota e leggi il registro degli eventi estesi risultante.
Problemi noti Problemi aperti nel driver attuale, con soluzioni alternative dove ce ne sono.
Note di rilascio Cosa è cambiato in ogni release del driver, l'ultimo per primo.

Migra al driver corrente

Esistono tre generazioni di provider Microsoft OLE DB per SQL Server. Usa MSOLEDBSQL19 per le applicazioni nuove ed esistenti e converti in MSOLEDBSQL19 le stringhe di connessione esistenti. Il provider OLE DB non è più stato considerato deprecato ed è stato rilasciato nuovamente nel 2018.

Generazione Stringa del provider Condizione
Microsoft OLE DB Driver per SQL Server (questo articolo) MSOLEDBSQL19, MSOLEDBSQL Supportato. MSOLEDBSQL19 è il motore attuale e quello da utilizzare per nuovi sviluppi.
SQL Server Client Nativo (SNAC) SQLNCLI11, SQLNCLI Rimosso da SQL Server 2022 e SQL Server Management Studio 19. Non consigliato per nuovi sviluppi.
Microsoft OLE DB Provider per SQL Server SQLOLEDB Viene fornito in Windows Data Access Components. Non più mantenuto. Non consigliato per nuovi sviluppi.
Article Description
Differenze tra le versioni principali di MSOLEDBSQL Interruzione tra il driver OLE DB 19 e la versione 18, inclusi valori predefiniti di crittografia, modifiche al tipo di proprietà e passaggi di migrazione.
Aggiornare una domanda da MDAC Cosa è cambiato tra il vecchio OLE DB Provider per SQL Server e l'attuale driver, e cosa controllare prima di aggiornare.
Aggiornamento di un'applicazione da SQL Server 2005 Native Client I cambiamenti principali in OLE DB Driver per SQL Server dopo SQL Server Native Client in SQL Server 2005 (9.x).

Reference

Article Description
Funzionalità di OLE DB Driver per SQL Server Indice delle caratteristiche specifiche del driver e dove ciascuna è documentata.
Programmazione OLE DB Il modello COM API che il driver espone e come comunica con SQL Server tramite TDS.
Articoli pratici su OLE DB Indice degli articoli pratici di OLE DB, raggruppati per compito.
Interfacce OLE DB Le interfacce e i metodi OLE DB che mostrano un comportamento specifico del provider in questo driver.
Supporto per il set di righe dello schema Comportamento del rowset dello schema specifico del provider, compresi i metadati restituiti dai server collegati.
Trovare ulteriori informazioni Specifiche, esempi e risorse della comunità al di fuori di questo set di documentazione.