Драйвер Microsoft OLE DB для SQL Server

Скачать драйвер OLE DB

Microsoft OLE DB Driver for SQL Server — это автономный интерфейс программного обеспечения доступа к данным (API), входящий в состав OLE DB. Он соединяет приложения на C и C++ с Microsoft SQL ядро СУБД в База данных SQL Azure, базой данных SQL в Microsoft Fabric, Управляемый экземпляр SQL Azure и поддерживаемыми версиями SQL Server. Microsoft впервые выпустила его в 2018 году в версии 18 и включила в SQL Server 2019 (15.x).

MSOLEDBSQL19 — текущий драйвер. В целом он обеспечивает обратную совместимость с SQL Server Native Client (SNAC) и предоставляет функциональные возможности, выходящие за рамки возможностей как SNAC, так и поставщика OLE DB для SQL Server, предоставляемого Windows Data Access Components (Windows DAC, ранее Microsoft Data Access Components, или MDAC).

Выберите начальную точку

Производственные базовые показатели для Azure SQL

Используйте этот фрагмент в качестве отправной точки для рабочего Azure SQL подключения. Он загружает имя сервера и имя базы данных из конфигурации приложения, аутентифицируется с управляемой идентичностью так, чтобы секрет не отображался в строка подключения, и поддерживает шифрование Tabular Data Stream (TDS) 8.0 с полной валидацией сертификата. Он устанавливает тайм-аут для каждой попытки подключения и повторяет попытки при временных сбоях с экспоненциальной задержкой и джиттером.

В этой статье для краткости во фрагменте кода на C++ опущены директивы include, инициализация COM и вспомогательный код для ведения журнала.

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 и Connect Retry Interval обеспечивают устойчивость соединения в режиме простоя, которая позволяет незаметно восстановить соединение, разорванное во время простоя. Они не повторяют начальное подключение, поэтому этот фрагмент также реализует повторное тестирование на уровне приложения. Оставьте оба.

Этот фрагмент формирует строку подключения для IDataInitialize::GetDataSource, в котором используются показанные здесь имена ключевых слов с пробелами, такие как Use Encryption for Data и Connect Retry Count. IDBInitialize::Initialize и ADO используют разные имена для одних и тех же настроек, например Encrypt и ConnectRetryCount.

GetDataSource принимает имя из неправильного множества без ошибки, и настройка так и не вступает в силу. Затем соединение использует драйвер по умолчанию, что может его ослабить. Encrypt=Strict на этом пути оставляет шифрование на MandatoryMSOLEDBSQL19, поэтому соединение отбрасывает TDS 8.0 и ведёт переговоры о шифровании в прелогине cleartext, при этом шифрование полностью отключается на MSOLEDBSQL. Не во всех случаях происходит fail-open: неверно заданное значение TrustServerCertificate точно так же игнорируется, из-за чего для свойства сохраняется значение по умолчанию false, а проверка сертификата остаётся включённой.

Не рассчитывайте на ошибку, чтобы заметить ошибку. Имя, не принадлежащее ни одному набору, например ZzzNotAKeyword, создаёт Invalid строка подключения attribute запись, но имя из неправильного множества не даёт результата. Чтобы убедиться, что параметр был применён, перед подключением снова прочитайте значение свойства с помощью IDBProperties::GetProperties. Сведения о наборе ключевых слов для каждого API см. в разделе Использование ключевых слов строки подключения с драйвером OLE DB для SQL Server.

OLE DB передаёт диагностические сведения через объект ошибок, а не только через HRESULT, поэтому классифицируйте сбои перед повторной попыткой. Ошибка аутентификации или конфигурации сразу же выходит из строя, вместо того чтобы потрачить весь бюджет на повторные попытки.

Дополнительные сведения о каждой части этой конфигурации см. в следующей статье:

Список временных ошибок Azure SQL см. в разделе коды ошибок временных сбоев.

