Microsoft OLE DB-stuurprogramma voor SQL Server

OLE DB-stuurprogramma downloaden

De Microsoft OLE DB Driver for SQL Server is een zelfstandige data-toegangsapplicatie-programmeerinterface (API) die deel uitmaakt van OLE DB. Het verbindt C- en C++-applicaties met de Microsoft SQL Database Engine in Azure SQL Database, SQL-database in Microsoft Fabric, Azure SQL Managed Instance, en in ondersteunde versies van SQL Server. Microsoft bracht het voor het eerst uit in 2018 als versie 18 en nam het op in SQL Server 2019 (15.x).

MSOLEDBSQL19 is de huidige bestuurder. Het is over het algemeen achterwaarts compatibel met SQL Server Native Client (SNAC) en biedt functionaliteit die verder gaat dan zowel SNAC als de SQL Server OLE DB-provider die Windows Data Access Components (Windows DAC, voorheen Microsoft Data Access Components of MDAC) levert.

Uw beginpunt kiezen

Productiebasislijn voor Azure SQL

Gebruik dit fragment als uitgangspunt voor een productiegerichte Azure SQL-verbinding. Het laadt de servernaam en databasenaam vanuit applicatieconfiguratie, authenticeert met een beheerde identiteit zodat er geen geheim in de verbindingsreeks verschijnt, en schakelt Tabular Data Stream (TDS) 8.0-encryptie in met volledige certificaatvalidatie. Hiermee wordt per poging een time-out voor het maken van verbinding ingesteld, en bij tijdelijke fouten wordt opnieuw geprobeerd met exponentiële back-off en jitter.

Het C++-fragment in dit artikel laat include-directives, COM-initialisatie en de loghelper weg omwille van de beknoptheid.

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 en Connect Retry Interval maken veerkracht van een inactieve verbinding mogelijk, waarmee een verbinding die wegviel terwijl deze inactief was, transparant wordt hersteld. Ze proberen de initiële verbinding niet opnieuw, daarom implementeert dit fragment ook opnieuw proberen op applicatieniveau. Hou ze allebei.

Dit fragment bouwt zijn verbindingsreeks voor IDataInitialize::GetDataSource, die gebruikmaakt van de hier getoonde spreide trefwoordnamen, zoals Use Encryption for Data en Connect Retry Count. IDBInitialize::Initialize en ADO gebruiken verschillende namen voor dezelfde instellingen, zoals Encrypt en ConnectRetryCount.

GetDataSource accepteert een naam uit de verkeerde set zonder fout te veroorzaken, en de instelling treedt nooit in werking. De verbinding gebruikt dan de standaard driver, wat deze kan verzwakken. Encrypt=Strict op dit pad blijft de encryptie op Mandatory , MSOLEDBSQL19dus de verbinding laat TDS 8.0 vallen en onderhandelt de encryptie in de cleartext-prelogin, en laat de encryptie volledig uitgeschakeld op MSOLEDBSQL. Niet elk geval resulteert in een open fail: de onjuiste waarde TrustServerCertificate wordt op dezelfde manier genegeerd, waardoor de eigenschap op de standaardwaarde false blijft staan en certificaatvalidatie ingeschakeld blijft.

Reken er niet op dat een foutmelding de vergissing zal signaleren. Een naam die tot geen enkele verzameling behoort, zoals ZzzNotAKeyword, levert een Invalid verbindingsreeks attribute record op, maar een naam uit de verkeerde verzameling levert niets op. Om te controleren of een instelling van kracht is geworden, lees je de eigenschap opnieuw uit met IDBProperties::GetProperties voordat je verbinding maakt. Voor de trefwoordset die bij elke API hoort, zie Gebruik van verbindingsreeks keywords met OLE DB Driver for SQL Server.

OLE DB rapporteert diagnostiek via het foutobject in plaats van alleen het HRESULT foutobject, dus classificeer fouten voordat je het opnieuw probeert. Een authenticatie- of configuratiefout mislukt dan direct in plaats van het hele retrybudget te verbruiken.

Zie voor meer informatie over elk onderdeel van deze configuratie:

Voor de catalogus van Azure SQL tijdelijke fouten, zie tijdelijke foutcodes.

