Microsoft OLE DB Driver pour SQL Server

Télécharger le pilote OLE DB

Le Microsoft OLE DB Driver pour SQL Server est une interface de programmation d'applications (API) autonome pour l'accès aux données, qui fait partie d'OLE DB. Il connecte des applications en C et C++ au Microsoft SQL Moteur de base de données dans Azure SQL Database, SQL Database dans Microsoft Fabric, Azure SQL Managed Instance, ainsi que dans les versions prises en charge de SQL Server. Microsoft l’a sorti pour la première fois en 2018 en version 18 et l’a inclus dans SQL Server 2019 (15.x).

MSOLEDBSQL19 est le conducteur actuel. Il est généralement rétrocompatible avec SQL Server Native Client (SNAC), et offre des fonctionnalités au-delà de SNAC et du fournisseur OLE DB de SQL Server que Windows Data Access Components (Windows DAC, anciennement Microsoft Data Access Components, ou MDAC) fournit.

Choisir votre point de départ

Base de référence de production pour Azure SQL

Utilisez cet extrait de code comme point de départ pour une connexion Azure SQL orientée production. Il charge le nom du serveur et celui de la base de données depuis la configuration de l’application, s’authentifie avec une identité gérée afin qu’aucun secret n’apparaisse dans la chaîne de connexion, et active le chiffrement Tabular Data Stream (TDS) 8.0 avec validation complète des certificats. Il définit un délai d’attente de connexion par tentative, et réessaie les pannes transitoires avec un recul exponentiel et un jitter.

L’extrait C++ de cet article omet l’initialisation COM, ainsi que l’aide à la journalisation pour plus de concision.

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 et Connect Retry Interval activer la résilience des connexions inactives, ce qui restaure de manière transparente une connexion coupée pendant l’inactivité. Ils ne réessaient pas la connexion initiale, c’est pourquoi ce fragment implémente aussi une réessayage au niveau de l’application. Gardez les deux.

Ce snippet construit sa chaîne de connexion pour IDataInitialize::GetDataSource, qui utilise les noms de mots-clés espacés indiqués ici, tels que Use Encryption for Data et Connect Retry Count. IDBInitialize::Initialize et ADO utilisent des noms différents pour les mêmes paramètres, tels que Encrypt et ConnectRetryCount.

GetDataSource accepte un nom provenant du mauvais ensemble sans générer d’erreur, et le paramètre ne prend jamais effet. La connexion utilise alors le driver par défaut, ce qui peut l’affaiblir. Encrypt=Strict sur ce chemin laisse le chiffrement à Mandatory sur MSOLEDBSQL19, de sorte que la connexion abandonne TDS 8.0 et négocie le chiffrement lors du prélogin en clair, et laisse le chiffrement entièrement désactivé sur MSOLEDBSQL. Tous les cas n’échouent pas en mode ouvert : la valeur incorrecte TrustServerCertificate est ignorée de la même manière, ce qui fait que la propriété conserve sa valeur par défaut false et que la validation du certificat reste activée.

Ne comptez pas sur un message d’erreur pour repérer votre erreur. Un nom qui n’appartient à aucun ensemble, comme ZzzNotAKeyword, produit un Invalid chaîne de connexion attribute enregistrement, mais un nom provenant du mauvais ensemble ne produit rien. Pour confirmer qu’un paramètre a bien pris effet, relisez la propriété à l’aide de IDBProperties::GetProperties avant de vous connecter. Pour l’ensemble de mots-clés associé à chaque API, voir Utiliser des mots-clés de chaîne de connexion avec OLE DB Driver pour SQL Server.

OLE DB rapporte les diagnostics via l’objet d’erreur plutôt que seul HRESULT , classant donc les échecs avant de réessayer. Une erreur d’authentification ou de configuration échoue alors immédiatement au lieu de consommer tout le budget de réessayage.

Pour plus d’informations sur chaque partie de cette configuration, consultez :

Pour le catalogue des erreurs transitoires Azure SQL, voir codes d’erreur de défaut transitoire.

