Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
- Para decidir si OLE DB es la API adecuada para tu aplicación, empieza con Cuándo usar OLE DB Driver for SQL Server.
- Para instalar el controlador y empezar a escribir código, ve a Descargar OLE DB Driver for SQL Server, Requisitos del sistema y Construcción de aplicaciones con OLE DB Driver for SQL Server.
- Para conectarse a Azure SQL con autenticación sin contraseña, vaya a Uso de Microsoft Entra ID y Uso de palabras clave de la cadena de conexión.
- Para pasar de
SQLNCLIoSQLOLEDB, consulta Actualizar una aplicación de MDAC a OLE DB Driver for SQL Server y Principales diferencias entre versiones. - Para usar el controlador de ADO, ve a Usando ADO con OLE DB Driver for SQL Server.
- Para diagnosticar un problema de conexión o consulta, ve a Acceder a información de diagnóstico en el registro de eventos extendido y Problemas conocidos.
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:
- Uso de palabras clave de cadena de conexión con el controlador OLE DB para SQL Server
- Uso de Microsoft Entra ID
- Cifrado y validación de certificados
- Resiliencia de la conexión en reposo
- Soporte para alta disponibilidad y recuperación ante desastres del controlador OLE DB Driver for SQL Server
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
MultiSubnetFailoverpara 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. |