Controlador Microsoft OLE DB para SQL Server

Descargar controlador OLE DB

El Microsoft OLE DB Driver for SQL Server es una interfaz de programación de aplicaciones (API) independiente para acceso a datos que forma parte de OLE DB. Conecta aplicaciones en C y C++ con el Microsoft SQL Motor de base de datos en Azure SQL Database, la base de datos SQL en Microsoft Fabric, Azure SQL Managed Instance y en versiones compatibles de SQL Server. Microsoft lo lanzó por primera vez en 2018 como versión 18 e incluyó en SQL Server 2019 (15.x).

MSOLEDBSQL19 es el controlador actual. Generalmente es compatible hacia atrás con SQL Server Native Client (SNAC), y ofrece funcionalidades más allá de SNAC y del proveedor de SQL Server OLE DB que proporciona Windows Data Access Components (Windows DAC, anteriormente Microsoft Data Access Components, o MDAC).

Elija el punto de partida.

Línea base de producción para Azure SQL

Use este fragmento de código como punto de partida para una conexión Azure SQL orientada a producción. Carga el nombre del servidor y el nombre de la base de datos desde la configuración de la aplicación, se autentica con una identidad gestionada para que no aparezca ningún secreto en la cadena de conexión, y permite el cifrado Tabular Data Stream (TDS) 8.0 con validación completa del certificado. Establece un tiempo de espera para la conexión en cada intento y reintenta los errores transitorios con retardo exponencial y variación aleatoria.

El fragmento de C++ de este artículo omite las directivas `#include`, la inicialización de COM y la función auxiliar de registro por motivos de brevedad.

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 y Connect Retry Interval habilitan la resistencia de las conexiones inactivas, que restaura de forma transparente una conexión interrumpida durante la inactividad. No vuelven a intentar la conexión inicial, por eso este fragmento también implementa reintentos a nivel de aplicación. Conservar ambos.

Este fragmento construye su cadena de conexión para IDataInitialize::GetDataSource, que utiliza los nombres de palabras clave espaciadas que se muestran aquí, como Use Encryption for Data y Connect Retry Count. IDBInitialize::Initialize y ADO usan nombres diferentes para los mismos ajustes, como Encrypt y ConnectRetryCount.

GetDataSource acepta un nombre del conjunto equivocado sin generar errores, y la configuración nunca se aplica. La conexión pasa entonces a usar el controlador predeterminado, lo que puede debilitarla. Encrypt=Strict en esta ruta deja el cifrado en Mandatory en MSOLEDBSQL19, por lo que la conexión descarta TDS 8.0 y negocia el cifrado en texto claro durante la fase previa al inicio de sesión, y deja el cifrado totalmente desactivado en MSOLEDBSQL. No todos los casos fallan abiertos: el conjunto TrustServerCertificate incorrecto se descarta de la misma manera, lo que deja la propiedad en su estado predeterminado false y mantiene activada la validación del certificado.

No cuentes con un error para detectarlo. Un nombre que no pertenece a ningún conjunto, como ZzzNotAKeyword, produce un Invalid cadena de conexión attribute registro, pero un nombre del conjunto equivocado no produce nada. Para confirmar que una configuración surtió efecto, vuelve a leer la propiedad con IDBProperties::GetProperties antes de conectarte. Para consultar el conjunto de palabras clave que acompaña a cada API, vea Uso de palabras clave de cadena de conexión con OLE DB Driver for SQL Server.

OLE DB informa de diagnósticos a través del objeto de error en lugar de solo HRESULT , por lo que clasifica los fallos antes de intentarlo de nuevo. Entonces, un error de autenticación o de configuración provoca un fallo inmediato en lugar de consumir todo el presupuesto total de reintentos.

Para obtener más información sobre cada parte de esta configuración, consulte:

Para el catálogo de errores transitorios de Azure SQL, véase códigos de error de fallo transitorio.