Principales fonctionnalités

  • Authentification Microsoft Entra ID : Connexions sans mot de passe avec identité managée, principal de service, flux interactifs et intégrés.
  • Chiffrement strict : connexions TDS 8.0 avec validation complète des certificats, et TLS 1.3 dans la version 19.2.0 et versions ultérieures.
  • Résilience de la connexion au repos : Restauration transparente d’une connexion qui a été coupée pendant l’inactivité.
  • Ensembles de résultats actifs multiples (MARS) : Plus d’une requête en attente par connexion.
  • Copie en bloc : insertions à haut débit via les interfaces de copie en bloc.
  • Paramètres à valeurs de table : un ensemble complet de résultats transmis au serveur sous forme d’un seul paramètre.
  • Groupes de disponibilité Always On : prise en charge de l’écouteur avec MultiSubnetFailover pour un basculement rapide.
  • Prise en charge de UTF-8 et d’UTF-16 : données de caractères dans les deux encodages.
  • Classification des données : Métadonnées de sensibilité pour les colonnes classifiées.
  • Opérations asynchrones : opérations non bloquantes de source de données et d’ensembles de lignes.

Get started

Article Description
Quand utiliser le pilote OLE DB Quand choisir un OLE DB Driver pour SQL Server plutôt que les autres pilotes SQL Server ?
Télécharger Téléchargements du programme d’installation pour chaque version de pilote prise en charge.
Configuration système requise Systèmes d’exploitation pris en charge, versions de SQL Server et prérequis pour installer en premier.
Applications dans le bâtiment En-tête et fichiers de bibliothèque, disposition d’installation, et ce qui change lors de la mise à jour depuis MDAC.
Création d’une application La séquence d’appels qu’une application suit, de la connexion à l’exécution d’une commande en passant par la lecture des résultats.
Cycle de vie de support Quelles versions de pilotes sont prises en charge, et à quel moment la prise en charge de chacune prend fin.

Configuration et connexion

Article Description
Mots clés de chaîne de connexion Chaque mot-clé chaîne de connexion que le pilote accepte, avec ses valeurs acceptées.
Objets sources de données Créez et initialisez la source de données et les objets de session à partir desquels une connexion est construite.
Utilisation de l’ADO avec le pilote Fonctionnalités de pilotes Reach telles que MARS, notifications de requête et le type xml d’ADO.
Haute disponibilité et récupération d’urgence Connectez-vous via un écouteur de groupe de disponibilité et les mots-clés qui contrôlent le comportement de basculement.
Résilience des connexions inactives Rétablis automatiquement une connexion qui a été coupée pendant qu’elle était inactive.
Prise en charge de LocalDB Connectez-vous à une instance LocalDB pour le développement local et les tests.

Authentifier et être sécurisé

Article Description
Utilisation de Microsoft Entra ID Les modes d’authentification Microsoft Entra que le pilote supporte, incluant l’identité gérée et l’interactivité.
Chiffrement et validation de certificat Définissez Encrypt et TrustServerCertificate, et contrôlez la validation du certificat serveur.
Modification programmatique des mots de passe Gérez un mot de passe expiré et définissez-en un nouveau sans quitter votre application.
Support du nom principal de service (SPN) dans les connexions clients Définissez le nom de principal de service pour une connexion afin que l’authentification mutuelle Kerberos réussisse.
Utilisation de la classification des données Lisez les étiquettes de sensibilité que SQL Server renvoie pour les colonnes classifiées.

Exécuter les commandes et traiter les résultats

Article Description
Commandes L’interface ICommand et le modèle d’objet de commande sur lequel l’exécution de la commande sont construits.
Syntaxe de la commande La syntaxe SQL ODBC, ISO et Transact-SQL prise en charge par le pilote dans le texte de commande.
Paramètres de commande Marquez les paramètres dans le texte de commande, et liez les types que le pilote prend en charge pour chacun.
Utilisation de plusieurs ensembles de résultats actifs (MARS) Gardez plus d’un ensemble de résultats en attente ouvert sur une seule connexion.
Exécution d’opérations asynchrones Démarrez une opération sans bloquer le thread appelant, puis faites une interrogation ou attendez qu’elle se termine.
Fonctionnement des notifications de requête Inscrivez-vous pour recevoir une notification lorsque le résultat d’une requête change sur le serveur.
Articles pratiques sur le traitement des résultats Exemples résolus qui exécutent une procédure ou une fonction stockée et lisent des codes de retour, des paramètres de sortie et des lignes.

