Driver Microsoft OLE DB para SQL Server

Baixar driver OLE DB

O Microsoft OLE DB Driver for SQL Server é uma interface de programação de aplicações (API) independente para acesso a dados que faz parte do OLE DB. Liga aplicações em C e C++ ao Microsoft SQL Database Engine no Base de Dados SQL do Azure, SQL Database no Microsoft Fabric, Azure SQL Managed Instance e em versões suportadas do SQL Server. A Microsoft lançou-o pela primeira vez em 2018 como versão 18 e incluiu-o no SQL Server 2019 (15.x).

MSOLEDBSQL19 é o driver atual. É geralmente retrocompatível com o SQL Server Native Client (SNAC) e oferece funcionalidades que vão além tanto do SNAC como do fornecedor OLE DB do SQL Server disponibilizado pelo Windows Data Access Components (Windows DAC, anteriormente Microsoft Data Access Components, ou MDAC).

Escolhe o teu ponto de partida

Linha de base de produção para o SQL do Azure

Use este excerto como ponto de partida para uma ligação SQL do Azure orientada para produção. Carrega o nome do servidor e o nome da base de dados a partir da configuração da aplicação, autentica-se com uma identidade gerida para que não apareça segredo na cadeia de ligação, e permite a encriptação do Tabular Data Stream (TDS) 8.0 com validação completa do certificado. Define um tempo limite de ligação por tentativa e repete as tentativas em caso de falhas transitórias, com recuo exponencial e variação aleatória.

O excerto em C++ neste artigo omite as diretivas include, a inicialização do COM e a função auxiliar de registo por uma questão de brevidade.

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 e Connect Retry Interval ativam a resiliência da ligação inativa, que restaura de forma transparente uma ligação que foi interrompida durante a inatividade. Eles não tentam novamente a ligação inicial, razão pela qual este snippet também implementa uma retentativa ao nível da aplicação. Mantém ambos.

Este snippet constrói a sua cadeia de ligação para IDataInitialize::GetDataSource, que utiliza os nomes-chave espaçados mostrados aqui, como Use Encryption for Data e Connect Retry Count. IDBInitialize::Initialize e ADO usam nomes diferentes para as mesmas definições, como Encrypt e ConnectRetryCount.

GetDataSource aceita um nome do conjunto errado sem gerar erro, e a configuração nunca entra em vigor. A conexão passa então a usar o controlador predefinido, o que a pode enfraquecer. Encrypt=Strict neste caminho mantém a encriptação em Mandatory em MSOLEDBSQL19, pelo que a ligação deixa de usar o TDS 8.0 e negoceia a encriptação no pré-login em texto simples, mantendo a encriptação totalmente desativada em MSOLEDBSQL. Nem todos os casos resultam num estado aberto: o conjunto incorreto TrustServerCertificate é descartado da mesma forma, o que deixa a propriedade no valor predefinido false e mantém ativa a validação do certificado.

Não contes com uma mensagem de erro para detetar a falha. Um nome que não pertence a nenhum conjunto, como ZzzNotAKeyword, produz um Invalid cadeia de ligação attribute registo, mas um nome do conjunto errado não produz nada. Para confirmar que uma definição teve efeito, volte a ler a propriedade com IDBProperties::GetProperties antes de estabelecer ligação. Para o conjunto de palavras-chave que acompanha cada API, consulte Utilizar palavras-chave de cadeia de ligação com o Controlador OLE DB para SQL Server.

O OLE DB reporta diagnósticos através do objeto de erro em vez do HRESULT isolado, classificando as falhas antes de tentar novamente. Uma operação falha imediatamente devido a um erro de autenticação ou de configuração, em vez de consumir todo o limite de tentativas de repetição.

Para mais informações sobre cada parte desta configuração, veja:

Para o catálogo de erros transitórios do SQL do Azure, consulte códigos de erro de falha transitória.