Belangrijkste kenmerken

  • Microsoft Entra ID-authenticatie: Wachtwoordloze verbindingen met beheerde identiteit, service principal, interactieve en geïntegreerde stromen.
  • Strikte encryptie: TDS 8.0-verbindingen met volledige certificaatvalidatie, en TLS 1.3 in versie 19.2.0 en latere versies.
  • Veerkracht bij inactieve verbindingen: Transparant herstellen van een verbinding die werd verbroken terwijl deze inactief was.
  • Meerdere actieve resultaatsets (MARS): Meer dan één in behandeling zijnde opdracht per verbinding.
  • Bulkkopie: Invoegingen met hoge verwerkingssnelheid via de bulkkopie-interfaces.
  • Parameters met tabelwaarde: Een volledige resultaatset die als één enkele parameter aan de server wordt doorgegeven.
  • Always On beschikbaarheidsgroepen: ondersteuning voor listeners met MultiSubnetFailover voor snelle failover.
  • UTF-8 en UTF-16 ondersteuning: Karaktergegevens in beide coderingen.
  • Dataclassificatie: Gevoeligheidsmetadata voor geclassificeerde kolommen.
  • Asynchrone bewerkingen: niet-blokkerende databron- en rijsetoperaties.

Aan de slag

Article Description
Wanneer gebruik je de OLE DB-driver Wanneer kiest u voor de OLE DB Driver for SQL Server boven de andere SQL Server-drivers.
Downloaden Downloads van het installatieprogramma voor alle ondersteunde driverversies.
Systeemvereisten Ondersteunde besturingssystemen, SQL Server-versies en vereisten om eerst te installeren.
Bouwtoepassingen Header- en bibliotheekbestanden, installatielay-out en wat verandert als je overstapt van MDAC.
Een applicatie maken De aanroepvolgorde die een applicatie volgt, van verbinden tot het uitvoeren van een commando tot het lezen van resultaten.
Ondersteuningslevenscyclus Welke driverversies worden ondersteund, en wanneer elke driver de ondersteuning verlaat.

Configureren en verbinding maken

Article Description
Trefwoorden voor verbindingsreeksen Elk trefwoord in de verbindingsreeks dat door het stuurprogramma wordt geaccepteerd, met de bijbehorende toegestane waarden.
Gegevensbronobjecten Maak de databron- en sessieobjecten waarop een verbinding is gebouwd aan en initialiseer.
ADO gebruiken met de driver Gebruik driverfuncties zoals MARS, querymeldingen en het XML-type vanuit ADO.
Hoge beschikbaarheid en herstel na noodgevallen Maak verbinding via een beschikbaarheidsgroep-luisteraar en de trefwoorden die failover-gedrag aansturen.
Idle verbindingsveerkracht Herstel automatisch een verbinding die is weggevallen terwijl hij inactief was.
LocalDB-ondersteuning Maak verbinding met een LocalDB-instantie voor lokale ontwikkeling en testen.

Authenticeren en beveiligen

Article Description
Microsoft Entra-id gebruiken De Microsoft Entra-authenticatiemodi die de driver ondersteunt, inclusief beheerde identiteit en interactief.
Versleuteling en certificaatvalidatie Stel Encrypt en TrustServerCertificate in, en bepaal hoe het servercertificaat wordt gevalideerd.
Wachtwoorden programmatisch wijzigen Behandel een verlopen wachtwoord en stel een nieuw wachtwoord in zonder je aanvraag te verlaten.
Ondersteuning voor Service principal name (SPN) in clientverbindingen Stel de service-principalnaam in voor een verbinding zodat wederzijdse Kerberos-authenticatie slaagt.
Gegevensclassificatie gebruiken Lees de gevoeligheidslabels die SQL Server teruggeeft voor geclassificeerde kolommen.

Voer commando's uit en verwerk resultaten

Article Description
Opdrachten De ICommand interface en het commando-objectmodel waarop de uitvoering van het commando is gebouwd.
Commandosyntaxis De combinatie van ODBC-SQL-, ISO- en Transact-SQL-syntaxis die het stuurprogramma in opdrachttekst accepteert.
Opdrachtparameters Markeer parameters in de commandotekst en bind de typen die de driver ondersteunt voor elk.
Gebruik van meerdere actieve resultaatsets (MARS) Houd meer dan één wachtend resultaat open op één verbinding.
Asynchrone bewerkingen uitvoeren Start een bewerking zonder de aanroepende thread te blokkeren en controleer regelmatig of wacht tot deze is voltooid.
Werken met querymeldingen Registreer je voor een melding wanneer het resultaat van een query op de server verandert.
Handleidingen voor het verwerken van resultaten Uitgewerkte voorbeelden die een opgeslagen procedure of functie uitvoeren en retourcodes, outputparameters en rijen lezen.

