Introdução ao namespace Microsoft.Data.SqlClient
O namespace Microsoft.Data.SqlClient é essencialmente uma nova versão do namespace System.Data.SqlClient. Microsoft.Data.SqlClient geralmente mantém a mesma API e retrocompatibilidade com o System.Data.SqlClient. Para migrar de System.Data.SqlClient para Microsoft.Data.SqlClient, para a maioria dos aplicativos, é simples. Adicione uma dependência NuGet em Microsoft.Data.SqlClient e atualize referências e instruções using
a Microsoft.Data.SqlClient.
Há algumas diferenças em APIs menos usadas em comparação com System.Data.SqlClient que podem afetar alguns aplicativos. Para essas diferenças, consulte o útil portabilidade cheat sheet.
Referência da API
Os detalhes da API Microsoft.Data.SqlClient podem ser encontrados no .NET API Browser.
Notas de versão do Microsoft.Data.SqlClient 6.0
Mudanças significativas na versão 6.0
- Caiu o suporte para .NET Standard. #2386
- Caiu o suporte para .NET 6 #2927
- Referências a UWP (UAP) removidas. #2483
- Removido o suporte de depuração do lado do cliente para o SQL 2000 no .NET Framework #2981, #2940
Novos recursos na versão 6.0
- Adicionado suporte para JSON tipo de dados #2916, #2892, #2891, #2880, #2882, #2829, #2830
- Adicionado suporte para .NET 9 #2946
- Adicionado tipo
Microsoft.Data.SqlClient.Diagnostics.SqlClientDiagnostic
em .NET. #2226 - Adicionado suporte
DateOnly
eTimeOnly
paraDataTable
como um parâmetro estruturado. #2258 - Adicionado suporte para
SqlConnectionOverrides
noOpenAsync()
API #2433 - Adicionada localização em Checo, Polaco e Turco #2987
- Objeto
TokenCredential
adicionado para aproveitar o cache de tokens noActiveDirectoryAuthenticationProvider
. #2380 - Ficheiro README adicionado ao pacote NuGet #2826
- Auditoria de pacotes NuGet ativada por meio da fonte de auditoria NuGet.org #3024
- Foi adicionado o exemplo de código ausente de SqlCommand_BeginExecuteReader #3009
- Adicionado rastreamento de escopo para
GenerateSspiClientContext
. #2497#2725
Suporte a tipos de dados JSON
O suporte ao tipo de dados JSON agora está disponível em Microsoft.Data.SqlClient v6.0. Esta versão apresenta o tipo de SqlJson
disponível como uma extensão para System.Data.SqlDbTypes
:
using System;
using System.Data.SqlTypes;
using System.Text.Json;
namespace Microsoft.Data.SqlTypes
{
/// <summary>
/// Represents the Json data type in SQL Server.
/// </summary>
public class SqlJson : INullable
{
/// <summary>
/// Parameterless constructor. Initializes a new instance of the SqlJson class which
/// represents a null JSON value.
/// </summary>
public SqlJson() { }
/// <summary>
/// Takes a <see cref="string"/> as input and initializes a new instance of the SqlJson class.
/// </summary>
/// <param name="jsonString"></param>
public SqlJson(string jsonString) { }
/// <summary>
/// Takes a <see cref="JsonDocument"/> as input and initializes a new instance of the SqlJson class.
/// </summary>
/// <param name="jsonDoc"></param>
public SqlJson(JsonDocument jsonDoc) { }
/// <inheritdoc/>
public bool IsNull => throw null;
/// <summary>
/// Represents a null instance of the <see cref="SqlJson"/> type.
/// </summary>
public static SqlJson Null { get { throw null; } }
/// <summary>
/// Gets the string representation of the JSON content of this <see cref="SqlJson" /> instance.
/// </summary>
public string Value { get ; }
}
}
O tipo de dados JSON suporta operações de leitura, gravação, streaming e cópia em massa.
Apresentando o SqlClientDiagnostics
Novos tipos estão disponíveis no namespace Microsoft.Data.SqlClient.Diagnostics
que fornecem uma coleção fortemente tipada de pares chave/valor. Esses tipos podem ser capturados consumindo aplicativos para coletar eventos de diagnóstico emitidos pelo driver. Esta versão apresenta os seguintes tipos:
SqlClientCommandBefore
SqlClientCommandAfter
SqlClientCommandError
SqlClientConnectionOpenBefore
SqlClientConnectionOpenAfter
SqlClientConnectionOpenError
SqlClientConnectionCloseBefore
SqlClientConnectionCloseAfter
SqlClientConnectionCloseError
SqlClientTransactionCommitBefore
SqlClientTransactionCommitAfter
SqlClientTransactionCommitError
SqlClientTransactionRollbackBefore
SqlClientTransactionRollbackAfter
SqlClientTransactionRollbackError
Adicionado suporte para ajustes de conexão na API OpenAsync()
O comportamento padrão do SqlConnection.OpenAsync()
pode ser substituído para desativar o atraso de dez segundos e as novas tentativas automáticas de conexão acionadas por erros transitórios.
using(SqlConnection sqlConnection = new SqlConnection("Data Source=(local);Integrated Security=true;Initial Catalog=AdventureWorks;"))
{
await sqlConnection.OpenAsync(SqlConnectionOverrides.OpenWithoutRetry, cancellationToken);
}
6.0 Suporte à plataforma de destino
- .NET Framework 4.6.2+ (Windows x86, Windows x64)
- .NET 8.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 6.0 Release Notes.
Notas de versão do Microsoft.Data.SqlClient 5.2
Novos recursos na versão 5.2
- Adicionado suporte de
SqlDiagnosticListener
em .NET Standard. #1931 - Adicionadas novas propriedades
RowsCopied64
aSqlBulkCopy
. #2004Leia mais - Adicionada uma nova API de
AccessTokenCallBack
paraSqlConnection
. #1260Leia mais - Adicionado suporte para a opção de registro
SuperSocketNetLib
para criptografar no .NET no Windows. #2047 - Adicionado suporte
SqlBatch
em .NET 6+ #1825, #2223Leia mais - Adicionado suporte à autenticação de identidade de carga de trabalho #2159#2264
- Adicionado suporte de localização no .NET #2210
- Adicionado suporte para agrupamento georgiano #2194
- Adicionado suporte para sistemas Big Endian #2170
- Adicionado suporte do .NET 8 #2230
- Adicionada versão explícita para as principais dependências da versão .NET em System.Runtime.Caching 8.0.0, System.Configuration.ConfigurationManager 8.0.0 e System.Diagnostics.DiagnosticSource 8.0.0 #2303
- Adicionada a capacidade de gerar símbolos de depuração num ficheiro de pacote separado #2137
Adicionada nova propriedade RowsCopied64
a SqlBulkCopy
SqlBulkCopy tem uma nova propriedade RowsCopied64
que suporta long
tipos de valor.
Observe que o comportamento de SqlBulkCopy.RowsCopied
existente permanece inalterado. Quando o valor excede int.MaxValue
, RowsCopied
pode retornar um número negativo.
Exemplo de uso:
using (SqlConnection srcConn = new SqlConnection(srcConstr))
using (SqlCommand srcCmd = new SqlCommand("select top 5 * from employees", srcConn))
{
srcConn.Open();
using (DbDataReader reader = srcCmd.ExecuteReader())
{
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(dstConn))
{
bulkcopy.DestinationTableName = dstTable;
SqlBulkCopyColumnMappingCollection ColumnMappings = bulkcopy.ColumnMappings;
ColumnMappings.Add("EmployeeID", "col1");
ColumnMappings.Add("LastName", "col2");
ColumnMappings.Add("FirstName", "col3");
bulkcopy.WriteToServer(reader);
long rowsCopied = bulkcopy.RowsCopied64;
}
}
}
Adicionada nova propriedade AccessTokenCallBack
a SqlConnection
SqlConnection dá suporte à autenticação TokenCredential
introduzindo uma nova propriedade AccessTokenCallBack
como um delegado Func<SqlAuthenticationParameters, CancellationToken,Task<SqlAuthenticationToken>>
para retornar um token de acesso de autenticação federada.
Exemplo de uso:
using Microsoft.Data.SqlClient;
using Azure.Identity;
const string defaultScopeSuffix = "/.default";
string connectionString = GetConnectionString();
DefaultAzureCredential credential = new();
using SqlConnection connection = new(connectionString);
connection.AccessTokenCallback = async (authParams, cancellationToken) =>
{
string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
? authParams.Resource
: $"{authParams.Resource}{defaultScopeSuffix}";
AccessToken token = await credential.GetTokenAsync(
new TokenRequestContext([scope]),
cancellationToken);
return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
}
connection.Open();
Console.WriteLine("ServerVersion: {0}", connection.ServerVersion);
Console.WriteLine("State: {0}", connection.State);
SqlBatch API
Exemplo de uso:
using Microsoft.Data.SqlClient;
class Program
{
static void Main()
{
string str = "Data Source=(local);Initial Catalog=Northwind;"
+ "Integrated Security=SSPI;Encrypt=False";
RunBatch(str);
}
static void RunBatch(string connString)
{
using var connection = new SqlConnection(connString);
connection.Open();
var batch = new SqlBatch(connection);
const int count = 10;
const string parameterName = "parameter";
for (int i = 0; i < count; i++)
{
var batchCommand = new SqlBatchCommand($"SELECT @{parameterName} as value");
batchCommand.Parameters.Add(new SqlParameter(parameterName, i));
batch.BatchCommands.Add(batchCommand);
}
// Optionally Prepare
batch.Prepare();
var results = new List<int>(count);
using (SqlDataReader reader = batch.ExecuteReader())
{
do
{
while (reader.Read())
{
results.Add(reader.GetFieldValue<int>(0));
}
} while (reader.NextResult());
}
Console.WriteLine(string.Join(", ", results));
}
}
5.2 Suporte à plataforma de destino
- .NET Framework 4.6.2+ (Windows x86, Windows x64)
- .NET 6.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 5.2 Release Notes.
Alterações significativas na versão 5.1
Novos recursos na versão 5.1
- Adicionado suporte para
DateOnly
eTimeOnly
paraSqlParameter
valor eGetFieldValue
. #1813 - Adicionado suporte para TLS 1.3 para .NET Core e SNI Native. #1821
- Foi adicionada a configuração
ServerCertificate
paraEncrypt=Mandatory
ouEncrypt=Strict
. #1822Leia mais - Adicionado suporte ao Windows Arm64 ao direcionar o .NET Framework. #1828
Certificado do servidor
O valor padrão da configuração de conexão ServerCertificate
é uma cadeia de caracteres vazia. Quando Encrypt
é definido como Mandatory
ou Strict
, ServerCertificate
pode ser usado para especificar um caminho no sistema de arquivos para um arquivo de certificado para corresponder ao certificado TLS/SSL do servidor. O certificado especificado deve coincidir exatamente para ser válido. Os formatos de certificado aceitos são PEM
, DER
e CER
. Aqui está um exemplo de uso:
"Data Source=...;Encrypt=Strict;ServerCertificate=C:\\certificates\\server.cer"
5.1 Suporte à plataforma de destino
- .NET Framework 4.6.2+ (Windows x86, Windows x64)
- .NET 6.0+ (Windows x86, Windows x64, Windows Arm64, Gerenciador de Recursos do Windows Azure, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 5.1 Release Notes.
Notas de versão do Microsoft.Data.SqlClient 5.0
Quebrando mudanças na versão 5.0
- Caiu o suporte para o .NET Framework 4.6.1 #1574
- Foi adicionada uma dependência ao pacote Microsoft.SqlServer.Server. Essa nova dependência pode causar conflitos de namespace se seu aplicativo fizer referência a esse namespace e ainda tiver referências de pacote (diretas ou indiretas) para System.Data.SqlClient do .NET Core.
- Descartou classes do namespace
Microsoft.Data.SqlClient.Server
e as substituiu por tipos suportados do pacote Microsoft.SqlServer.Server.#1585. As classes e enums afetados são:- Microsoft.Data.SqlClient.Server.IBinarySerialize -> Microsoft.SqlServer.Server.IBinarySerialize
- Microsoft.Data.SqlClient.Server.InvalidUdtException -> Microsoft.SqlServer.Server.InvalidUdtException
- Microsoft.Data.SqlClient.Server.SqlFacetAttribute -> Microsoft.SqlServer.Server.SqlFacetAttribute
- Microsoft.Data.SqlClient.Server.SqlFunctionAttribute -> Microsoft.SqlServer.Server.SqlFunctionAttribute
- Microsoft.Data.SqlClient.Server.SqlMethodAttribute -> Microsoft.SqlServer.Server.SqlMethodAttribute
- Microsoft.Data.SqlClient.Server.SqlUserDefinedAggregateAttribute -> Microsoft.SqlServer.Server.SqlUserDefinedAggregateAttribute
- Microsoft.Data.SqlClient.Server.SqlUserDefinedTypeAttribute -> Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
- (enum) Microsoft.Data.SqlClient.Server.DataAccessKind -> Microsoft.SqlServer.Server.DataAccessKind
- (enum) Microsoft.Data.SqlClient.Server.Format -> Microsoft.SqlServer.Server.Format
- (enum) Microsoft.Data.SqlClient.Server.SystemDataAccessKind -> Microsoft.SqlServer.Server.SystemDataAccessKind
Novos recursos na versão 5.0
- Adicionado suporte para
TDS8
. Para usar o TDS 8, os usuários devem especificar Encrypt=Strict na cadeia de conexão. #1608Leia mais - Adicionado suporte para especificar o SPN do Servidor e o SPN do Servidor de Failover na conexão. #1607Leia mais
- Adicionado suporte para aliases ao direcionar o .NET Core no Windows. #1588Leia mais
- Adicionado SqlDataSourceEnumerator. #1430, Leia mais
- Adicionada uma nova opção AppContext para suprimir avisos TLS inseguros. #1457, Leia mais
TDS 8 segurança reforçada
Para usar o TDS 8, especifique Encrypt=Strict na cadeia de conexão. No modo estrito, TrustServerCertificate é desativado (sempre considerado como falso). HostNameInCertificate foi adicionado para ajudar alguns cenários de modo estrito. O TDS 8 inicia e continua toda a comunicação do servidor dentro de uma conexão TLS segura e criptografada.
Novos valores de criptografia foram adicionados para esclarecer o comportamento de criptografia de conexão.
Encrypt=Mandatory
é equivalente a Encrypt=True
e criptografa conexões durante a negociação de conexão TDS.
Encrypt=Optional
é equivalente a Encrypt=False
e só criptografa a conexão se o servidor informar ao cliente que a criptografia é necessária durante a negociação da conexão TDS.
Para obter mais informações sobre como criptografar conexões com o servidor, consulte Criptografia e validação de certificado.
HostNameInCertificate
pode ser especificado na cadeia de conexão ao usar nomes alternativos para se conectar com criptografia a um servidor que tenha um certificado de servidor com um nome diferente ou nome de sujeito alternativo do nome usado pelo cliente para identificar o servidor (nomes alternativos de DNS, por exemplo). Exemplo de uso: HostNameInCertificate=MyDnsAliasName
SPN do servidor
Ao conectar-se num ambiente que tenha uma topografia única de domínio/floresta, poderá ter requisitos específicos para os SPNs do servidor. As configurações de cadeia de conexão ServerSPN/Server SPN e FailoverServerSPN/Failover Server SPN podem ser usadas para substituir os SPNs de servidor gerados automaticamente usados durante a autenticação integrada em um ambiente de domínio
Suporte para aliases SQL
Os usuários podem configurar aliases usando o SQL Server Configuration Manager. Esses aliases são armazenados no registro do Windows e já são suportados quando o alvo é o .NET Framework. Esta versão traz suporte para aliases ao direcionar .NET ou .NET Core para Windows.
Suporte ao Enumerador de Fonte de Dados SQL
Fornece um mecanismo para enumerar todas as instâncias disponíveis do SQL Server na rede local.
using Microsoft.Data.Sql;
static void Main()
{
// Retrieve the enumerator instance and then the data.
SqlDataSourceEnumerator instance =
SqlDataSourceEnumerator.Instance;
System.Data.DataTable table = instance.GetDataSources();
// Display the contents of the table.
DisplayData(table);
Console.WriteLine("Press any key to continue.");
Console.ReadKey();
}
private static void DisplayData(System.Data.DataTable table)
{
foreach (System.Data.DataRow row in table.Rows)
{
foreach (System.Data.DataColumn col in table.Columns)
{
Console.WriteLine("{0} = {1}", col.ColumnName, row[col]);
}
Console.WriteLine("============================");
}
}
Suprimir avisos TLS inseguros
Um aviso de segurança será emitido no console se a versão TLS menor que 1.2 for usada para negociar com o servidor. Esse aviso pode ser suprimido na conexão SQL durante o Encrypt = false
habilitando a seguinte opção AppContext na inicialização do aplicativo:
Switch.Microsoft.Data.SqlClient.SuppressInsecureTLSWarning
5.0 Suporte à plataforma de destino
- .NET Framework 4.6.2+ (Windows x86, Windows x64)
- .NET Core 3.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 5.0 Release Notes.
Notas de versão do Microsoft.Data.SqlClient 4.1
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 4.1 Release Notes.
Novos recursos na versão 4.1
Introduzir Protocolo de Atestado Nenhum
Um novo protocolo de atestado chamado None
é permitido na cadeia de conexão. Este protocolo permite que os usuários renunciem ao atestado de enclave para enclaves VBS
. Quando esse protocolo é definido, a propriedade URL de atestado de enclave é opcional.
Exemplo de cadeia de conexão:
//Attestation protocol NONE with no URL
"Data Source = {server}; Initial Catalog = {db}; Column Encryption Setting = Enabled; Attestation Protocol = None;"
4.1 Suporte à plataforma de destino
- .NET Framework 4.6.1+ (Windows x86, Windows x64)
- .NET Core 3.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Notas de versão do Microsoft.Data.SqlClient 4.0
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 4.0 Release Notes.
Mudanças significativas na versão 4.0
- Alterada a propriedade da cadeia de conexão
Encrypt
para sertrue
por padrão. #1210Leia mais - O driver agora gera
SqlException
substituindoAggregateException
nos modos de autenticação do Active Directory. #1213 - Foi removida a propriedade de conexão
Asynchronous Processing
obsoleta do .NET Framework. #1148 - Interruptor de segurança
Configurable Retry Logic
removido. #1254Leia mais - Caiu o suporte para .NET Core 2.1 #1272
- [.NET Framework] A exceção não é lançada se um ID de usuário for fornecido na cadeia de conexão ao usar a autenticação
Active Directory Integrated
#1359
Novos recursos na versão 4.0
Criptografar o valor padrão definido como true
O valor padrão da configuração de conexão Encrypt
foi alterado de false
para true
. Com o uso crescente de bancos de dados em nuvem e a necessidade de garantir que essas conexões sejam seguras, é hora dessa mudança que quebra a compatibilidade com versões anteriores.
Assegurar que as conexões sejam interrompidas quando a criptografia for necessária
Em cenários em que as bibliotecas de criptografia de cliente estavam desabilitadas ou indisponíveis, era possível que conexões não criptografadas fossem feitas quando Encrypt fosse definido como true ou o servidor exigisse criptografia.
Opção de contexto do aplicativo para usar protocolos padrão do sistema
TLS 1.3 não é suportado pelo driver; portanto, ele foi removido da lista de protocolos suportados por padrão. Os usuários podem voltar a forçar o uso dos protocolos de cliente do Sistema Operacional, habilitando a seguinte opção de Contexto do Aplicativo:
Switch.Microsoft.Data.SqlClient.UseSystemDefaultSecureProtocols
Ativar vinculação de parâmetros otimizada
Microsoft.Data.SqlClient introduz uma nova API SqlCommand
, EnableOptimizedParameterBinding
para melhorar o desempenho de consultas com grande número de parâmetros. Esta propriedade está desativada por padrão. Quando definido como true
, os nomes dos parâmetros não são enviados para a instância do SQL Server quando o comando é executado.
public class SqlCommand
{
public bool EnableOptimizedParameterBinding { get; set; }
}
Remova o interruptor de segurança lógico de repetição configurável
A opção de contexto do aplicativo "Switch.Microsoft.Data.SqlClient.EnableRetryLogic" não é mais necessária para usar o recurso de lógica de repetição configurável. O recurso agora é suportado no ambiente de produção. O comportamento padrão do recurso continua a ser uma política de não repetição que os aplicativos cliente precisam substituir para habilitar tentativas.
Suporte às instâncias partilhadas SqlLocalDb
As instâncias compartilhadas SqlLocalDb agora são suportadas ao usar o SNI gerenciado.
- Cenários possíveis:
-
(localdb)\.
(conecta-se à instância padrão de SqlLocalDb) (localdb)\<named instance>
-
(localdb)\.\<shared instance name>
(*suporte recém-adicionado)
-
Suporte GetFieldValueAsync<T>
e GetFieldValue<T>
para XmlReader
, TextReader
Stream
tipos
XmlReader
, TextReader
, Stream
tipos agora são suportados ao usar GetFieldValueAsync<T>
e GetFieldValue<T>
.
Exemplo de uso:
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
if (await reader.ReadAsync())
{
using (Stream stream = await reader.GetFieldValueAsync<Stream>(1))
{
// Continue to read from stream
}
}
}
}
}
4.0 Suporte para a plataforma-alvo
- .NET Framework 4.6.1+ (Windows x86, Windows x64)
- .NET Core 3.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Notas de versão do Microsoft.Data.SqlClient 3.0
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 3.0 Release Notes.
Quebrando mudanças na versão 3.0
- A versão mínima suportada do .NET Framework foi aumentada para v4.6.1. O .NET Framework v4.6.0 não é mais suportado. #899
-
User Id
propriedade de conexão agora requerClient Id
em vez deObject Id
para User-Assigned Managed Identity#1010Leia mais -
SqlDataReader
agora retorna um valorDBNull
em vez de umbyte[]
vazio. O comportamento herdado pode ser habilitado definindoAppContext
opção Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior#998Leia mais
Novos recursos na versão 3.0
Lógica de repetição configurável
Este novo recurso introduz suporte configurável para aplicativos cliente para repetir erros "transitórios" ou "recuperáveis". A configuração pode ser feita por meio de arquivos de código ou configuração de aplicativo e operações de repetição podem ser aplicadas para abrir uma conexão ou executar um comando. Este recurso está desativado por padrão e está atualmente em pré-visualização. Para habilitar esse suporte, os aplicativos cliente devem ativar a seguinte opção de segurança:
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.EnableRetryLogic", true);
Depois que a opção .NET AppContext estiver habilitada, uma política de lógica de repetição poderá ser definida para SqlConnection
e SqlCommand
de forma independente ou em conjunto usando várias opções de personalização.
Novas APIs públicas são introduzidas no SqlConnection
e SqlCommand
para registrar uma implementação de SqlRetryLogicBaseProvider
personalizada:
public SqlConnection
{
public SqlRetryLogicBaseProvider RetryLogicProvider;
}
public SqlCommand
{
public SqlRetryLogicBaseProvider RetryLogicProvider;
}
Exemplos de uso da API podem ser encontrados aqui:
using Microsoft.Data.SqlClient;
/// Detecting retriable exceptions is a vital part of the retry pattern.
/// Before applying retry logic it is important to investigate exceptions and choose a retry provider that best fits your scenario.
/// First, log your exceptions and find transient faults.
/// The purpose of this sample is to illustrate how to use this feature and the condition might not be realistic.
class RetryLogicSample
{
private const string DefaultDB = "Northwind";
private const string CnnStringFormat = "Server=localhost; Initial Catalog={0}; Integrated Security=true; pooling=false;";
private const string DropDatabaseFormat = "DROP DATABASE {0}";
// For general use
private static SqlConnection s_generalConnection = new SqlConnection(string.Format(CnnStringFormat, DefaultDB));
static void Main(string[] args)
{
// 1. Define the retry logic parameters
var options = new SqlRetryLogicOption()
{
NumberOfTries = 5,
MaxTimeInterval = TimeSpan.FromSeconds(20),
DeltaTime = TimeSpan.FromSeconds(1)
};
// 2. Create a retry provider
var provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
// define the retrying event to report the execution attempts
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
int attempts = e.RetryCount + 1;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"attempt {attempts} - current delay time:{e.Delay} \n");
Console.ForegroundColor = ConsoleColor.DarkGray;
if (e.Exceptions[e.Exceptions.Count - 1] is SqlException ex)
{
Console.WriteLine($"{ex.Number}-{ex.Message}\n");
}
else
{
Console.WriteLine($"{e.Exceptions[e.Exceptions.Count - 1].Message}\n");
}
// It is not a good practice to do time-consuming tasks inside the retrying event which blocks the running task.
// Use parallel programming patterns to mitigate it.
if (e.RetryCount == provider.RetryLogic.NumberOfTries - 1)
{
Console.WriteLine("This is the last chance to execute the command before throwing the exception.");
Console.WriteLine("Press Enter when you're ready:");
Console.ReadLine();
Console.WriteLine("continue ...");
}
};
// Open the general connection.
s_generalConnection.Open();
try
{
// Assume the database is being created and other services are going to connect to it.
RetryConnection(provider);
}
catch
{
// exception is thrown if connecting to the database isn't successful.
throw;
}
}
private static void ExecuteCommand(SqlConnection cn, string command)
{
using var cmd = cn.CreateCommand();
cmd.CommandText = command;
cmd.ExecuteNonQuery();
}
private static void RetryConnection(SqlRetryLogicBaseProvider provider)
{
// Change this if you already have a database with the same name in your database.
string dbName = "Invalid_DB_Open";
// Create a connection to an invalid database.
using var cnn = new SqlConnection(string.Format(CnnStringFormat, dbName));
// 3. Assign the `provider` to the connection
cnn.RetryLogicProvider = provider;
Console.WriteLine($"Connecting to the [{dbName}] ...");
// Manually execute the following command in SSMS to create the invalid database while the SqlConnection is attempting to connect to it.
// >> CREATE DATABASE Invalid_DB_Open;
Console.WriteLine($"Manually, run the 'CREATE DATABASE {dbName};' in the SQL Server before exceeding the {provider.RetryLogic.NumberOfTries} attempts.");
// the connection tries to connect to the database 5 times
Console.WriteLine("The first attempt, before getting into the retry logic.");
cnn.Open();
Console.WriteLine($"Connected to the [{dbName}] successfully.");
cnn.Close();
// Drop it after test
ExecuteCommand(s_generalConnection, string.Format(DropDatabaseFormat, dbName));
Console.WriteLine($"The [{dbName}] is removed.");
}
}
/// Detecting retriable exceptions is a vital part of the retry pattern.
/// Before applying retry logic it is important to investigate exceptions and choose a retry provider that best fits your scenario.
/// First, log your exceptions and find transient faults.
/// The purpose of this sample is to illustrate how to use this feature and the condition might not be realistic.
private const string DefaultDB = "Northwind";
private const string CnnStringFormat = "Server=localhost; Initial Catalog={0}; Integrated Security=true; pooling=false;";
private const string DropDatabaseFormat = "DROP DATABASE {0}";
private const string CreateDatabaseFormat = "CREATE DATABASE {0}";
// For general use
private static SqlConnection s_generalConnection = new SqlConnection(string.Format(CnnStringFormat, DefaultDB));
static void Main(string[] args)
{
// 1. Define the retry logic parameters
var options = new SqlRetryLogicOption()
{
NumberOfTries = 5,
MaxTimeInterval = TimeSpan.FromSeconds(20),
DeltaTime = TimeSpan.FromSeconds(1),
AuthorizedSqlCondition = null,
// error number 3702 : Cannot drop database "xxx" because it is currently in use.
TransientErrors = new int[] {3702}
};
// 2. Create a retry provider
var provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
// define the retrying event to report execution attempts
provider.Retrying += (object s, SqlRetryingEventArgs e) =>
{
int attempts = e.RetryCount + 1;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"attempt {attempts} - current delay time:{e.Delay} \n");
Console.ForegroundColor = ConsoleColor.DarkGray;
if (e.Exceptions[e.Exceptions.Count - 1] is SqlException ex)
{
Console.WriteLine($"{ex.Number}-{ex.Message}\n");
}
else
{
Console.WriteLine($"{e.Exceptions[e.Exceptions.Count - 1].Message}\n");
}
// It is not good practice to do time-consuming tasks inside the retrying event which blocks the running task.
// Use parallel programming patterns to mitigate it.
if (e.RetryCount == provider.RetryLogic.NumberOfTries - 1)
{
Console.WriteLine("This is the last chance to execute the command before throwing the exception.");
Console.WriteLine("Press Enter when you're ready:");
Console.ReadLine();
Console.WriteLine("continue ...");
}
};
// Open a general connection.
s_generalConnection.Open();
try
{
// Assume the database is creating and other services are going to connect to it.
RetryCommand(provider);
}
catch
{
s_generalConnection.Close();
// exception is thrown if connecting to the database isn't successful.
throw;
}
s_generalConnection.Close();
}
private static void ExecuteCommand(SqlConnection cn, string command)
{
using var cmd = cn.CreateCommand();
cmd.CommandText = command;
cmd.ExecuteNonQuery();
}
private static void FindActiveSessions(SqlConnection cnn, string dbName)
{
using var cmd = cnn.CreateCommand();
cmd.CommandText = "DECLARE @query NVARCHAR(max) = '';" + Environment.NewLine +
$"SELECT @query = @query + 'KILL ' + CAST(spid as varchar(50)) + ';' FROM sys.sysprocesses WHERE dbid = DB_ID('{dbName}')" + Environment.NewLine +
"SELECT @query AS Active_sessions;";
var reader = cmd.ExecuteReader();
if (reader.Read())
{
Console.ForegroundColor = ConsoleColor.Green;
Console.Write($">> Execute the '{reader.GetString(0)}' command in SQL Server to unblock the running task.");
Console.ResetColor();
}
reader.Close();
}
var RetryLogicOption = new SqlRetryLogicOption()
{
NumberOfTries = 5,
// Declare the error number 102 as a transient error to apply the retry logic when it occurs.
TransientErrors = new int[] { 102 },
// When a SqlCommand executes out of a transaction,
// the retry logic will apply if it contains a 'select' keyword.
AuthorizedSqlCondition = x => string.IsNullOrEmpty(x)
|| Regex.IsMatch(x, @"\b(SELECT)\b", RegexOptions.IgnoreCase),
DeltaTime = TimeSpan.FromSeconds(1),
MaxTimeInterval = TimeSpan.FromSeconds(60),
MinTimeInterval = TimeSpan.FromSeconds(3)
};
Novas seções de configuração também foram introduzidas para fazer o mesmo registro a partir de arquivos de configuração, sem ter que modificar o código existente:
<section name="SqlConfigurableRetryLogicConnection"
type="Microsoft.Data.SqlClient.SqlConfigurableRetryConnectionSection, Microsoft.Data.SqlClient"/>
<section name="SqlConfigurableRetryLogicCommand"
type="Microsoft.Data.SqlClient.SqlConfigurableRetryCommandSection, Microsoft.Data.SqlClient"/>
Aqui está um exemplo simples de como usar as novas seções de configuração em arquivos de configuração:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="SqlConfigurableRetryLogicConnection"
type="Microsoft.Data.SqlClient.SqlConfigurableRetryConnectionSection, Microsoft.Data.SqlClient"/>
<section name="SqlConfigurableRetryLogicCommand"
type="Microsoft.Data.SqlClient.SqlConfigurableRetryCommandSection, Microsoft.Data.SqlClient"/>
<section name="AppContextSwitchOverrides"
type="Microsoft.Data.SqlClient.AppContextSwitchOverridesSection, Microsoft.Data.SqlClient"/>
</configSections>
<!--Enable safety switch in .NET Core-->
<AppContextSwitchOverrides value="Switch.Microsoft.Data.SqlClient.EnableRetryLogic=true"/>
<!--Retry method for SqlConnection-->
<SqlConfigurableRetryLogicConnection retryMethod ="CreateFixedRetryProvider" numberOfTries ="3" deltaTime ="00:00:10" maxTime ="00:00:30"
transientErrors="40615" />
<!--Retry method for SqlCommand containing SELECT queries-->
<SqlConfigurableRetryLogicCommand retryMethod ="CreateIncrementalRetryProvider" numberOfTries ="5" deltaTime ="00:00:10" maxTime ="00:01:10"
authorizedSqlCondition="\b(SELECT)\b" transientErrors="102, 4060, 0"/>
</configuration>
Como alternativa, os aplicativos podem implementar seu próprio provedor da classe base SqlRetryLogicBaseProvider
e registrá-la com SqlConnection
/SqlCommand
.
Contadores de eventos
Os contadores a seguir agora estão disponíveis para aplicativos destinados ao .NET Core 3.1+ e ao .NET Standard 2.1+:
Nome | Nome para exibição | Descrição |
---|---|---|
ligações ativas e rígidas | Conexões ativas reais atualmente feitas a servidores | O número de conexões atualmente abertas para servidores de banco de dados. |
liga diretamente | Taxa de conexão real aos servidores | O número de conexões por segundo que estão a ser abertas para servidores de base de dados. |
desconexões bruscas | Taxa de desconexão real dos servidores | O número de desconexões por segundo que estão sendo feitas aos servidores de banco de dados. |
active-conexões-suaves | Conexões ativas recuperadas do pool de conexões | O número de conexões já abertas que estão a ser consumidas do pool de conexões. |
conecta suavemente | Taxa de conexões recuperadas do pool de conexões | O número de conexões consumidas por segundo do pool de conexões. |
desligamentos suaves | Taxa de conexões retornadas ao pool de conexões | O número de conexões por segundo a serem devolvidas ao pool de conexões. |
número de conexões não agrupadas | Número de conexões que não utilizam agrupamento de conexões | O número de conexões ativas que não são agrupadas. |
número de conexões agrupadas | Número de ligações geridas pelo pool de conexões | O número de conexões ativas gerenciava a infraestrutura do pool de conexões. |
número de grupos de pool de conexões ativas | Número de cadeias de conexão únicas ativas | O número de grupos de pool de conexões ativos e exclusivos. Esse contador é baseado no número de cadeias de conexão exclusivas encontradas no AppDomain. |
número de grupos de conexões inativas | Número de cadeias de conexão exclusivas aguardando remoção | O número de grupos de pool de conexões exclusivos marcados para poda. Esse contador é baseado no número de cadeias de conexão exclusivas encontradas no AppDomain. |
número de pools de conexões activas | Número de pools de conexões ativos | O número total de pools de conexões. |
número de pools de conexões inativas | Número de pools de conexões inativas | O número de pools de conexões inativas sem atividade recente e à espera de serem eliminados. |
número de conexões ativas | Número de conexões ativas | O número de conexões ativas atualmente em uso. |
número de conexões gratuitas | Número de conexões prontas no pool de conexões | O número de conexões abertas disponíveis para uso nos pools de conexões. |
número de conexões de estase | Número de conexões atualmente aguardando para serem prontas | O número de conexões atualmente aguardando a conclusão de uma ação e que não estão disponíveis para uso pelo aplicativo. |
número de conexões recuperadas | Número de conexões recuperadas do GC | O número de conexões recuperadas por meio da coleta de lixo onde Close ou Dispose não foi chamado pelo aplicativo.
Observação Não fechar ou descartar conexões explicitamente prejudica o desempenho. |
Esses contadores podem ser usados com as ferramentas globais da CLI do .NET Core: dotnet-counters
e dotnet-trace
no Windows ou Linux e PerfView no Windows, usando Microsoft.Data.SqlClient.EventSource
como o nome do provedor. Para obter mais informações, consulte Recuperar valores de contador de eventos.
dotnet-counters monitor Microsoft.Data.SqlClient.EventSource -p
PerfView /onlyProviders=*Microsoft.Data.SqlClient.EventSource:EventCounterIntervalSec=1 collect
Introdução à dependência do Azure Identity
Microsoft.Data.SqlClient agora depende da biblioteca Azure.Identity para adquirir tokens para os modos de autenticação "Active Directory Managed Identity/MSI" e "Active Directory Service Principal". Esta alteração introduz as seguintes alterações na superfície pública:
-
Mudança Crítica
A propriedade de conexão "User ID" agora requer "Client ID" em vez de "Object ID" para "User-Assigned Managed Identity". -
API pública
Nova propriedade pública de apenas leitura:SqlAuthenticationParameters.ConnectionTimeout
-
Dependência
Azure.Identity v1.3.0
Melhorias no rastreamento de eventos no SNI.dll
As versões Microsoft.Data.SqlClient.SNI
(dependência do .NET Framework) e Microsoft.Data.SqlClient.SNI.runtime
(dependência do .NET Core/Standard) foram atualizadas para v3.0.0-preview1.21104.2
. O rastreamento de eventos no SNI.dll não está mais habilitado por meio de um aplicativo cliente. Inscrever uma sessão no fornecedor Microsoft.Data.SqlClient.EventSource através de ferramentas como xperf
ou perfview
é suficiente. Para obter mais informações, consulte Suporte para rastreamento de eventos no SNI Nativo.
Ativando o comportamento nulo da versão da linha
SqlDataReader
retorna um valor DBNull
em vez de um byte[]
vazio. Para habilitar o comportamento herdado, você deve habilitar a seguinte opção AppContext na inicialização do aplicativo: "Switch.Microsoft.Data.SqlClient.LegacyRowVersionNullBehavior"
Suporte à autenticação padrão do Microsoft Entra
Observação
Embora o Microsoft Entra ID seja o novo nome para o Azure Active Directory (Azure AD), para evitar a interrupção dos ambientes existentes, o Azure AD ainda permanece em alguns elementos codificados, como campos de UI, provedores de conexão, códigos de erro e cmdlets. Neste artigo, os dois nomes são intercambiáveis.
Esta PR introduz um novo método de autenticação SQL, Active Directory Default. Este modo de autenticação amplia as possibilidades de autenticação do usuário com o Microsoft Entra ID, estendendo as soluções de login para o ambiente do cliente, Visual Studio Code, Visual Studio, Azure CLI etc.
Com esse modo de autenticação, o driver adquire um token passando "DefaultAzureCredential" da biblioteca de Identidade do Azure para adquirir um token de acesso. Este modo tenta usar esses tipos de credenciais para adquirir um token de acesso na seguinte ordem:
-
EnvironmentCredential
- Permite a autenticação com o Microsoft Entra ID usando cliente e segredo, ou nome de usuário e senha, detalhes configurados nas seguintes variáveis de ambiente: AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_CLIENT_CERTIFICATE_PATH, AZURE_USERNAME, AZURE_PASSWORD (Mais detalhes)
-
CredencialDeIdentidadeGerida
- Tenta autenticação com o Microsoft Entra ID usando uma identidade gerenciada que foi atribuída ao ambiente de implantação. A "ID do cliente" de uma de "identidade gerenciada atribuída pelo usuário" é lida da propriedade de conexão "ID do usuário" .
-
SharedTokenCacheCredential
- Autentica usando tokens no cache local compartilhado entre aplicativos da Microsoft.
-
VisualStudioCredential
- Habilita a autenticação com o Microsoft Entra ID usando dados do Visual Studio
-
VisualStudioCodeCredential
- Habilita a autenticação com o Microsoft Entra ID usando dados do Visual Studio Code.
-
AzureCliCredential
- Habilita a autenticação com a ID do Microsoft Entra usando a CLI do Azure para obter um token de acesso.
InteractiveBrowserCredential está desabilitado na implementação de driver de "Ative Directory Default" e "Ative Directory Interactive" é a única opção disponível para adquirir um token usando autenticação MFA/Interactive.
Outras opções de personalização não estão disponíveis no momento.
Aprimoramentos no registro do fornecedor de armazenamento de chave principal personalizada
Microsoft.Data.SqlClient agora oferece mais controlo sobre onde os provedores de armazenamento da chave mestra são acessíveis numa aplicação para oferecer melhor suporte para aplicações multicliente e o seu uso de criptografia/descriptografia de coluna. As APIs a seguir são introduzidas para permitir o registro de provedores de armazenamento de chaves mestras personalizadas em instâncias de SqlConnection
e SqlCommand
:
public class SqlConnection
{
public void RegisterColumnEncryptionKeyStoreProvidersOnConnection(IDictionary<string, SqlColumnEncryptionKeyStoreProvider> customProviders)
}
public class SqlCommand
{
public void RegisterColumnEncryptionKeyStoreProvidersOnCommand(IDictionary<string, SqlColumnEncryptionKeyStoreProvider> customProviders)
}
A API estática em SqlConnection
, SqlConnection.RegisterColumnEncryptionKeyStoreProviders
, usada para registrar provedores de armazenamento de chaves mestras personalizadas globalmente, continua a ser suportada. A cache de chave de encriptação de coluna mantida globalmente só se aplica a fornecedores registados globalmente.
Prioridade de registo do provedor de armazenamento de chaves mestras da coluna
Os provedores de armazenamento de chaves mestras de coluna internos que estão disponíveis para o Windows Certificate Store, CNG Store e CSP são pré-registrados. Nenhum provedor deve ser registado nas instâncias de conexão ou comando se for necessário um dos fornecedores de armazenamento de chaves mestras de coluna integrados.
Os provedores de armazenamento de chaves mestras personalizadas podem ser registrados com o driver em três camadas diferentes. O nível global é o que é atualmente. Os novos registros por conexão e por nível de comando estão vazios inicialmente e podem ser definidos mais de uma vez.
As precedências dos três registos são as seguintes:
- O registro por comando é verificado se não estiver vazio.
- Se o registro por comando estiver vazio, o registro por conexão será verificado se não estiver vazio.
- Se o registro por conexão estiver vazio, o registro global será verificado.
Uma vez que qualquer provedor de armazenamento de chaves é encontrado em um nível de registro, o driver NÃO recorrer aos outros registros para procurar um provedor. Se os provedores estiverem registrados, mas o provedor adequado não for encontrado em um nível, uma exceção será lançada contendo apenas os provedores registrados no registro verificado.
Precedência do cache da chave de criptografia de coluna
O driver não armazena em cache as chaves de criptografia de coluna (CEKs) para provedores de armazenamento de chaves personalizados registrados usando as novas APIs de nível de instância. Os principais provedores de armazenamento precisam implementar seu próprio cache para obter desempenho. O driver desabilita o cache local de chaves de criptografia de coluna implementadas por provedores de armazenamento de chaves personalizados se a instância do provedor de armazenamento de chaves estiver registrada no driver em nível global.
Uma nova API também foi introduzida na classe base SqlColumnEncryptionKeyStoreProvider
para definir o tempo de vida do cache:
public abstract class SqlColumnEncryptionKeyStoreProvider
{
// The default value of Column Encryption Key Cache Time to Live is 0.
// Provider's local cache is disabled for globally registered providers.
// Custom key store provider implementation must include column encryption key cache to provide caching support to locally registered providers.
public virtual TimeSpan? ColumnEncryptionKeyCacheTtl { get; set; } = new TimeSpan(0);
}
Preferência de endereço IP
Uma nova propriedade de conexão IPAddressPreference
é introduzida para especificar a preferência da família de endereços IP para o driver ao estabelecer conexões TCP. Se Transparent Network IP Resolution
(no .NET Framework) ou Multi Subnet Failover
estiver definido como true
, essa configuração não terá efeito. Existem os três valores aceites para esta propriedade:
IPv4First
- Esse valor é o padrão. O driver usa endereços IPv4 resolvidos primeiro. Se nenhum deles puder ser conectado com êxito, ele tentará endereços IPv6 resolvidos.
IPv6First
- O driver usa endereços IPv6 resolvidos primeiro. Se nenhum deles puder ser conectado com êxito, ele tentará endereços IPv4 resolvidos.
UsarPadrãoDaPlataforma
- O driver tenta endereços IP na ordem recebida da resposta de resolução DNS.
3.0 Suporte à plataforma de destino
- .NET Framework 4.6.1+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Notas de versão do Microsoft.Data.SqlClient 2.1
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 2.1 Release Notes.
Novos recursos na versão 2.1
Suporte multiplataforma para Always Encrypted
Microsoft.Data.SqlClient v2.1 estende o suporte para Always Encrypted nas seguintes plataformas:
Suporte a Always Encrypted | Suporte para Always Encrypted com Secure Enclave | Plataforma de Destino | Versão Microsoft.Data.SqlClient | Sistema Operativo |
---|---|---|---|---|
Sim | Sim | .NET Framework 4.6+ | 1.1.0+ | Windows |
Sim | Sim | .NET Core 2.1+ | 2.1.0+1 | Windows, Linux, macOS |
Sim | Não2 | .NET Padrão 2.0 | 2.1.0+ | Windows, Linux, macOS |
Sim | Sim | .NET Standard 2.1+ | 2.1.0+ | Windows, Linux, macOS |
Observação
1 Antes da versão v2.1 do Microsoft.Data.SqlClient, o Always Encrypted só é suportado no Windows.
2 Always Encrypted com enclaves seguros não é suportado no .NET Standard 2.0.
Autenticação do fluxo de código do dispositivo Microsoft Entra
Microsoft.Data.SqlClient v2.1 fornece suporte para autenticação "Device Code Flow" com MSAL.NET. Documentação de referência: fluxo de concessão de autorização de dispositivo OAuth2.0
Exemplo de cadeia de conexão:
Server=<server>.database.windows.net; Authentication=Active Directory Device Code Flow; Database=Northwind;Encrypt=True
A API a seguir permite a personalização do mecanismo de retorno de chamada do Device Code Flow:
public class ActiveDirectoryAuthenticationProvider
{
// For .NET Framework, .NET Core and .NET Standard targeted applications
public void SetDeviceCodeFlowCallback(Func<DeviceCodeResult, Task> deviceCodeFlowCallbackMethod)
}
Autenticação de identidade gerida pelo Microsoft Entra
Microsoft.Data.SqlClient v2.1 introduz suporte para autenticação Microsoft Entra usando identidades gerenciadas.
As seguintes palavras-chave do modo de autenticação são suportadas:
- Identidade gerenciada do Ative Directory
- MSI do Active Directory (para compatibilidade entre drivers MS SQL)
Exemplos de cadeia de conexão:
// For System Assigned Managed Identity
"Server={serverURL}; Authentication=Active Directory MSI; Encrypt=True; Initial Catalog={db};"
// For System Assigned Managed Identity
"Server={serverURL}; Authentication=Active Directory Managed Identity; Initial Catalog={db};"
// For User Assigned Managed Identity
"Server={serverURL}; Authentication=Active Directory MSI; Encrypt=True; User Id={ObjectIdOfManagedIdentity}; Initial Catalog={db};"
// For User Assigned Managed Identity
"Server={serverURL}; Authentication=Active Directory Managed Identity; Encrypt=True; User Id={ObjectIdOfManagedIdentity}; Initial Catalog={db};"
Aprimoramentos de autenticação do Microsoft Entra Interactive
Microsoft.Data.SqlClient v2.1 adiciona as seguintes APIs para personalizar a experiência de autenticação do Microsoft Entra Interactive:
public class ActiveDirectoryAuthenticationProvider
{
// For .NET Framework targeted applications only
public void SetIWin32WindowFunc(Func<IWin32Window> iWin32WindowFunc);
// For .NET Standard targeted applications only
public void SetParentActivityOrWindowFunc(Func<object> parentActivityOrWindowFunc);
// For .NET Framework, .NET Core and .NET Standard targeted applications
public void SetAcquireAuthorizationCodeAsyncCallback(Func<Uri, Uri, CancellationToken, Task<Uri>> acquireAuthorizationCodeAsyncCallback);
// For .NET Framework, .NET Core and .NET Standard targeted applications
public void ClearUserTokenCache();
}
SqlClientAuthenticationProviders
seção de configuração
Microsoft.Data.SqlClient v2.1 introduz uma nova seção de configuração, SqlClientAuthenticationProviders
(um clone do SqlAuthenticationProviders
existente). A seção de configuração existente, SqlAuthenticationProviders
, ainda é suportada para garantir a compatibilidade retroativa quando o tipo apropriado é definido.
A nova seção permite que os arquivos de configuração do aplicativo contenham uma seção SqlAuthenticationProviders para System.Data.SqlClient e uma seção SqlClientAuthenticationProviders para Microsoft.Data.SqlClient.
Autenticação do Microsoft Entra usando uma ID de cliente de aplicativo
Microsoft.Data.SqlClient v2.1 introduz suporte para passar uma ID de cliente de aplicativo definida pelo usuário para a Biblioteca de Autenticação da Microsoft. A ID do cliente da aplicação é usada ao autenticar com o Microsoft Entra ID.
As seguintes novas APIs são introduzidas:
Um novo construtor foi introduzido em ActiveDirectoryAuthenticationProvider:
[Aplica-se a todas as plataformas .NET (.NET Framework, .NET Core e .NET Standard)]public ActiveDirectoryAuthenticationProvider(string applicationClientId)
Utilização:
string APP_CLIENT_ID = "<GUID>"; SqlAuthenticationProvider customAuthProvider = new ActiveDirectoryAuthenticationProvider(APP_CLIENT_ID); SqlAuthenticationProvider.SetProvider(SqlAuthenticationMethod.ActiveDirectoryInteractive, customAuthProvider); using (SqlConnection sqlConnection = new SqlConnection("<connection_string>")) { sqlConnection.Open(); }
Uma nova propriedade de configuração foi introduzida em
SqlAuthenticationProviderConfigurationSection
eSqlClientAuthenticationProviderConfigurationSection
:
[Aplica-se ao .NET Framework e ao .NET Core]internal class SqlAuthenticationProviderConfigurationSection : ConfigurationSection { ... [ConfigurationProperty("applicationClientId", IsRequired = false)] public string ApplicationClientId => this["applicationClientId"] as string; } // Inheritance internal class SqlClientAuthenticationProviderConfigurationSection : SqlAuthenticationProviderConfigurationSection { ... }
Utilização:
<configuration> <configSections> <section name="SqlClientAuthenticationProviders" type="Microsoft.Data.SqlClient.SqlClientAuthenticationProviderConfigurationSection, Microsoft.Data.SqlClient" /> </configSections> <SqlClientAuthenticationProviders applicationClientId ="<GUID>" /> </configuration> <!--or--> <configuration> <configSections> <section name="SqlAuthenticationProviders" type="Microsoft.Data.SqlClient.SqlAuthenticationProviderConfigurationSection, Microsoft.Data.SqlClient" /> </configSections> <SqlAuthenticationProviders applicationClientId ="<GUID>" /> </configuration>
Suporte à Classificação de Dados v2
Microsoft.Data.SqlClient v2.1 introduz suporte para informações de "Ranking de Sensibilidade" da Classificação de Dados. As novas APIs a seguir já estão disponíveis:
public class SensitivityClassification
{
public SensitivityRank SensitivityRank;
}
public class SensitivityProperty
{
public SensitivityRank SensitivityRank;
}
public enum SensitivityRank
{
NOT_DEFINED = -1,
NONE = 0,
LOW = 10,
MEDIUM = 20,
HIGH = 30,
CRITICAL = 40
}
ID de processo do servidor para um SqlConnection
ativo
Microsoft.Data.SqlClient v2.1 introduz uma nova propriedade SqlConnection
, ServerProcessId
, em uma conexão ativa.
public class SqlConnection
{
// Returns the server process Id (SPID) of the active connection.
public int ServerProcessId;
}
Suporte para registo de rastreio no SNI nativo
Microsoft.Data.SqlClient v2.1 estende a implementação de SqlClientEventSource
existente para habilitar o rastreamento de eventos em SNI.dll. Os eventos devem ser capturados usando uma ferramenta como o Xperf.
O rastreamento pode ser ativado enviando um comando para SqlClientEventSource
conforme ilustrado:
// Enables trace events:
EventSource.SendCommand(eventSource, (EventCommand)8192, null);
// Enables flow events:
EventSource.SendCommand(eventSource, (EventCommand)16384, null);
// Enables both trace and flow events:
EventSource.SendCommand(eventSource, (EventCommand)(8192 | 16384), null);
Propriedade da cadeia de conexão "Command Timeout"
Microsoft.Data.SqlClient v2.1 introduz a propriedade de cadeia de conexão "Command Timeout" para substituir o padrão de 30 segundos. O tempo limite para comandos individuais pode ser substituído usando a propriedade CommandTimeout
no SqlCommand.
Exemplos de cadeia de conexão:
"Server={serverURL}; Initial Catalog={db}; Encrypt=True; Integrated Security=true; Command Timeout=60"
Remoção de símbolos do SNI nativo
Com o Microsoft.Data.SqlClient v2.1, removemos os símbolos introduzidos no v2.0.0 do Microsoft.Data.SqlClient.SNI.runtime do NuGet, começando com v2.1.1. Os símbolos públicos agora são publicados no Microsoft Symbols Server para ferramentas como BinSkim que exigem acesso a símbolos públicos.
Símbolos de Source-Linking do Microsoft.Data.SqlClient
A partir de Microsoft.Data.SqlClient v2.1, os símbolos Microsoft.Data.SqlClient são vinculados à fonte e publicados no Microsoft Symbols Server para uma experiência de depuração aprimorada sem a necessidade de baixar o código-fonte.
2.1 Suporte à plataforma de destino
- .NET Framework 4.6+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Notas de versão do Microsoft.Data.SqlClient 2.0
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 2.0 Release Notes.
Quebrando mudanças na versão 2.0
- O modificador de acesso para a interface do provedor de enclave
SqlColumnEncryptionEnclaveProvider
foi alterado depublic
parainternal
. - As constantes na classe
SqlClientMetaDataCollectionNames
foram atualizadas para refletir as alterações no SQL Server. - O driver agora executa a validação do Certificado de Servidor quando o SQL Server de destino impõe a criptografia TLS, que é o padrão para conexões do Azure.
-
SqlDataReader.GetSchemaTable()
agora retorna umDataTable
vazio em veznull
. - O driver agora executa arredondamento de escala decimal para corresponder ao comportamento do SQL Server. Para compatibilidade com versões anteriores, o comportamento anterior de truncamento pode ser habilitado usando uma opção AppContext.
- Para aplicativos .NET Framework que consomem Microsoft.Data.SqlClient , os arquivos de SNI.dll baixados anteriormente para as pastas
bin\x64
ebin\x86
agora são nomeadosMicrosoft.Data.SqlClient.SNI.x64.dll
eMicrosoft.Data.SqlClient.SNI.x86.dll
e são baixados para o diretóriobin
. - Novos sinônimos de propriedade de cadeia de conexão substituem propriedades antigas ao buscar cadeia de conexão de
SqlConnectionStringBuilder
para consistência. Leia mais
Novos recursos na versão 2.0
Os novos recursos a seguir foram introduzidos no Microsoft.Data.SqlClient 2.0.
Resiliência a falhas de DNS
O driver agora armazena em cache endereços IP de todas as conexões bem-sucedidas em um ponto de extremidade do SQL Server que oferece suporte ao recurso. Se ocorrer uma falha de resolução DNS durante uma tentativa de conexão, o driver tentará estabelecer uma conexão usando um endereço IP armazenado em cache para esse servidor, se existir.
Rastreamento de "EventSource"
Esta versão introduz suporte para a captura de registos de rastreamento de eventos para depuração de aplicações. Para capturar esses eventos, os aplicativos cliente devem ouvir eventos da implementação EventSource do SqlClient:
Microsoft.Data.SqlClient.EventSource
Para obter mais informações, consulte como Habilitar rastreamento de eventos no SqlClient.
Habilitando a rede gerenciada no Windows
Uma nova opção AppContext, "Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", permite o uso de uma implementação SNI gerenciada no Windows para fins de teste e depuração. Essa opção alterna o comportamento do driver para usar um SNI gerenciado em projetos .NET Core 2.1+ e .NET Standard 2.0+ no Windows, eliminando todas as dependências em bibliotecas nativas para a biblioteca Microsoft.Data.SqlClient.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseManagedNetworkingOnWindows", true);
Consulte Switches AppContext no SqlClient para obter uma lista completa de switches disponíveis no driver.
Ativando o comportamento de truncamento decimal
O driver arredonda a escala de dados decimal, por padrão, como é feito pelo SQL Server. Para compatibilidade com versões anteriores, você pode definir a opção AppContext "Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal" como true.
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.TruncateScaledDecimal", true);
Novos sinónimos de propriedades de cadeias de conexão
Novos sinônimos foram adicionados para as seguintes propriedades de cadeia de conexão existentes para evitar confusão de espaçamento em torno de propriedades com mais de uma palavra. Nomes de propriedades antigos continuam a ser suportados para assegurar compatibilidade retroativa. Mas as novas propriedades da cadeia de conexão agora são incluídas quando a cadeia de conexão é obtida do SqlConnectionStringBuilder.
Propriedade de cadeia de conexão existente | Novo Sinónimo |
---|---|
Intenção do aplicativo | Intenção do aplicativo |
ConnectRetryCount | Número de Tentativas de Reconexão |
ConnectRetryInterval | Intervalo de Tentativa de Reconexão |
Período de Bloqueio da Piscina | Período de bloqueio da piscina |
MultipleActiveResultSets | Vários conjuntos de resultados ativos |
MultiSubnetFailover | Failover de várias sub-redes |
Resolução de IP de Rede Transparente | Resolução IP de rede transparente |
TrustServerCertificate | Certificado de servidor confiável |
Propriedade RowsCopied de SqlBulkCopy
A propriedade RowsCopied fornece acesso somente leitura ao número de linhas que foram processadas na operação de cópia em massa em andamento. Este valor pode não ser necessariamente igual ao número final de linhas adicionadas à tabela de destino.
Substituições abertas de conexão
O comportamento padrão de SqlConnection.Open() pode ser substituído para desabilitar o atraso de dez segundos e as novas tentativas automáticas de conexão desencadeadas por erros transitórios.
using(SqlConnection sqlConnection = new SqlConnection("Data Source=(local);Integrated Security=true;Initial Catalog=AdventureWorks;"))
{
sqlConnection.Open(SqlConnectionOverrides.OpenWithoutRetry);
}
Observação
Essa substituição pode ser aplicada a SqlConnection.OpenAsync()
começando com Microsoft.Data.SqlClient v6.0.0.
Suporte de nome de usuário para o modo interativo do Ative Directory
Um nome de usuário pode ser especificado na cadeia de conexão ao usar o modo de autenticação do Microsoft Entra Interactive para .NET Framework e .NET Core
Defina um nome de utilizador usando a propriedade User ID ou a propriedade UID da cadeia de conexão.
"Server=<server name>; Database=<db name>; Authentication=Active Directory Interactive; User Id=<username>;Encrypt=True;"
Dicas de pedido para SqlBulkCopy
Dicas de ordem podem ser fornecidas para melhorar o desempenho de operações de cópia em massa em tabelas com índices clusterizados. Para obter mais informações, consulte a seção operações de cópia em massa.
Alterações na dependência do SNI
Microsoft.Data.SqlClient (.NET Core e .NET Standard) no Windows agora depende de Microsoft.Data.SqlClient.SNI.runtime , substituindo a dependência anterior em runtime.native.System.Data.SqlClient.SNI. A nova dependência adiciona suporte para a plataforma ARM, juntamente com as plataformas já suportadas Arm64, x64 e x86 no Windows.
2.0 Suporte à plataforma de destino
- .NET Framework 4.6+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Windows Arm64, Windows ARM, Linux, macOS)
Notas de versão do Microsoft.Data.SqlClient 1.1.0
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 1.1 Release Notes.
Novos recursos na versão 1.1
Sempre criptografado com enclaves seguros
O Always Encrypted está disponível a partir do Microsoft SQL Server 2016. Enclaves seguros estão disponíveis a partir do Microsoft SQL Server 2019. Para usar o recurso de enclave, as cadeias de conexão devem incluir o protocolo de atestado necessário e a URL de atestado. Por exemplo:
"Attestation Protocol=HGS;Enclave Attestation Url=<attestation_url_for_HGS>"
Para mais informações, consulte:
- Suporte do SqlClient para Always Encrypted
- Tutorial: Desenvolver um aplicativo .NET usando Always Encrypted com enclaves seguros
1.1 Suporte à plataforma de destino
- .NET Framework 4.6+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Linux, macOS)
Notas de versão do Microsoft.Data.SqlClient 1.0
A versão inicial para o namespace Microsoft.Data.SqlClient oferece mais funcionalidade sobre o namespace System.Data.SqlClient existente.
As notas de versão completas, incluindo dependências, estão disponíveis no repositório GitHub: 1.0 Release Notes.
Novos recursos na versão 1.0
Novos recursos sobre o .NET Framework 4.7.2 System.Data.SqlClient
Classificação de Dados - Disponível no Azure SQL Database e no Microsoft SQL Server 2019.
Suporte para UTF-8 - Disponível no Microsoft SQL Server 2019.
Novos recursos no .NET Core 2.2 System.Data.SqlClient
Classificação de Dados - Disponível na Base de Dados SQL do Azure e no Microsoft SQL Server 2019.
Suporte a UTF-8 - Disponível no Microsoft SQL Server 2019.
Autenticação - modo de autenticação por palavra-passe do Active Directory.
Classificação de dados
A Classificação de Dados introduz um novo conjunto de APIs que expõe informações somente leitura de sensibilidade e classificação de dados sobre objetos recuperados via SqlDataReader, quando a fonte subjacente oferece suporte ao recurso e contém metadados sobre a sensibilidade de dados e a classificação. Consulte o aplicativo de exemplo em Data Discovery and Classification in SqlClient.
public class SqlDataReader
{
public Microsoft.Data.SqlClient.DataClassification.SensitivityClassification SensitivityClassification
}
namespace Microsoft.Data.SqlClient.DataClassification
{
public class ColumnSensitivity
{
public System.Collections.ObjectModel.ReadOnlyCollection<Microsoft.Data.SqlClient.DataClassification.SensitivityProperty> SensitivityProperties
}
public class InformationType
{
public string Id
public string Name
}
public class Label
{
public string Id
public string Name
}
public class SensitivityClassification
{
public System.Collections.ObjectModel.ReadOnlyCollection<Microsoft.Data.SqlClient.DataClassification.ColumnSensitivity> ColumnSensitivities
public System.Collections.ObjectModel.ReadOnlyCollection<Microsoft.Data.SqlClient.DataClassification.InformationType> InformationTypes
public System.Collections.ObjectModel.ReadOnlyCollection<Microsoft.Data.SqlClient.DataClassification.Label> Labels
}
public class SensitivityProperty
{
public Microsoft.Data.SqlClient.DataClassification.InformationType InformationType
public Microsoft.Data.SqlClient.DataClassification.Label Label
}
}
Suporte UTF-8
O suporte a UTF-8 não requer nenhuma alteração no código do aplicativo. Essas alterações SqlClient otimizam a comunicação cliente-servidor quando o servidor suporta UTF-8 e o agrupamento de colunas subjacente é UTF-8. Consulte a seção UTF-8 em O que há de novo no SQL Server 2019.
Sempre criptografado com enclaves seguros
Em geral, a documentação existente que utiliza o System.Data.SqlClient no .NET Framework , assim como os provedores integrados de armazenamento de chaves mestras de coluna, agora também devem funcionar com o .NET Core.
Desenvolver usando Always Encrypted com o provedor de dados .NET Framework
Autenticação
Diferentes modos de autenticação podem ser especificados usando a opção Autenticação cadeia de conexão. Para obter mais informações, consulte a documentação para SqlAuthenticationMethod.
Observação
Os provedores de armazenamento de chaves personalizados, como o provedor do Azure Key Vault, precisarão ser atualizados para oferecer suporte a Microsoft.Data.SqlClient. Da mesma forma, os provedores de enclave também precisarão ser atualizados para oferecer suporte a Microsoft.Data.SqlClient. Always Encrypted só é suportado para destinos .NET Framework e .NET Core. Não é suportado no .NET Standard porque o .NET Standard carece de certas dependências de criptografia.
1.0 Suporte à plataforma de destino
- .NET Framework 4.6+ (Windows x86, Windows x64)
- .NET Core 2.1+ (Windows x86, Windows x64, Linux, macOS)
- .NET Standard 2.0+ (Windows x86, Windows x64, Linux, macOS)