Principais características

  • Autenticação do Microsoft Entra ID: Ligações sem palavra-passe com identidade gerida, entidade de serviço e fluxos interativos e integrados.
  • Encriptação rigorosa: ligações TDS 8.0 com validação total de certificados, e TLS 1.3 na versão 19.2.0 e versões posteriores.
  • Resiliência da ligação inativa: Restauração transparente de uma ligação que caiu enquanto estava inativa.
  • Múltiplos conjuntos de resultados ativos (MARS): Mais do que um pedido pendente por ligação.
  • Cópia em massa: Inserções de alta capacidade através das interfaces de cópia em massa.
  • Parâmetros com valores de tabela: Um conjunto inteiro de resultados passado ao servidor como um único parâmetro.
  • Grupos de disponibilidade Always On: Suporte do listener com MultiSubnetFailover para ativação pós-falha rápida.
  • Suporte a UTF-8 e UTF-16: Dados de caracteres em ambas as codificações.
  • Classificação de dados: Metadados de sensibilidade para colunas classificadas.
  • Operações assíncronas: Operações de fonte de dados não bloqueantes e de conjuntos de linhas.

Introdução

Article Description
Quando usar o Driver OLE DB Quando escolher o OLE DB Driver for SQL Server em vez dos outros drivers do SQL Server.
Download Transferências do instalador para todas as versões suportadas de controladores.
Requisitos de sistema Sistemas operativos suportados, versões do SQL Server e pré-requisitos para instalar primeiro.
Aplicações na construção Ficheiros de cabeçalho e biblioteca, layout da instalação e o que muda quando se atualiza a partir do MDAC.
Criação de uma aplicação A sequência de chamadas que uma aplicação segue, desde a ligação à execução de um comando até à leitura dos resultados.
Ciclo de vida do suporte Que versões do controlador são suportadas e quando cada uma deixa de ser suportada.

Configurar e ligar

Article Description
Palavras-chave da cadeia de ligação Todas as palavras‑chave da cadeia de ligação que o controlador aceita, com os respetivos valores aceites.
Objetos fonte de dados Crie e inicialize a fonte de dados e os objetos de sessão a partir dos quais a ligação é construída.
Utilizar ADO com o driver Funcionalidades do driver Reach como MARS, notificações de consulta e o tipo xml do ADO.
Alta disponibilidade e recuperação de desastres Ligue-se através de um ouvinte de grupo de disponibilidade e das palavras-chave que controlam o comportamento de failover.
Resiliência da ligação ociosa Restaura automaticamente uma ligação que caiu enquanto estava inativa.
Suporte ao LocalDB Ligue-se a uma instância LocalDB para desenvolvimento e testes locais.

Autenticar e proteger

Article Description
Utilização do Microsoft Entra ID Os modos de autenticação do Microsoft Entra suportados pelo driver, incluindo identidade gerida e autenticação interativa.
Encriptação e validação de certificados Define Encrypt e TrustServerCertificate, e controla como o certificado do servidor é validado.
Alteração de palavras-passe programaticamente Manuseie uma palavra-passe expirada e defina uma nova sem sair da sua candidatura.
Suporte ao nome principal do serviço (SPN) nas ligações do cliente Defina o nome principal do serviço numa ligação para que a autenticação mútua Kerberos tenha sucesso.
Usando a classificação de dados Leia as etiquetas de sensibilidade que o SQL Server devolve para colunas classificadas.

Executar comandos e processar resultados

Article Description
Comandos A ICommand interface e o modelo de objetos de comandos sobre o qual a execução dos comandos é construída.
Sintaxe de comandos A combinação da sintaxe SQL de ODBC, ISO e Transact-SQL que o controlador aceita no texto do comando.
Parâmetros de comando Marque os parâmetros no texto do comando e associe os tipos que o driver suporta para cada um.
Utilização de múltiplos conjuntos de resultados ativos (MARS) Mantenha aberto mais do que um conjunto de resultados pendentes numa única ligação.
Realização de operações assíncronas Iniciar uma operação sem bloquear a thread de chamada e sondar ou aguardar que termine.
Trabalhar com notificações de consulta Registe-se para receber uma notificação quando o resultado de uma consulta mudar no servidor.
Artigos práticos sobre o processamento de resultados Exemplos trabalhados que executam um procedimento ou função armazenada e leem códigos de retorno, parâmetros de saída e linhas.