Características clave

  • Autenticación Microsoft Entra ID: Conexiones sin contraseña con identidad gestionada, principal de servicio, flujos interactivos e integrados.
  • Cifrado estricto: conexiones TDS 8.0 con validación completa de certificados, y TLS 1.3 en la versión 19.2.0 y versiones posteriores.
  • Resiliencia de la conexión en reposo: Restauración transparente de una conexión que se cayó mientras estaba inactiva.
  • Múltiples conjuntos de resultados activos (MARS): Más de una solicitud pendiente por conexión.
  • Copia masiva: insertos de alto rendimiento a través de las interfaces de copia masiva.
  • Parámetros con valores de tabla: Un conjunto completo de resultados pasado al servidor como un solo parámetro.
  • Grupos de disponibilidad Always On: compatibilidad con MultiSubnetFailover para la conmutación por error rápida.
  • Soporte UTF-8 y UTF-16: datos de caracteres en ambas codificaciones.
  • Clasificación de datos: Metadatos de sensibilidad para columnas clasificadas.
  • Operaciones asíncronas: Operaciones de fuente de datos y conjunto de filas no bloqueantes.

Empieza ahora

Article Description
Cuándo usar el controlador OLE DB Cuándo elegir OLE DB Driver for SQL Server frente a los otros controladores de SQL Server.
Descargar Descargas de instalador para todas las versiones de controladores compatibles.
Requisitos del sistema Sistemas operativos compatibles, versiones de SQL Server y requisitos previos para instalar primero.
Aplicaciones en la construcción Cabeceras y archivos de biblioteca, diseño de instalación y qué cambia al actualizar desde MDAC.
Creación de una aplicación La secuencia de llamadas que sigue una aplicación, desde conectarse hasta ejecutar un comando y leer resultados.
Ciclo de vida de soporte técnico Qué versiones de controladores son compatibles y cuándo finaliza el soporte de cada una.

Configuración y conexión

Article Description
Palabras clave de cadena de conexión Cada palabra clave de la cadena de conexión que acepta el controlador, con sus valores aceptados.
Objetos fuente de datos Crea e inicializa la fuente de datos y los objetos de sesión desde los que se construye una conexión.
Usar ADO con el controlador Acceda a características del controlador como MARS, las notificaciones de consultas y el tipo xml desde ADO.
Alta disponibilidad y recuperación ante desastres Conéctate a través de un grupo de disponibilidad y las palabras clave que controlan el comportamiento de failover.
Resiliencia de la conexión en reposo Restaura automáticamente una conexión que se ha caído mientras estaba en reposo.
Soporte para LocalDB Conéctate a una instancia de LocalDB para desarrollo y pruebas locales.

Autenticar y asegurar

Article Description
Uso de Microsoft Entra ID Los modos de autenticación Microsoft Entra que soporta el controlador, incluyendo identidad gestionada e interactivo.
Cifrado y validación de certificados Configura Encrypt y TrustServerCertificate, y controla cómo se valida el certificado del servidor.
Cambio de contraseñas de forma programática Gestiona una contraseña caducada y establece una nueva sin salir de tu aplicación.
Soporte de nombre principal de servicio (SPN) en conexiones de cliente Establece el nombre del principal de servicio en una conexión para que la autenticación mutua de Kerberos se realice correctamente.
Uso de la clasificación de datos Lee las etiquetas de sensibilidad que SQL Server devuelve para las columnas clasificadas.

Ejecutar comandos y procesar resultados

Article Description
Comandos La ICommand interfaz y el modelo de objetos de comandos sobre el que se basa la ejecución de comandos.
Sintaxis del comando La combinación de sintaxis ODBC SQL, ISO y Transact-SQL que acepta el controlador en el texto de comando.
Parámetros de mando Marca parámetros en el texto de comandos y asigna los tipos que soporta el controlador para cada uno.
Uso de múltiples conjuntos de resultados activos (MARS) Mantén abierto más de un conjunto de resultados pendientes en una sola conexión.
Realización de operaciones asíncronas Inicia una operación sin bloquear el hilo que llama y sondea o espera a que termine.
Trabajar con notificaciones de consultas Regístrate para recibir una notificación cuando el resultado de una consulta cambie en el servidor.
Artículos prácticos sobre cómo procesar resultados Ejemplos resueltos que ejecutan un procedimiento o función almacenada y leen códigos de retorno, parámetros de salida y filas.

