Microsoft OLE DB-Treiber für SQL Server

OLE DB-Treiber herunterladen

Der Microsoft OLE DB-Treiber für SQL Server ist eine eigenständige Datenzugriffs-Anwendungsprogrammierschnittstelle (API), die Teil von OLE DB ist. Es verbindet C- und C++-Anwendungen mit der Microsoft SQL Datenbank-Engine in Azure SQL-Datenbank, SQL-Datenbank in Microsoft Fabric, Azure SQL Managed Instance und in unterstützten Versionen von SQL Server. Microsoft veröffentlichte es erstmals 2018 als Version 18 und integrierte es in SQL Server 2019 (15.x).

MSOLEDBSQL19 ist der aktuelle Fahrer. Es ist im Allgemeinen abwärtskompatibel mit SQL Server Native Client (SNAC) und bietet Funktionen, die über die von SNAC und dem SQL Server OLE DB-Anbieter bereitgestellten hinausgehen, der von Windows Data Access Components (Windows DAC, früher Microsoft Data Access Components oder MDAC) bereitgestellt wird.

Auswählen des Startpunkts

Produktionsbasisplan für Azure SQL

Verwenden Sie diesen Codeausschnitt als Ausgangspunkt für eine produktionsorientierte Azure SQL Verbindung. Er lädt den Servernamen und den Datenbanknamen aus der Anwendungskonfiguration, authentifiziert sich mit einer verwalteten Identität, sodass kein Geheimnis in der Verbindungszeichenfolge erscheint, und aktiviert die Verschlüsselung von Tabular Data Stream (TDS) 8.0 mit vollständiger Zertifikatsvalidierung. Es legt ein Verbindungs-Timeout pro Versuch fest und wiederholt bei vorübergehenden Fehlern den Verbindungsversuch mit exponentiellem Backoff und Jitter.

Der C++-Ausschnitt in diesem Artikel lässt der Kürze halber Includes, die COM-Initialisierung und die Hilfsfunktion für die Protokollierung weg.

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 und Connect Retry Interval aktivieren die Resilienz von Leerlaufverbindungen, wodurch eine Verbindung, die während des Leerlaufs unterbrochen wurde, transparent wiederhergestellt wird. Sie wiederholen den anfänglichen Verbindungsaufbau nicht, weshalb dieses Codebeispiel auch eine Wiederholungslogik auf Anwendungsebene implementiert. Behalte beides.

Dieser Codeausschnitt erstellt seine Verbindungszeichenfolge für IDataInitialize::GetDataSource, das die hier gezeigten Schlüsselwortnamen mit Leerzeichen verwendet, z. B. Use Encryption for Data und Connect Retry Count. IDBInitialize::Initialize und ADO verwenden für dieselben Settings unterschiedliche Bezeichnungen, wie Encrypt zum Beispiel und ConnectRetryCount.

GetDataSource akzeptiert einen Namen aus der falschen Menge, ohne einen Fehler zu erzeugen, und die Einstellung tritt nie in Kraft. Die Verbindung verwendet dann den Treiber-Standard, was ihn schwächen kann. Encrypt=Strict auf diesem Pfad bleibt die Verschlüsselung auf Mandatory , MSOLEDBSQL19sodass die Verbindung TDS 8.0 abbricht und die Verschlüsselung im Cleartext-Prelogin aushandelt, und die Verschlüsselung bleibt vollständig auf MSOLEDBSQL. Nicht in jedem Fall kommt es zu einem Fail-open-Verhalten: Der falsch gesetzte Wert TrustServerCertificate wird auf die gleiche Weise verworfen, sodass die Eigenschaft auf dem Standardwert false bleibt und die Zertifikatsvalidierung aktiviert bleibt.