Ключевые особенности

  • Аутентификация Microsoft Entra ID: Подключения без пароля с управляемой идентификацией, принципом сервиса, интерактивными и интегрированными потоками.
  • Строгое шифрование: подключения TDS 8.0 с полной валидацией сертификата, а также TLS 1.3 в версиях 19.2.0 и позднее.
  • Устойчивость соединения в простое: прозрачное восстановление соединения, которое оторвалось во время простоя.
  • Несколько активных наборов результатов (MARS): более одного незавершённого запроса в одном соединении.
  • Массовое копирование: высокопроизводительные вставки через интерфейсы массового копирования.
  • Параметры с таблицьными значениями: Весь набор результатов передавался на сервер в виде одного параметра.
  • Группы доступности Always On: поддержка прослушивателя с помощью MultiSubnetFailover для быстрого переключения при отказе.
  • Поддержка UTF-8 и UTF-16: данные символов в обоих кодировках.
  • Классификация данных: Метаданные чувствительности для классифицированных столбцов.
  • Асинхронные операции: неблокирующие операции с источниками данных и набором строк.

Начало работы

Article Description
Когда использовать драйвер OLE DB Когда выбирать драйвер OLE DB Driver for SQL Server вместо других драйверов SQL Server.
Download Доступны программы установки для каждой поддерживаемой версии драйвера.
Требования к системе Поддерживаемые операционные системы, версии SQL Server и предварительные требования для первой установки.
Строительные приложения Заголовочные файлы и файлы библиотек, структура установки и изменения при переходе с MDAC.
Создание приложения Последовательность вызовов, по которой следует приложение, от подключения до выполнения команды и чтения результатов.
Жизненный цикл поддержки Какие версии драйверов поддерживаются и когда каждая из них выходит из поддержки.

Настройка и подключение

Article Description
Ключевые слова строки подключения Все ключевые слова строки подключения, которые поддерживает драйвер, и их допустимые значения.
Объекты источников данных Создайте и инициализируйте источник данных и объекты сессии, с которых строится соединение.
Использование ADO с драйвером Получайте доступ к возможностям драйвера, таким как MARS, уведомления о запросе и тип XML из ADO.
Высокий уровень доступности и аварийное восстановление Подключайтесь через слушатель группы доступности и ключевые слова, которые контролируют поведение отказа.
Устойчивость к простою соединения Автоматически восстановить соединение, которое оторвалось во время простоя.
Поддержка LocalDB Подключитесь к экземпляру LocalDB для локальной разработки и тестирования.

Аутентифицировать и защитить

Article Description
Использование идентификатора Microsoft Entra Режимы аутентификации Microsoft Entra, которые поддерживает драйвер, включая управляемую идентификацию и интерактивность.
Шифрование и проверка сертификатов Настройте Encrypt и TrustServerCertificate, а также контролируйте, как проверяется серверный сертификат.
Программное изменение паролей Обработайте просроченный пароль и установите новый, не выходя из приложения.
Поддержка имён принципиального сервиса (SPN) в клиентских соединениях Установите имя принципа сервиса на соединении, чтобы взаимная аутентификация Kerberos прошла успешно.
Использование классификации данных Прочитайте метки чувствительности, которые SQL Server возвращает для засекреченных столбцов.

Выполнение команд и обработка результатов

Article Description
Команды Интерфейс ICommand и модель объекта команд, на которых строится выполнение команд.
Синтаксис команд Сочетание синтаксических конструкций ODBC SQL, ISO и Transact-SQL, поддерживаемых драйвером в тексте команды.
Параметры команды Отмечайте параметры в командном тексте и назначайте типы, поддерживаемые драйвером для каждого из них.
Использование нескольких активных наборов результатов (MARS) Оставляйте открытыми более одного ожидающего результата на одном соединении.
Выполнение асинхронных операций Запустите операцию, не блокируя вызывающий поток, и опросите или дождитесь завершения.
Работа с уведомлениями о запросах Зарегистрируйтесь для получения уведомления, когда результат запроса изменится на сервере.
Статьи с инструкциями по обработке результатов Работающие примеры, которые выполняют сохранённую процедуру или функцию и читают коды возврата, параметры выхода и строки.