Trabajar con conjuntos de filas y cursores

Article Description
Conjuntos de filas Las interfaces de conjunto de filas y las propiedades que determinan qué tipo de conjunto de filas se obtiene.
Recuperando filas Utilice IRowset para recuperar filas de forma secuencial, leer los valores de las columnas y liberar las filas.
Actualización de datos en conjuntos de filas Solicita IRowsetChange o IRowsetUpdate para obtener un conjunto de filas modificable y controlar su bloqueo.
Bookmarks Guarda la posición de una fila y vuelve a ella más tarde, en lugar de volver a recuperarla secuencialmente.
Conjuntos de filas y cursores de SQL Server Cuando el controlador usa un conjunto de resultados por defecto y cuando abre un cursor de servidor en su lugar.

Copia masiva

Article Description
Realización de operaciones de copia masiva Mueve grandes volúmenes de filas dentro o fuera de una tabla mediante archivos de datos o variables de programa.
Copia masiva de datos usando IRowsetFastLoad Copia los datos en masa a una tabla de SQL Server con la IRowsetFastLoad interfaz.
Enviar datos BLOB usando IRowsetFastLoad e ISequentialStream Úsalo IRowsetFastLoad para transmitir datos BLOB de diferentes longitudes por fila a SQL Server.

Parámetros con valores de tabla

Article Description
Visión general de parámetros con valores de tabla Cómo los parámetros con valores de tabla pasan varias filas de datos al servidor en un solo parámetro.
Referencia de parámetros con valores en tabla Creación de conjuntos de filas de parámetros y descubrimiento de tipos de parámetros.
Inserción de datos en parámetros con valores de tabla El modelo push y el modelo pull para suministrar filas de parámetros valoradas en tablas.
Utiliza parámetros con valores de tabla Crea un parámetro con valores de tabla y pasa sus filas a un procedimiento almacenado.

Trabajo con datos grandes y binarios

Article Description
BLOBs y objetos OLE Leer y escribir columnas BLOB en forma de flujo mediante ISequentialStream.
Obtención de grandes volúmenes de datos Recupera un valor de columna grande en bloques en lugar de un búfer vinculado.
Configuración de grandes cantidades de datos Envía un valor de columna grande al servidor desde un objeto de almacenamiento de consumo.
Soporte para FILESTREAM Almacena valores binarios grandes que puedas leer a través de SQL Server o del sistema de archivos.
Artículos prácticos de FILESTREAM Ejemplos funcionales que leen y escriben columnas FILESTREAM con interfaces de streaming.

Gestionar tablas, índices y procedimientos almacenados

Article Description
Tablas e índices Crear, modificar e eliminar tablas e índices a través de ITableDefinition y IIndexDefinition.
Creación de tablas de SQL Server Define columnas y llama ITableDefinition::CreateTable para crear una tabla.
Creación de índices para SQL Server Defina un nuevo índice en una tabla existente con IIndexDefinition::CreateIndex.
procedimientos almacenados Llama a un procedimiento almacenado con sintaxis ODBC CALL o RPC, y lee su código de retorno y parámetros de salida.

Tipos de datos

Article Description
Resumen de tipos de datos Cómo los tipos de SQL Server se corresponden con los tipos de OLE DB cuando asignas parámetros y columnas.
Mapeo de tipos de datos en conjuntos de filas y parámetros La tabla completa de mapeo de tipos para columnas de filas y parámetros de comando.
Uso de tipos de valor grandes Vincula los tipos varchar(max), nvarchar(max) y varbinary(max).
Uso de tipos de datos XML Almacenar y recuperar documentos y fragmentos XML en una columna xml.
Uso de tipos definidos por el usuario Asocia los tipos CLR definidos por el usuario, que el controlador expone como valores binarios con metadatos de tipo.
Soporte de columnas dispersas Soporte de controladores para columnas dispersas, que están optimizadas para almacenar valores nulos.
Compatibilidad con UTF-8 Trabaja con colaciones de servidores UTF-8 y codificación de clientes UTF-8.
Soporte UTF-16 Cómo maneja el controlador los pares sustitutos cuando llena un buffer de cliente.
Mejoras en fecha y hora Asocia los tipos date, time, datetime2 y datetimeoffset, y las conversiones que permiten.