Verlassen Sie sich nicht darauf, dass ein Fehler einen Fehler aufdeckt. Ein Name, der zu keiner Menge gehört, wie ZzzNotAKeyword, erzeugt einen Invalid Verbindungszeichenfolge attribute Datensatz, aber ein Name aus der falschen Menge erzeugt nichts. Um zu bestätigen, dass eine Einstellung wirksam wurde, lesen Sie die Eigenschaft mit IDBProperties::GetProperties erneut aus, bevor Sie die Verbindung herstellen. Den Schlüsselwortsatz, der zu jeder API gehört, finden Sie unter Verwenden von Schlüsselwörtern für Verbindungszeichenfolgen mit dem OLE DB-Treiber für SQL Server.

OLE DB meldet Diagnoseinformationen über das Fehlerobjekt und nicht allein über das HRESULT, daher sollten Fehler vor einem erneuten Versuch klassifiziert werden. Ein Authentifizierungs- oder Konfigurationsfehler schlägt dann sofort fehl, anstatt das gesamte Wiederversuchsbudget zu verbrauchen.

Weitere Informationen zu den einzelnen Teilen dieser Konfiguration finden Sie unter:

Für den Katalog der Azure SQL Transient Errors siehe Transient Fault Error Codes.

Wichtigste Funktionen

  • Microsoft Entra ID-Authentifizierung: Kennwortlose Verbindungen mit verwalteter Identität, Dienstprinzipal sowie interaktiven und integrierten Abläufen.
  • Strenge Verschlüsselung: TDS-8.0-Verbindungen mit vollständiger Zertifikatsvalidierung und TLS 1.3 in Version 19.2.0 und späteren Versionen.
  • Widerstandsfähigkeit der Leerlaufverbindung: Transparente Wiederherstellung einer Verbindung, die im Leerlauf abgebrochen ist.
  • Multiple Active Result Sets (MARS): Mehr als eine ausstehende Anfrage pro Verbindung.
  • Massenkopie: Hochdurchsatz-Inserts über die Bulk-Copy-Schnittstellen.
  • Tabellenwertige Parameter: Ein gesamter Ergebnissatz, der als einzelner Parameter an den Server übergeben wird.
  • Always On-Verfügbarkeitsgruppen: Listenerunterstützung mit MultiSubnetFailover für schnelles Failover.
  • UTF-8 und UTF-16 Unterstützung: Zeichendaten in beiden Kodierungen.
  • Datenklassifikation: Sensitivitätsmetadaten für klassifizierte Spalten.
  • Asynchrone Operationen: Nicht blockierende Datenquellen- und Zeilensatzoperationen.

Erste Schritte

Article Description
Wann man den OLE-Datenbanktreiber verwenden sollte Wann sollte man den OLE DB-Treiber für SQL Server gegenüber den anderen SQL Server-Treibern wählen.
Download Installer-Downloads für jede unterstützte Treiberversion.
Systemanforderungen Unterstützte Betriebssysteme, SQL Server-Versionen und Voraussetzungen für die erste Installation.
Bauanwendungen Header- und Bibliotheksdateien, Installationslayout und was sich beim Upgrade von MDAC ändert.
Erstellung einer Anwendung Die Aufrufsequenz, der eine Anwendung folgt, vom Verbinden über das Ausführen eines Befehls bis hin zum Lesen der Ergebnisse.
Supportlebenszyklus Welche Treiberversionen unterstützt werden und wann jeder die Unterstützung verlässt.

Konfigurieren und Verbinden

Article Description
Schlüsselwörter für Verbindungszeichenfolgen Jedes Verbindungszeichenfolge-Schlüsselwort, das der Treiber akzeptiert, mit seinen akzeptierten Werten.
Datenquellenobjekte Erstellen und initialisieren Sie die Datenquellen- und Sitzungsobjekte, aus denen eine Verbindung aufgebaut ist.
ADO mit dem Treiber verwenden Greifen Sie aus ADO auf Treiberfunktionen wie MARS, Abfragebenachrichtigungen und den XML-Typ zu.
Hohe Verfügbarkeit und Notfallwiederherstellung Stellen Sie die Verbindung über einen Verfügbarkeitsgruppenlistener sowie über die Schlüsselwörter her, die das Failover-Verhalten steuern.
Widerstandsfähigkeit der Leerlaufverbindung Eine Verbindung wird automatisch wiederhergestellt, die im Leerlauf abgebrochen ist.
LocalDB-Unterstützung Verbinden Sie sich mit einer LocalDB-Instanz für lokale Entwicklung und Testung.