Работа с наборами строк и курсорами

Article Description
Наборы строк Интерфейсы рядов и свойства, которые определяют, какой тип строк вы получите.
Сбор рядов Используйте IRowset для последовательного извлечения строк, чтения значений столбцов и освобождения строк.
Обновление данных в наборах строк Запросите IRowsetChange или IRowsetUpdate для получения изменяемого набора строк и управления его блокировкой.
Закладки Сохраняйте позицию строки и возвращайтесь к ней позже, вместо того чтобы перезагружать последовательно.
Наборы строк и курсоры SQL Server Когда драйвер использует стандартный набор результатов, а когда вместо этого открывает серверный курсор.

Массовое копирование

Article Description
Выполнение операций массового копирования Перемещайте большие объемы строк в таблицу или из неё через файлы данных или программные переменные.
Массовое копирование данных с помощью IRowsetFastLoad Массовое копирование данных в таблицу SQL Server с помощью интерфейса IRowsetFastLoad.
Отправляйте данные BLOB с помощью IRowsetFastLoad и ISequentialStream Используйте IRowsetFastLoad для потоковой передачи BLOB-данных переменной длины для каждой строки в SQL Server.

Параметры с табличным значением

Article Description
Обзор табличных параметров Как параметры, имеющие табличные значения, передают несколько строк данных на сервер в одном параметре.
Ссылка на параметры с таблицными значениями Создание рядов параметров и обнаружение типов параметров.
Вставка данных в параметры таблицы Модель push и pull для подачи строк параметров с табличными значениями.
Использование параметров с таблицными значениями Создайте параметр с таблицным значением и передайте его строки в хранящую процедуру.

Работа с крупными и бинарными данными

Article Description
BLOB и OLE-объекты Читайте и записывайте столбцы BLOB в виде потоков через ISequentialStream.
Получение больших данных Извлекайте большое значение столбца по частям вместо одного связанного буфера.
Установка больших данных Отправьте значение большого столбца на сервер из объекта потребительского хранилища.
Поддержка FILESTREAM Сохраняйте большие двоичные значения, которые можно читать через SQL Server или через файловую систему.
Статьи с инструкциями по FILESTREAM Работали примеры, которые читают и записывают столбцы FILESTREAM с помощью потоковых интерфейсов.

Управление таблицами, индексами и хранящимися процедурами

Article Description
Таблицы и указатели Создавать, изменять и отбрасывать таблицы и индексы через ITableDefinition и IIndexDefinition.
Создание таблиц SQL Server Определите столбцы и вызовите ITableDefinition::CreateTable, чтобы создать таблицу.
Создание индексов SQL Server Определим новый индекс в существующей таблице с IIndexDefinition::CreateIndex.
Хранимые процедуры Вызовите сохранённую процедуру с синтаксисом ODBC CALL или RPC и прочитайте её возвратный код и выходные параметры.

Типы данных

Article Description
Обзор типов данных Как типы SQL Server сопоставляются с типами OLE DB при привязке параметров и столбцов.
Отображение типов данных в наборах строк и параметрах Полная таблица отображения типов для столбцов рядов и параметров команд.
Использование типов больших значений Связывайте типы varchar(max), nvarchar(max) и varbinary(max).
Использование типов данных в XML Храните и извлекайте XML-документы и фрагменты в xml-столбце.
Использование пользовательских типов Связывать пользовательские типы CLR, которые драйвер представляет как двоичные значения с метаданными типа.
Поддержка разреженных столбцов Поддержка драйверов для разрежённых столбцов, оптимизированных для хранения нулевых значений.
Поддержка UTF-8 Работайте с серверными правилами сортировки UTF-8 и клиентской кодировкой UTF-8.
Поддержка UTF-16 Как драйвер обрабатывает суррогатные пары при заполнении клиентского буфера.
Улучшения даты и времени Свяжите типы date, time, datetime2 и datetimeoffset, а также допустимые для них преобразования.