Werk met rijsets en cursors

Article Description
Rowsets De rowset-interfaces en de eigenschappen bepalen welk type rowset je krijgt.
Rijen ophalen Gebruik IRowset om rijen sequentieel op te halen, kolomwaarden te lezen en rijen vrij te geven.
Gegevens bijwerken in rijsets Vraag IRowsetChange of IRowsetUpdate aan om een wijzigbare rijenset te verkrijgen en beheer de vergrendeling ervan.
Bookmarks Sla een rijpositie op en kom er later op terug, in plaats van sequentieel te repetchen.
Rowsets en SQL Server-cursors Wanneer de driver een standaard resultaatset gebruikt en wanneer hij in plaats daarvan een servercursor opent.

Bulksgewijs kopiëren

Article Description
Uitvoeren van bulkkopiebewerkingen Verplaats grote hoeveelheden rijen in of uit een tabel via databestanden of programmavariabelen.
Gegevens in bulk kopiëren met IRowsetFastLoad Kopieer data in bulk naar een SQL Server-tabel met de IRowsetFastLoad interface.
Verzend BLOB-gegevens met IRowsetFastLoad en ISequentialStream Gebruik IRowsetFastLoad om BLOB-data met verschillende lengtes per rij naar SQL Server te streamen.

Parameters met tabelwaarde

Article Description
Overzicht van parameters met tabelwaarde Hoe tabelwaardige parameters meerdere rijen data in één enkele parameter naar de server sturen.
Verwijzing naar parameters met tabelwaarde Parameter-rijsetcreatie en parametertype-ontdekking.
Gegevens invoegen in tabelwaardige parameters Het push-model en het pull-model voor het aanleveren van parameterrijen met tabelwaarde.
Gebruik tabelwaardenparameters Maak een tabel-waarde parameter aan en geef de rijen door aan een opgeslagen procedure.

Werk met grote en binaire data

Article Description
BLOBs en OLE-objecten Lees en schrijf BLOB-kolommen als streams via ISequentialStream.
Grote data verkrijgen Haal een grote kolomwaarde in chunks op in plaats van één gebonden buffer.
Grote hoeveelheden gegevens instellen Stuur een grote kolomwaarde naar de server vanuit een consumentengeheugenobject.
FILESTREAM-ondersteuning Sla grote binaire waarden op die je kunt lezen via SQL Server of via het bestandssysteem.
FILESTREAM-artikelen met instructies Uitgewerkte voorbeelden die FILESTREAM-kolommen lezen en schrijven met streaming-interfaces.

Beheer tabellen, indexen en opgeslagen procedures

Article Description
Tabellen en indexen Aanmaken, wijzigen en plaatsen tabellen en indexen via ITableDefinition en IIndexDefinition.
SQL Server-tabellen aanmaken Definieer kolommen en roep ITableDefinition::CreateTable aan om een tabel te maken.
SQL Server-indexen aanmaken Definieer een nieuwe index op een bestaande tabel met IIndexDefinition::CreateIndex.
Stored procedures Roep een opgeslagen procedure aan met ODBC CALL-syntaxis of RPC, en lees de returncode en uitvoerparameters ervan.

Gegevenstypen

Article Description
Overzicht van gegevenstypen Hoe SQL Server-types worden gekoppeld aan OLE DB-types wanneer je parameters en kolommen bindt.
Toewijzing van gegevenstypen in rijverzamelingen en parameters De volledige typemappingtabel voor rowset-kolommen en commandoparameters.
Gebruik van grote waardetypen Koppel de typen varchar(max), nvarchar(max) en varbinary(max).
Gebruik van XML-datatypes Sla XML-documenten en -fragmenten op en haal deze op in een XML-kolom.
Gebruik van door de gebruiker gedefinieerde types Koppel door de gebruiker gedefinieerde CLR-typen, die het stuurprogramma als binaire waarden met typemetadata beschikbaar stelt.
Ondersteuning voor sparse kolommen Driverondersteuning voor spaarzame kolommen, die geoptimaliseerd zijn voor het opslaan van nulwaarden.
UTF-8-ondersteuning Werk met UTF-8-serversorteringen en UTF-8-tekencodering aan clientzijde.
UTF-16 ondersteuning Hoe de driver omgaat met surrogaatparen wanneer hij een clientbuffer vult.
Datum- en tijdverbeteringen Koppel de typen date, time, datetime2 en datetimeoffset, en de conversies die ze toestaan.