Authentifizieren und sichern

Article Description
Verwenden von Microsoft Entra ID Die Microsoft Entra-Authentifizierungsmodi unterstützt der Treiber, einschließlich verwalteter Identität und interaktiver Identität.
Verschlüsselung und Zertifikatüberprüfung Setze Encrypt und TrustServerCertificate ein und steuere, wie das Serverzertifikat validiert wird.
Programmgesteuerte Änderung von Passwörtern Behandle ein abgelaufenes Passwort und setze ein neues, ohne deine Anwendung zu verlassen.
Unterstützung für Service Principal Name (SPN) in Clientverbindungen Setzen Sie den Namen des Service Principal auf einer Verbindung ein, damit die gegenseitige Kerberos-Authentifizierung erfolgreich ist.
Verwenden der Datenklassifizierung Lesen Sie die Sensitivitätslabels, die SQL Server für klassifizierte Spalten zurückgibt.

Befehle ausführen und Ergebnisse verarbeiten

Article Description
Befehle Die Schnittstelle ICommand und das Befehlsobjektmodell, auf dem die Befehlsausführung basiert.
Befehlssyntax Die Mischung aus ODBC SQL, ISO und Transact-SQL Syntax, die der Treiber im Befehlstext akzeptiert.
Befehlsparameter Markiere Parameter im Befehlstext und binde die vom Treiber unterstützten Typen für jeden ein.
Verwendung mehrerer aktiver Ergebnismengen (MARS) Lassen Sie auf einer einzelnen Verbindung mehr als ein ausstehendes Ergebnis offen.
Durchführung asynchroner Operationen Starte eine Operation, ohne den aufrufenden Thread zu blockieren, und polle oder warte, bis sie fertig ist.
Arbeit mit Abfragebenachrichtigungen Registrieren Sie sich für eine Benachrichtigung, wenn sich das Ergebnis einer Abfrage auf dem Server ändert.
Anleitungen zu Verarbeitungsergebnissen Ausgearbeitete Beispiele, die eine gespeicherte Prozedur oder Funktion ausführen und Rückgabecode, Ausgabeparameter und Zeilen lesen.

Arbeiten mit Zeilensätzen und Cursoren

Article Description
Rowsets Die Zeilensatz-Schnittstellen und die Eigenschaften, die bestimmen, welche Art von Zeilensatz man bekommt.
Reihen abrufen Nutze IRowset sie, um Zeilen nacheinander abzurufen, Spaltenwerte zu lesen und Zeilen freizugeben.
Aktualisierung von Daten in Reihensätzen Verwenden Sie IRowsetChange oder IRowsetUpdate, um ein modifizierbares Rowset anzufordern und dessen Sperrung zu steuern.
Bookmarks Speichern Sie eine Zeilenposition und kehren Sie später dorthin zurück, anstatt sie sequenziell erneut abzurufen.
Reihensätze und SQL Server-Cursor Wenn der Treiber ein Standardergebnis-Set verwendet und stattdessen einen Servercursor öffnet.

Massenkopieren

Article Description
Durchführung von Massenkopieroperationen Verschieben Sie große Mengen von Zeilen über Datendateien oder Programmvariablen in oder aus einer Tabelle.
Massenkopiere von Daten mit IRowsetFastLoad Kopieren Sie Daten per Massenkopie mit der IRowsetFastLoad-Schnittstelle in eine SQL Server-Tabelle.
Senden Sie BLOB-Daten mit IRowsetFastLoad und ISequentialStream Ich nutze IRowsetFastLoad es, um BLOB-Daten unterschiedlicher Länge pro Zeile an den SQL Server zu streamen.

