Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Microsoft Driver do OLE DB para SQL Server é uma interface independente de programação de aplicações (API) de acesso a dados que faz parte do OLE DB. Ele conecta aplicações em C e C++ ao Microsoft SQL Mecanismo de Banco de Dados no Banco de Dados SQL do Azure, SQL Database no Microsoft Fabric, Instância Gerenciada de SQL do Azure e em versões suportadas do SQL Server. A Microsoft lançou o jogo pela primeira vez em 2018 como versão 18 e o incluiu no SQL Server 2019 (15.x).
MSOLEDBSQL19 é o driver atual. Em geral, é compatível com versões anteriores do SQL Server Native Client (SNAC) e oferece recursos além dos fornecidos pelo SNAC e pelo provedor OLE DB do SQL Server fornecido pelo Windows Data Access Components (Windows DAC, anteriormente Microsoft Data Access Components, ou MDAC).
Escolha o ponto de partida
- Para decidir se o OLE DB é a API certa para sua aplicação, comece com Quando usar o Driver do OLE DB para SQL Server.
- Para instalar o driver e começar a escrever código, vá em Download Driver do OLE DB para SQL Server, Requisitos do Sistema e Construção de aplicações com Driver do OLE DB para SQL Server.
- Para se conectar ao SQL do Azure com autenticação sem senha, acesse Usar o Microsoft Entra ID e Usar palavras-chave da cadeia de conexão.
- Para migrar de
SQLNCLIouSQLOLEDB, vá em Atualizar uma aplicação para o Driver do OLE DB para SQL Server a partir do MDAC e diferenças principais de versão. - Para usar o driver do ADO, vá em Usando ADO com o Driver do OLE DB para SQL Server.
- Para diagnosticar um problema de conexão ou consulta, vá em Acessar informações de diagnóstico no log de eventos estendido e Problemas conhecidos.
Linha de base de produção para SQL do Azure
Use esse snippet como ponto de partida para uma conexão de SQL do Azure orientada à produção. Ele carrega o nome do servidor e o nome do banco de dados a partir da configuração da aplicação, autentica com uma identidade gerenciada para que nenhum segredo apareça na cadeia de conexão e permite a criptografia Tabular Data Stream (TDS) 8.0 com validação completa do certificado. Define um tempo limite de conexão por tentativa e repete as tentativas após falhas transitórias com retardo exponencial e jitter.
O trecho em C++ neste artigo omite as diretivas de inclusão, a inicialização de COM e o helper de log por 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 habilitam a resiliência de conexão ociosa, que restaura de forma transparente uma conexão que foi perdida enquanto estava ociosa. Eles não fazem nova tentativa de conexão inicial, por isso este trecho também implementa novas tentativas em nível de aplicação. Mantenha ambos.
Esse snippet constrói sua cadeia de conexão para IDataInitialize::GetDataSource, que usa os nomes de palavras-chave espaçados mostrados aqui, como Use Encryption for Data e Connect Retry Count.
IDBInitialize::Initialize e ADO usam nomes diferentes para as mesmas configuraçõ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 então usa o driver padrão, o que pode enfraquecê-la.
Encrypt=Strict nesse caminho deixa a criptografia em Mandatory em MSOLEDBSQL19, então a conexão cai no TDS 8.0 e negocia a criptografia no pré-login em texto claro, deixando a criptografia totalmente desligada em MSOLEDBSQL. Nem todo caso falha em aberto: o valor incorretamente definido TrustServerCertificate é descartado da mesma forma, o que deixa a propriedade no valor padrão false e mantém a validação do certificado ativada.
Não conte com um erro para identificar o engano. Um nome que não pertence a nenhum conjunto, como ZzzNotAKeyword, produz um Invalid cadeia de conexão attribute registro, mas um nome do conjunto errado não produz nada. Para confirmar que uma configuração foi aplicada, leia a propriedade novamente com IDBProperties::GetProperties antes de se conectar. Para ver o conjunto de palavras-chave associado a cada API, consulte Usando palavras-chave de cadeia de conexão com Driver do OLE DB para SQL Server.
O OLE DB reporta diagnósticos através do objeto de erro em vez do HRESULT isolado, então classifique as falhas antes de tentar novamente. Nesse caso, a operação falha imediatamente devido a um erro de autenticação ou de configuração, em vez de consumir todo o orçamento de retentativas.
Para obter mais informações sobre cada parte dessa configuração, consulte:
- Uso de palavras-chave de cadeia de conexão com o Driver do OLE DB para SQL Server
- Usando Microsoft Entra ID
- Criptografia e validação de certificado
- Resiliência da conexão ociosa
- Suporte do Driver do OLE DB para SQL Server a alta disponibilidade e recuperação de desastres
Para o catálogo de erros transientes do SQL do Azure, veja códigos de erro de falha transitória.
Características principais
- Autenticação Microsoft Entra ID: Conexões sem senha com identidade gerenciada, principal de serviço, fluxos interativos e integrados.
- Criptografia rigorosa: conexões TDS 8.0 com validação completa de certificados, e TLS 1.3 na versão 19.2.0 e versões posteriores.
- Resiliência da conexão ociosa: Restauração transparente de uma conexão que caiu enquanto estava ociosa.
- Múltiplos conjuntos de resultados ativos (MARS): Mais de uma solicitação pendente por conexão.
- Cópia em lote: Inserções de alta vazão por meio das interfaces de cópia em lote.
- Parâmetros com valores de tabela: Um conjunto inteiro de resultados passado para o servidor como um único parâmetro.
-
Grupos de disponibilidade Always On: Suporte a listener com
MultiSubnetFailoverpara failover rápido. - 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 e de conjunto de linhas não bloqueantes.
Introdução
| Article | Description |
|---|---|
| Quando usar o Driver OLE DB | Quando escolher o Driver do OLE DB para SQL Server em vez dos outros drivers do SQL Server. |
| Download | Downloads do instalador para todas as versões de drivers suportadas. |
| Requisitos do sistema | Sistemas operacionais suportados, versões do SQL Server e pré-requisitos para instalar primeiro. |
| Aplicações na construção | Cabeçalhos e arquivos de biblioteca, layout de instalação e o que muda quando você faz upgrade do MDAC. |
| Criando uma aplicação | A sequência de chamadas que uma aplicação segue, desde a conexão até a execução de um comando e a leitura dos resultados. |
| Ciclo de vida do suporte | Quais versões de drivers são suportadas e quando cada uma sai do suporte. |
Configuração e conexão
| Article | Description |
|---|---|
| Palavras-chave de cadeia de conexão | Cada palavra-chave da cadeia de conexão aceita pelo driver, com seus valores permitidos. |
| Objetos fonte de dados | Crie e inicialize a fonte de dados e os objetos de sessão a partir dos quais a conexão é construída. |
| Usando ADO com o driver | Recursos do driver Reach como MARS, notificações de consulta e o tipo xml do ADO. |
| Alta disponibilidade e recuperação de desastre | Conecte-se usando um listener de grupo de disponibilidade e as palavras-chave que controlam o comportamento de failover. |
| Resiliência da conexão ociosa | Restaurar automaticamente uma conexão que caiu enquanto estava ociosa. |
| Suporte ao LocalDB | Conecte-se a uma instância do LocalDB para desenvolvimento e testes locais. |
Autenticar e proteger
| Article | Description |
|---|---|
| Usando Microsoft Entra ID | Os modos de autenticação Microsoft Entra são suportados pelo driver, incluindo identidade gerenciada e interativo. |
| Criptografia e validação de certificado | Defina Encrypt e TrustServerCertificate, e controle como o certificado do servidor é validado. |
| Alterando senhas programaticamente | Gerencie uma senha vencida e defina uma nova sem sair da sua aplicação. |
| Suporte ao nome principal do serviço (SPN) em conexões de clientes | Defina o nome principal de serviço em uma conexão para que a autenticação mútua do Kerberos seja bem-sucedida. |
| Uso da classificação de dados | Leia os rótulos de sensibilidade que o SQL Server retorna para colunas classificadas. |
Executar comandos e processar resultados
| Article | Description |
|---|---|
| Comandos | A ICommand interface e o modelo de objetos de comando sobre o qual a execução do comando são construídos. |
| Sintaxe de comando | A mistura de sintaxes SQL ODBC, ISO e Transact-SQL que o driver aceita no texto do comando. |
| Parâmetros de comando | Marque parâmetros no texto do comando e atribua os tipos que o driver suporta para cada um. |
| Uso de múltiplos conjuntos de resultados ativos (MARS) | Mantenha mais de um conjunto de resultados pendentes abertos em uma única conexão. |
| Realização de operações assíncronas | Inicie uma operação sem bloquear a thread que chama, e faça sonding ou espere que ela termine. |
| Trabalhando com notificações de consulta | Registre-se para receber uma notificação quando o resultado de uma consulta mudar no servidor. |
| Artigos práticos sobre 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 | As interfaces do conjunto de linhas e as propriedades que determinam qual tipo de conjunto de linhas você obtém. |
| Buscar linhas | Use IRowset para buscar linhas sequencialmente, ler valores de colunas e liberar linhas. |
| Atualização de dados em conjuntos de linhas | Solicite IRowsetChange ou IRowsetUpdate para obter um conjunto de linhas modificável e controlar seu bloqueio. |
| Bookmarks | Salve uma posição de linha e volte a ela depois, em vez de buscar sequencialmente. |
| Conjuntos de linhas e cursores do SQL Server | Quando o driver usa um conjunto de resultados padrão e quando abre um cursor de servidor em vez disso. |
Cópia em lote
| Article | Description |
|---|---|
| Realização de operações de cópia em massa | Mover grandes volumes de linhas para dentro ou fora de uma tabela por meio de arquivos de dados ou variáveis de programa. |
| Cópia em massa dos dados usando IRowsetFastLoad | Copie dados em massa para uma tabela SQL Server com a IRowsetFastLoad interface. |
| Envie dados BLOB usando IRowsetFastLoad e ISequentialStream | Use 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 parâmetros com valores de tabela passam várias linhas de dados para o servidor em um único parâmetro. |
| Referência de parâmetros com valores de tabela | Criação de rowsets de parâmetros e descoberta de tipos de parâmetros. |
| Inserindo dados em parâmetros de valores de tabela | O modelo push e o modelo pull para fornecer linhas de parâmetros com valores em tabelas. |
| Uso de parâmetros com valores de tabela | Crie um parâmetro com valores de tabela e passe suas linhas para um procedimento armazenado. |
Trabalho com dados grandes e binários
| Article | Description |
|---|---|
| BLOBs e objetos OLE | Leia e grave colunas BLOB como fluxos por meio de ISequentialStream. |
| Obtendo grandes volumes de dados | Recupere um valor de coluna grande em blocos em vez de um buffer limitado. |
| Configuração de dados em grande escala | 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 você possa ler pelo SQL Server ou pelo sistema de arquivos. |
| Artigos práticos do FILESTREAM | Exemplos práticos que leem e gravam colunas FILESTREAM com interfaces de streaming. |
Gerenciar tabelas, índices e procedimentos armazenados
| Article | Description |
|---|---|
| Tabelas e índices | Crie, altere e exclua tabelas e índices por meio de ITableDefinition e IIndexDefinition. |
| Criando tabelas para SQL Server | Defina colunas e chame ITableDefinition::CreateTable para criar uma tabela. |
| Criando índices para SQL Server | Defina um novo índice em uma tabela existente com IIndexDefinition::CreateIndex. |
| Procedimentos armazenados | Chame um procedimento armazenado com sintaxe ODBC CALL ou RPC, e leia 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 se mapeiam para os tipos do OLE DB quando você atribui 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 do conjunto de linhas e dos parâmetros de comando. |
| Usando tipos de valor grandes | Vincule os tipos varchar(max), nvarchar(max) e varbinary(max). |
| Uso de tipos de dados XML | Armazene e recupere documentos e fragmentos XML em uma coluna xml. |
| Usando tipos definidos pelo usuário | Vincule CLR aos tipos definidos pelo usuário, que o driver expõe como valores binários com metadados de tipo. |
| Suporte de colunas esparsas | Suporte do driver a colunas esparsas, que são otimizadas para armazenar valores nulos. |
| Suporte para UTF-8 | Trabalhe com agrupamentos do servidor UTF-8 e codificação do cliente UTF-8. |
| Suporte ao UTF-16 | Como o driver lida com pares substitutos quando preenche um buffer de cliente. |
| Melhorias em data e horário | Vincule os tipos de data, hora, datatime2 e datatimeoffset, e as conversões que eles permitem. |
Transactions
| Article | Description |
|---|---|
| Visão geral das transações | Suporte local a transações e o Coordenador de Transações Distribuídas da Microsoft para transações distribuídas. |
| Níveis de isolamento | Defina o nível de isolamento para uma sessão e qual concorrência cada nível permite. |
| Trabalhando com isolamento de snapshots | Use a versão de linha para aumentar a concorrência de leitura sem bloquear os escritores. |
| Suporte a transações distribuídas | Registre uma sessão em uma transação distribuída com ITransactionJoin::JoinTransaction. |
Diagnosticar e solucionar problemas
| Article | Description |
|---|---|
| Erros | Como o driver relata falhas e quais interfaces contêm os detalhes. |
| Recuperação de informações de erro | Navegue pelas interfaces de erro para ler o texto da mensagem, o SQLSTATE e o número do erro nativo. |
| Acessando informações de diagnóstico no log de eventos estendidos | Ative o rastreamento do motorista e leia o log de eventos estendidos resultante. |
| Problemas conhecidos | Problemas abertos no driver atual, com soluções alternativas quando existem. |
| Notas de lançamento | O que mudou em cada versão do driver, da mais recente para a mais antiga. |
Migrar para o driver atual
Existem três gerações de provedores Microsoft OLE DB para SQL Server. Use MSOLEDBSQL19 para aplicações novas e existentes, e converta as strings de conexão existentes para ele. O provedor OLE DB foi desatualizado e relançado em 2018.
| Generation | Cadeia de caracteres do provedor | Status |
|---|---|---|
| Microsoft Driver do OLE DB para SQL Server (este artigo) |
MSOLEDBSQL19, MSOLEDBSQL |
Suportado.
MSOLEDBSQL19 é o driver atual e o que deve ser usado para novos desenvolvimentos. |
| 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 for SQL Server | SQLOLEDB |
Vem com componentes de acesso a dados do Windows. Não mais mantido. Não recomendado para novos desenvolvimentos. |
| Article | Description |
|---|---|
| Diferenças de versão principal do MSOLEDBSQL | Alterações significativas entre o OLE DB Driver 19 e a versão 18, incluindo configurações padrão de criptografia, alterações nos tipos de propriedade e etapas de migração. |
| Atualização de uma aplicação a partir 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? |
| Atualização de um aplicativo no SQL Server 2005 Native Client | As alterações significativas no Driver do OLE DB para SQL Server desde o SQL Server Native Client no SQL Server 2005 (9.x). |
Reference
| Article | Description |
|---|---|
| Recursos do OLE DB Driver para 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 ele se comunica com o SQL Server via 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 provedor neste driver. |
| Suporte a conjuntos de linhas de esquema | Comportamento específico do conjunto de linhas de esquema do provedor, incluindo metadados retornados de servidores vinculados. |
| Encontrando mais informações | Especificações, exemplos e recursos comunitários fora deste conjunto de documentação. |