Transactions

Article Description
Resumen de transacciones Soporte local para transacciones y el Coordinador de transacciones distribuidas de Microsoft para transacciones distribuidas.
Niveles de aislamiento Establece el nivel de aislamiento para una sesión y qué concurrencia permite cada nivel.
Trabajar con aislamiento de instantáneas Utiliza la versión de fila para aumentar la concurrencia de lecturas sin bloquear a los escritores.
Soporte de transacciones distribuidas Inscribe una sesión en una transacción distribuida con ITransactionJoin::JoinTransaction.

Diagnóstico y solución de problemas

Article Description
Errores Cómo informa el controlador de los fallos y qué interfaces proporcionan los detalles.
Recuperación de información de error Recorre las interfaces de error para leer el texto del mensaje, SQLSTATE y el número de error nativo.
Acceso a información de diagnóstico en el registro de eventos extendidos Activa el rastreo de conductores y lee el registro de eventos extendidos resultante.
Problemas conocidos Problemas abiertos en el controlador actual, con soluciones alternativas cuando existen.
Notas de lanzamiento Qué ha cambiado en cada versión del controlador, de la más reciente a la más antigua.

Migrar al controlador actual

Existen tres generaciones de proveedores de Microsoft OLE DB para SQL Server. Usa MSOLEDBSQL19 para aplicaciones nuevas y existentes, y convierte las cadenas de conexión existentes para usarlo. El proveedor OLE DB quedó obsoleto y se volvió a lanzar en 2018.

Generation Cadena de proveedor Situación
Microsoft OLE DB Driver for SQL Server (este artículo) MSOLEDBSQL19, MSOLEDBSQL Supported. MSOLEDBSQL19 es el motor actual y el que se debe usar para nuevos desarrollos.
SQL Server Cliente Nativo (SNAC) SQLNCLI11, SQLNCLI Eliminado de SQL Server 2022 y SQL Server Management Studio 19. No se recomienda para desarrollos nuevos.
Proveedor de Microsoft OLE DB para SQL Server SQLOLEDB Incluye componentes de acceso a datos de Windows. Ya no se mantiene. No se recomienda para desarrollos nuevos.
Article Description
Diferencias de la versión principal de MSOLEDBSQL Cambios importantes entre OLE DB Driver 19 y la versión 18, incluida la configuración predeterminada del cifrado, los cambios en los tipos de propiedad y los pasos de migración.
Actualización de una solicitud desde MDAC ¿Qué cambió entre el antiguo proveedor OLE DB para SQL Server y el controlador actual, y qué comprobar antes de actualizar.
Actualizar una aplicación desde SQL Server 2005 Native Client Los cambios importantes en el controlador OLE DB para SQL Server desde SQL Server Native Client de SQL Server 2005 (9.x).

Reference

Article Description
Características del controlador OLE DB para SQL Server Índice de las características específicas del controlador y dónde está documentada cada una.
Programación en OLE DB El modelo de API COM que expone el controlador y cómo se comunica con SQL Server a través de TDS.
Artículos prácticos de OLE DB Índice de los artículos prácticos de OLE DB, agrupados por tarea.
Interfaces OLE DB Las interfaces y métodos de OLE DB que muestran comportamientos específicos del proveedor en este controlador.
Compatibilidad con conjuntos de filas de esquema Comportamiento específico del proveedor de los conjuntos de filas de esquema, incluidos los metadatos devueltos por servidores vinculados.
Encontrar más información Especificaciones, muestras y recursos comunitarios fuera de este conjunto de documentación.