Parameter mit Tabellenwert

Article Description
Überblick über tabellenwerte Parameter Wie tabellenwertige Parameter mehrere Datenzeilen in einem einzigen Parameter an den Server übergeben.
Referenz für tabellenwertige Parameter Erstellung von Parameter-Zeilenmengen und Parametertyp-Entdeckung.
Daten in tabellenwertige Parameter einfügen Das Push-Modell und das Pull-Modell zur Bereitstellung tabellenwertiger Parameterzeilen.
Verwendung tabellenwertiger Parameter Erstelle einen tabellenwertigen Parameter und übergebe dessen Zeilen an eine gespeicherte Prozedur.

Arbeit mit großen und binären Daten

Article Description
BLOBs und OLE-Objekte Lesen und schreiben Sie BLOB-Spalten als Stream über ISequentialStream.
Erfassung großer Daten Holen Sie einen großen Spaltenwert in Chunks ab, anstatt einen gebundenen Puffer.
Einstellung großer Datenmengen Senden Sie einen großen Spaltenwert von einem Consumer-Speicherobjekt an den Server.
FILESTREAM-Unterstützung Speichere große Binärwerte, die du über den SQL Server oder das Dateisystem lesen kannst.
FILESTREAM Anleitungsartikel Funktionierende Beispiele, die FILESTREAM-Spalten mit Streaming-Schnittstellen lesen und schreiben.

Verwaltung von Tabellen, Indizes und gespeicherten Prozeduren

Article Description
Tabellen und Indizes Tabellen und Indizes über ITableDefinition und IIndexDefinition erstellen, ändern und löschen.
Erstellung von SQL Server-Tabellen Definiere Spalten und rufe auf, ITableDefinition::CreateTable um eine Tabelle zu erstellen.
Erstellung von SQL Server-Indizes Definiere einen neuen Index in einer bestehenden Tabelle mit IIndexDefinition::CreateIndex.
Gespeicherten Prozeduren Rufen Sie eine gespeicherte Prozedur mit ODBC CALL-Syntax oder RPC auf und lesen Sie deren Rückgabecode und Ausgabeparameter.

Datentypen

Article Description
Datentypenübersicht Wie SQL Server-Typen beim Binden von Parametern und Spalten OLE DB-Datentypen zugeordnet werden.
Datentypabbildung in Zeilensätzen und Parametern Die vollständige Typzuordnungstabelle für Spalten von Rowsets und Befehlsparameter.
Verwendung großer Werttypen Binde die Typen varchar(max), nvarchar(max) und varbinary(max).
Verwendung von XML-Datentypen Speichere und rufe XML-Dokumente und -Fragmente in einer XML-Spalte ab.
Verwendung benutzerdefinierter Typen CLR-benutzerdefinierte Typen binden, die der Treiber als binäre Werte mit Typmetadaten bereitstellt.
Spärliche Säulenstütze Treiber-Unterstützung für spärliche Spalten, die für das Speichern von Nullwerten optimiert sind.
UTF-8-Unterstützung Arbeiten Sie mit UTF-8-Server-Kollierungen und UTF-8-Client-Codierung.
UTF-16-Unterstützung Wie der Treiber mit Surrogatpaaren umgeht, wenn er einen Client-Puffer füllt.
Datums- und Uhrzeitverbesserungen Binden Sie die Typen date, time, datetime2 und datetimeoffset sowie die von ihnen unterstützten Konvertierungen.

Transaktionen