Utiliser des ensembles de lignes et des curseurs

Article Description
Jeux de lignes Les interfaces de rowset, et les propriétés qui déterminent le type de rowset que vous obtenez.
Récupération des lignes Utilisez-le IRowset pour récupérer les lignes séquentiellement, lire les valeurs des colonnes et libérer les lignes.
Mise à jour des données dans les lignes Demandez IRowsetChange ou IRowsetUpdate pour obtenir un ensemble de lignes modifiable et en contrôler le verrouillage.
Bookmarks Enregistrez la position d’une ligne et revenez-y plus tard, au lieu de récupérer à nouveau les lignes de façon séquentielle.
Ensembles de lignes et curseurs SQL Server Lorsque le pilote utilise un ensemble de résultats par défaut et qu’il ouvre un curseur serveur à la place.

Copie par lots

Article Description
Réalisation d’opérations de copie en masse Déplacez de grands volumes de lignes dans ou hors d’une table via des fichiers de données ou des variables de programme.
Copie massive des données à l’aide de IRowsetFastLoad Copiez en bloc les données dans une table SQL Server avec l’interfaceIRowsetFastLoad.
Envoyer des données BLOB en utilisant IRowsetFastLoad et ISequentialStream Utilisez-le IRowsetFastLoad pour diffuser des données BLOB de différentes longueurs par ligne vers SQL Server.

Paramètres de type table

Article Description
Aperçu des paramètres à valeurs de tableau Comment les paramètres à valeurs de table transmettent plusieurs lignes de données au serveur dans un seul paramètre.
Référence de paramètre à valeurs de table Création de lignes de paramètres et découverte de types de paramètres.
Insertion de données dans des paramètres à valeurs de table Les modèles push et pull pour alimenter les lignes des paramètres de type table.
Utilisation de paramètres à valeurs de table Créer un paramètre à valeurs de table et passer ses lignes à une procédure stockée.

Travail avec des données volumineuses et binaires

Article Description
BLOBs et objets OLE Lire et écrire des colonnes BLOB sous forme de flux via ISequentialStream.
Obtention de données de grande taille Récupérer une grande valeur de colonne en blocs au lieu d’un seul tampon lié.
Définition de grandes quantités de données Envoyez une grande valeur de colonne au serveur depuis un objet de stockage grand public.
Prise en charge du flux de fichiers Stockez de grandes valeurs binaires que vous pouvez lire via SQL Server ou via le système de fichiers.
Articles pratiques sur FILESTREAM Des exemples réalisés qui lisent et écrivent des colonnes FILESTREAM avec des interfaces de streaming.

Gérer les tables, index et procédures stockées

Article Description
Tableaux et index Créez, modifiez et supprimez des tables et des index via ITableDefinition et IIndexDefinition.
Création de tables SQL Server Définissez des colonnes et un appel ITableDefinition::CreateTable pour créer une table.
Création d’index SQL Server Définissons un nouvel indice sur une table existante avec IIndexDefinition::CreateIndex.
procédures stockées Appelez une procédure stockée avec une syntaxe ODBC CALL ou RPC, et lisez son code de retour ainsi que ses paramètres de sortie.

Types de données

Article Description
Aperçu des types de données Comment les types SQL Server correspondent aux types OLE DB lorsque vous associez des paramètres et des colonnes.
Mappage des types de données dans les lignes et paramètres La table complète de mappage de types pour les colonnes de lignes et les paramètres de commande.
Utilisation de grands types de valeurs Associez les types varchar(max), nvarchar(max) et varbinary(max).
Utilisation des types de données XML Stockez et récupérez les documents XML et les fragments dans une colonne xml.
Utilisation de types définis par l’utilisateur Liez les types CLR définis par l’utilisateur, que le pilote expose sous forme de valeurs binaires avec des métadonnées de type.
Soutien clairsemé de colonnes Prise en charge, par les pilotes, des colonnes éparses, optimisées pour le stockage de valeurs nulles.
Prise en charge d’UTF-8 Travailler avec les collations de serveurs UTF-8 et l’encodage client UTF-8.
Prise en charge de l’UTF-16 Comment le pilote gère les paires de substitut lorsqu’il remplit un tampon client.
Améliorations de la date et de l’heure Assignez les types date, timetime2 et datetimeoffset, ainsi que les conversions qu’ils autorisent.