Trabalhar com conjuntos de linhas e cursores

Article Description
Conjuntos de linhas A interface do conjunto de linhas e as propriedades que decidem que tipo de conjunto de linhas se obtém.
Buscar filas Use IRowset para buscar linhas sequencialmente, ler valores de colunas e libertar linhas.
Atualização de dados em conjuntos de linhas Peça IRowsetChange ou IRowsetUpdate para obter um conjunto de linhas modificável e controlar o respetivo bloqueio.
Favoritos Guarde a posição de uma linha e volte a ela mais tarde, em vez de a procurar novamente de forma sequencial.
Conjuntos de linhas e cursores do SQL Server Quando o controlador usa um conjunto de resultados por defeito e quando abre, em alternativa, um cursor de servidor.

Cópia de grandes volumes

Article Description
Realização de operações de cópia em massa Mover grandes volumes de linhas para dentro ou fora de uma tabela através de ficheiros de dados ou variáveis do programa.
Cópia em massa de dados usando IRowsetFastLoad Copiar dados em massa para uma tabela SQL Server com a IRowsetFastLoad interface.
Enviar dados BLOB usando IRowsetFastLoad e ISequentialStream Uso IRowsetFastLoad para transmitir dados BLOB de comprimento variável por linha para o SQL Server.

Parâmetros com valor de tabela

Article Description
Visão geral dos parâmetros com valores de tabela Como os parâmetros de valores de tabela passam várias linhas de dados para o servidor num único parâmetro.
Referência de parâmetros com valores de tabela Criação de conjuntos de linhas de parâmetros e descoberta de tipos de parâmetros.
Inserção de dados em parâmetros com valores de tabela O modelo push e o modelo pull para fornecer linhas de parâmetros com valores em tabelas.
Utilizar parâmetros com valores de tabela Crie um parâmetro com valores de tabela e passe as suas linhas para um procedimento armazenado.

Trabalho com dados grandes e binários

Article Description
BLOBs e objetos OLE Leia e escreva colunas BLOB como fluxos através de ISequentialStream.
Obtenção de grandes volumes de dados Recuperar um valor de coluna grande em blocos em vez de um buffer limitado.
Definição de big data Envie um valor de coluna grande para o servidor a partir de um objeto de armazenamento de consumidor.
Suporte a FILESTREAM Armazene valores binários grandes que possa ler através do SQL Server ou do sistema de ficheiros.
Artigos práticos do FILESTREAM Exemplos funcionais que liam e escreviam colunas FILESTREAM com interfaces de streaming.

Gerir tabelas, índices e procedimentos armazenados

Article Description
Tabelas e índices Criar, alterar e eliminar tabelas e índices através de ITableDefinition e IIndexDefinition.
Criação de tabelas SQL Server Defina colunas e chame ITableDefinition::CreateTable para criar uma tabela.
Criação de índices para SQL Server Defina um novo índice numa tabela existente com IIndexDefinition::CreateIndex.
Procedimentos armazenados Chame um procedimento armazenado com sintaxe ODBC CALL ou RPC, e leia o seu código de retorno e parâmetros de saída.

Tipos de dados