Article Description
Transaktionsübersicht Unterstützung für lokale Transaktionen und den Microsoft Distributed Transaction Coordinator für verteilte Transaktionen.
Isolationsstufen Legen Sie die Isolationsstufe für eine Sitzung fest und welche Parallelität jede Stufe zulässt.
Arbeit mit Snapshot-Isolation Verwenden Sie die Zeilenversionierung, um die Parallelität von Lesezugriffen zu erhöhen, ohne Schreibvorgänge zu blockieren.
Unterstützung verteilter Transaktionen Listen Sie eine Sitzung in einer verteilten Transaktion mit ITransactionJoin::JoinTransactionein.

Diagnostizieren und Problembehandlung

Article Description
Fehler Wie der Treiber Fehler meldet und welche Schnittstellen die Details tragen.
Abruf von Fehlerinformationen Gehen Sie durch die Fehlerschnittstellen, um den Nachrichtentext, SQLSTATE und die native Fehlernummer zu lesen.
Zugreifen auf Diagnoseinformationen im Protokoll der erweiterten Ereignisse Aktivieren Sie das Fahrerverfolgungsverfahren und lesen Sie das resultierende Extended Events-Log.
Bekannte Probleme Offene Probleme im aktuellen Treiber, mit Workarounds, falls vorhanden.
Veröffentlichungshinweise Was sich bei jedem Treiber-Release geändert hat, das neueste zuerst.

Migration auf den aktuellen Treiber

Es gibt drei Generationen von Microsoft OLE DB-Anbietern für SQL Server. Für neue und bestehende Anwendungen verwenden MSOLEDBSQL19 und bestehende Verbindungsstränge darauf umwandeln. Der OLE-DB-Anbieter wurde nicht mehr als veraltet gekennzeichnet und 2018 erneut veröffentlicht.

Generation Provider-String Status
Microsoft OLE DB-Treiber für SQL Server (dieser Artikel) MSOLEDBSQL19, MSOLEDBSQL Unterstützt. MSOLEDBSQL19 ist der aktuelle Treiber und derjenige, der für neue Entwicklungen genutzt wird.
SQL Server Native Client (SNAC) SQLNCLI11, SQLNCLI Entfernt aus SQL Server 2022 und SQL Server Management Studio 19. Nicht empfohlen für Neubauten.
Microsoft OLE DB-Anbieter für SQL Server SQLOLEDB Ist in Windows Data Access Components enthalten. Nicht mehr gepflegt. Nicht empfohlen für Neubauten.
Article Description
Hauptversionsunterschiede bei MSOLEDBSQL Breaking Änderungen zwischen OLE DB Driver 19 und Version 18, einschließlich Verschlüsselungsstandardeinstellungen, Änderungen des Eigenschaftstyps und Migrationsschritte.
Aktualisierung einer Anwendung aus MDAC Was hat sich zwischen dem alten OLE DB Provider für SQL Server und dem aktuellen Treiber geändert und was sollte man vor dem Update überprüfen?
Aktualisieren einer Anwendung von SQL Server 2005 Native Client Die grundlegenden Änderungen im OLE DB-Treiber für SQL Server seit dem SQL Server Native Client in SQL Server 2005 (9.x).

Reference

Article Description
Features des OLE DB-Treibers für SQL Server Index der treiberspezifischen Funktionen und wo jede dokumentiert ist.
OLE DB-Programmierung Das COM-API-Modell, das der Treiber bereitstellt, und wie er über TDS mit SQL Server kommuniziert.
OLE DB Anleitungsartikel Index der Anleitungsartikel der OLE DB, gruppiert nach Aufgaben.
OLE DB-Schnittstellen Die OLE-Datenbankschnittstellen und Methoden, die anbieterspezifisches Verhalten in diesem Treiber zeigen.
Schema-Rowset-Unterstützung Provider-spezifisches Schema-Rowset-Verhalten, einschließlich Metadaten, die von verknüpften Servern zurückgegeben werden.
Weitere Informationen finden Spezifikationen, Muster und Community-Ressourcen außerhalb dieses Dokumentationssets.