Transactions

Article Description
Aperçu des transactions prise en charge locale des transactions, et le Microsoft Distributed Transaction Coordinator pour les transactions distribuées.
Niveaux d’isolation Définissez le niveau d’isolation pour une session, et la concurrence autorisée par chaque niveau.
Utilisation de l’isolation par instantané Utilisez la version par ligne pour augmenter la concurrence de lecture sans bloquer les auteurs.
Prise en charge des transactions distribuées Inscrivez une session dans une transaction distribuée avec ITransactionJoin::JoinTransaction.

Diagnostiquer et résoudre les problèmes

Article Description
Erreurs Comment le pilote signale les défaillances et quelles interfaces fournissent les détails.
Récupération des informations d’erreur Parcourez les interfaces d’erreur pour lire le texte du message, SQLSTATE et le numéro d’erreur natif.
Accès aux informations de diagnostic dans le journal des événements étendus Activez le traçage du conducteur et lisez le journal des événements étendus résultant.
Problèmes connus Problèmes non résolus dans le pilote actuel, avec des solutions de contournement lorsqu’il en existe.
Notes de publication Ce qui a changé dans chaque version du pilote, de la plus récente à la plus ancienne.

Migrer vers le pilote actuel

Il existe trois générations de fournisseurs Microsoft OLE DB pour SQL Server. Utilisez MSOLEDBSQL19 pour des applications nouvelles et existantes, et convertissez les chaînes de connexion existantes vers celle-ci. Le fournisseur OLE DB a été de nouveau pris en charge et republié en 2018.

Generation Chaîne de fournisseurs Status
Microsoft OLE DB Driver pour SQL Server (cet article) MSOLEDBSQL19, MSOLEDBSQL Soutenu. MSOLEDBSQL19 est le moteur actuel et celui à utiliser pour les nouveaux développements.
SQL Server Client Natif (SNAC) SQLNCLI11, SQLNCLI Retiré de SQL Server 2022 et SQL Server Management Studio 19. Pas recommandé pour les nouveaux développements.
Fournisseur Microsoft OLE DB pour SQL Server SQLOLEDB Livré dans Windows Data Access Components. N’est plus maintenu. Pas recommandé pour les nouveaux développements.
Article Description
Différences entre les versions principales MSOLEDBSQL Changement entre le pilote OLE DB 19 et la version 18, y compris les paramètres par défaut de chiffrement, les changements de type de propriété et les étapes de migration.
Mise à jour d’une application à partir du MDAC Qu’est-ce qui a changé entre l’ancien fournisseur OLE DB pour SQL Server et le pilote actuel, et que vérifier avant de mettre à jour ?
Mise à jour d’une application à partir de SQL Server 2005 Native Client Les changements majeurs dans OLE DB Driver pour SQL Server depuis SQL Server Native Client dans SQL Server 2005 (9.x).

Reference

Article Description
Fonctionnalités du pilote OLE DB pour SQL Server Index des caractéristiques spécifiques au pilote, et où chacune est documentée.
Programmation OLE DB Le modèle d’API COM que le pilote expose, et comment il communique avec SQL Server via TDS.
Articles pratiques OLE DB Index des articles pratiques OLE DB, regroupés par tâche.
Interfaces OLE DB Les interfaces et méthodes OLE DB présentent un comportement spécifique au fournisseur dans ce pilote.
Prise en charge des jeux de lignes de schéma Comportement des jeux de lignes de schéma spécifiques au fournisseur, y compris les métadonnées renvoyées par les serveurs liés.
Trouver plus d’informations Spécifications, exemples et ressources communautaires en dehors de cet ensemble de documentation.