Article Description
Visão geral dos tipos de dados Como os tipos do SQL Server correspondem aos tipos do OLE DB quando se associam parâmetros e colunas.
Mapeamento de tipos de dados em conjuntos de linhas e parâmetros A tabela completa de mapeamento de tipos das colunas de rowset e dos parâmetros de comando.
Utilização de tipos de valor grande Liga os tipos varchar(max), nvarchar(max) e varbinary(max).
Utilização de tipos de dados XML Armazene e recupere documentos e fragmentos XML numa coluna xml.
Utilização de tipos definidos pelo utilizador Associe tipos definidos pelo utilizador do CLR, que o controlador expõe como valores binários com metadados de tipo.
Suporte de colunas esparsas Suporte do controlador para colunas esparsas, que estão otimizadas para armazenar valores nulos.
Suporte ao UTF-8 Trabalhe com regras de ordenação UTF-8 do servidor e codificação UTF-8 do cliente.
Suporte ao UTF-16 Como o controlador gere pares suplentes quando preenche a memória intermédia do cliente.
Melhorias de data e hora Associe os tipos date, time, datetime2 e datetimeoffset, e as conversões que estes permitem.

Transações

Article Description
Visão geral das transações Suporte a transações locais, e o Coordenador de Transações Distribuídas da Microsoft para transações distribuídas.
Níveis de isolamento Define o nível de isolamento para uma sessão e que concorrência cada nível permite.
Trabalhar com isolamento de snapshots Use a versão de linha para aumentar a concorrência de leituras sem bloquear os escritores.
Suporte a transações distribuídas Associe uma sessão a uma transação distribuída com ITransactionJoin::JoinTransaction.

Diagnosticar e solucionar problemas

Article Description
Erros Como o controlador comunica as falhas e quais as interfaces que fornecem essa informação detalhada.
Recuperação de informação de erro Percorra as interfaces de erro para ler o texto da mensagem, o SQLSTATE e o número de erro nativo.
Aceder à informação de diagnóstico no registo de eventos estendido Ative o rastreamento do controlador e leia o registo de eventos expandido resultante.
Problemas conhecidos Problemas abertos no driver atual, com soluções alternativas quando existem.
Notas de lançamento O que mudou em cada lançamento de drivers, o mais recente primeiro.

Migrar para o driver atual

Existem três gerações de fornecedores Microsoft OLE DB para SQL Server. Use MSOLEDBSQL19 para aplicações novas e existentes, e converta as cadeias de ligação existentes para ela. O fornecedor OLE DB ficou obsoleto e foi relançado em 2018.

Generation Cadeia de fornecedores Status
Microsoft OLE DB Driver for SQL Server (este artigo) MSOLEDBSQL19, MSOLEDBSQL Apoiado. MSOLEDBSQL19 é o controlador atual e o que deve ser usado para novo desenvolvimento.
SQL Server Cliente Nativo (SNAC) SQLNCLI11, SQLNCLI Removido do SQL Server 2022 e do SQL Server Management Studio 19. Não recomendado para novos desenvolvimentos.
Microsoft OLE DB Provider para SQL Server SQLOLEDB Inclui componentes de acesso a dados do Windows. Já não é mantido. Não recomendado para novos desenvolvimentos.
Article Description
Principais diferenças de versão do MSOLEDBSQL Quebra de alterações entre o Driver 19 e a versão 18 do OLE DB, incluindo os padrões de encriptação, alterações no tipo de propriedade e passos de migração.
Atualizar uma aplicação do MDAC O que mudou entre o antigo OLE DB Provider para SQL Server e o driver atual, e o que verificar antes de atualizar?
Atualizar uma aplicação a partir do SQL Server 2005 Native Client As mudanças marcantes no OLE DB Driver for SQL Server desde o SQL Server Native Client no SQL Server 2005 (9.x).

Reference

Article Description
Driver OLE DB para recursos do SQL Server Índice das características específicas do driver e onde cada uma está documentada.
Programação OLE DB O modelo da API COM que o driver expõe, e como comunica com o SQL Server através do TDS.
Artigos práticos do OLE DB Índice dos artigos práticos do OLE DB, agrupados por tarefa.
Interfaces OLE DB As interfaces e métodos do OLE DB que exibem comportamento específico do fornecedor neste driver.
Suporte a conjuntos de linhas de esquema Comportamento específico do conjunto de linhas de esquema do fornecedor, incluindo metadados devolvidos de servidores ligados.
Encontrar mais informações Especificações, exemplos e recursos comunitários fora deste conjunto de documentação.