Transactions

Article Description
Overzicht van transacties Ondersteuning voor lokale transacties, en de Microsoft Distributed Transaction Coordinator voor gedistribueerde transacties.
Isolatieniveaus Stel het isolatieniveau voor een sessie in, en bepaal welke gelijktijdigheid elk niveau toestaat.
Werken met snapshot-isolatie Gebruik rijversies om gelijktijdige leesbewerkingen te verhogen zonder schrijvers te blokkeren.
Ondersteuning van gedistribueerde transacties Sluit een sessie in in een gedistribueerde transactie met ITransactionJoin::JoinTransaction.

Diagnosticeren en problemen oplossen

Article Description
Fouten Hoe de driver storingen rapporteert en welke interfaces de details bevatten.
Foutinformatie ophalen Loop door de foutinterfaces om de berichttekst, SQLSTATE en het native foutnummer te lezen.
Toegang tot diagnostische gegevens in het uitgebreide gebeurtenissenlogboek Zet driver tracing aan en lees het resulterende uitgebreide gebeurtenislogboek.
Bekende problemen Bekende problemen in de huidige driver, met tijdelijke oplossingen waar beschikbaar.
Opmerkingen bij de release Wat veranderde er bij elke driverrelease, de nieuwste eerst.

Migreren naar de huidige driver

Er zijn drie generaties Microsoft OLE DB-aanbieders voor SQL Server. Gebruik MSOLEDBSQL19 voor nieuwe en bestaande applicaties en zet bestaande verbindingsstrings ernaar om. De OLE DB-provider werd in 2018 niet langer als verouderd beschouwd en opnieuw uitgebracht.

Generation Provider-tekenreeks Status
Microsoft OLE DB Driver for SQL Server (dit artikel) MSOLEDBSQL19, MSOLEDBSQL Supported. MSOLEDBSQL19 is de huidige driver en degene die moet worden gebruikt voor nieuwe ontwikkelingen.
SQL Server Native Client (SNAC) SQLNCLI11, SQLNCLI Verwijderd uit SQL Server 2022 en SQL Server Management Studio 19. Niet aanbevolen voor nieuwe ontwikkelingen.
Microsoft OLE DB Provider voor SQL Server SQLOLEDB Wordt geleverd met Windows Data Access Components. Niet langer onderhouden. Niet aanbevolen voor nieuwe ontwikkelingen.
Article Description
Verschillen in belangrijkste versies van MSOLEDBSQL Ingrijpende wijzigingen tussen OLE DB Driver 19 en versie 18, waaronder standaardinstellingen voor versleuteling, wijzigingen in eigenschapstypen en migratiestappen.
Een applicatie bijwerken vanuit MDAC Wat is er veranderd tussen de oude OLE DB Provider voor SQL Server en de huidige driver, en wat je moet controleren voordat je updatet?
Een applicatie bijwerken vanuit SQL Server 2005 Native Client De grote veranderingen in de OLE DB Driver for SQL Server sinds de SQL Server Native Client in SQL Server 2005 (9.x).

Reference

Article Description
OLE DB-stuurprogramma voor SQL Server-functies Index van de driverspecifieke functies en waar elke functie is gedocumenteerd.
OLE DB-programmering Het COM API-model dat de driver blootstelt, en hoe het communiceert met SQL Server via TDS.
OLE DB-handleidingen Index van de OOLE-DB how-to artikelen, gegroepeerd per taak.
OLE DB-interfaces De OLE DB-interfaces en methoden die provider-specifiek gedrag vertonen in deze driver.
Ondersteuning voor schema-rijsets Provider-specifiek schema-rowsetgedrag, inclusief metadata die worden teruggegeven van gekoppelde servers.
Meer informatie vinden Specificaties, voorbeelden en communitybronnen buiten deze documentatieset.