Транзакции

Article Description
Обзор транзакций Поддержка локальных транзакций и координатор распределенных транзакций (Майкрософт) для распределённых транзакций.
Уровни изоляции Установите уровень изоляции для сеанса, а также то, какой параллелизм допускает каждый уровень.
Работа с изоляцией снимков Используйте версионирование строк, чтобы увеличить параллельность чтения, не блокируя авторов.
Поддержка распределённых транзакций Подключите сессию к распределённой транзакции с помощью ITransactionJoin::JoinTransaction.

Диагностика и устранение неполадок

Article Description
Ошибки Как драйвер сообщает о сбоях, и какие интерфейсы передают детали.
Извлечение информации об ошибке Пройдите по интерфейсам ошибок, чтобы прочитать текст сообщения, SQLSTATE и родной номер ошибки.
Доступ к диагностическим сведениям в журнале расширенных событий Включите трассировку драйверов и прочитайте полученный журнал расширенных событий.
Известные проблемы Известные проблемы в текущем драйвере и обходные решения, если таковые имеются.
Заметки о выпуске Что менялось в каждом выпуске драйверов, сначала новейшие.

Перейти на текущий драйвер

Существует три поколения поставщиков Microsoft OLE DB для SQL Server. Используйте MSOLEDBSQL19 для новых и существующих приложений и конвертируйте существующие строки соединения в них. Поставщик OLE DB был исключен из числа устаревших и повторно выпущен в 2018 году.

Поколение Строка провайдера Status
Microsoft OLE DB Driver for SQL Server (эта статья) MSOLEDBSQL19, MSOLEDBSQL Supported. MSOLEDBSQL19 — это актуальный драйвер, который следует использовать для новой разработки.
Нативный клиент SQL Server (SNAC) SQLNCLI11, SQLNCLI Удалено из SQL Server 2022 и SQL Server Management Studio 19. Не рекомендуется для новых проектов.
Microsoft OLE DB Provider для SQL Server SQLOLEDB Входит в состав Windows Data Access Components. Больше не обслуживается. Не рекомендуется для новых проектов.
Article Description
Различия между основными версиями MSOLEDBSQL Критические изменения между OLE DB Driver 19 и версией 18, включая параметры шифрования по умолчанию, изменения типов свойств и шаги миграции.
Обновление приложения из MDAC Что изменилось между старым OLE DB Provider для SQL Server и текущим драйвером, и что стоит проверить перед обновлением.
Updating an application from SQL Server 2005 Native Client (Обновление приложения с переходом от SQL Server 2005 Native Client) Критические изменения в OLE DB Driver for SQL Server, начиная с SQL Server Native Client в SQL Server 2005 (9.x).

Ссылки

Article Description
OLE DB Driver for SQL Server features (Функции драйвера OLE DB для SQL Server) Индекс особенностей, специфичных для водителя, и где каждая из них документирована.
Программирование OLE DB Модель COM API, которую показывает драйвер, и то, как он взаимодействует с SQL Server через TDS.
Статьи с инструкциями по OLE DB Указатель статей с инструкциями OLE DB, сгруппированных по задачам.
Интерфейсы OLE DB Интерфейсы и методы OLE DB, которые демонстрируют специфическое поведение для провайдера в этом драйвере.
Поддержка рядов схем Поведение набора строк схемы, зависящее от конкретного провайдера, включая метаданные, возвращаемые от связанных серверов.
Поиск дополнительной информации Спецификации, образцы и ресурсы сообщества вне этого набора документации.