Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
SqlConnectionpředstavuje jedno logické spojení se SQL Server, Azure SQL nebo jiným podporovaným koncovým zařízením kompatibilním se SQL Server. Otevřením objektu se získá fyzické spojení z poolu, pokud je k dispozici. Jeho zavřením nebo uvolněním je toto fyzické připojení vráceno do poolu.
Používejte krátkodobé objekty SqlConnection jako jednotky práce. Nenechávejte otevřené jedno globální připojení pro aplikaci.
Sestavte konfiguraci spojení
Načte připojovací řetězec z konfiguračního systému aplikace. Použijte SqlConnectionStringBuilder , když je potřeba kód ověřit nebo přidat nastavení:
string configuredConnectionString =
configuration.GetConnectionString("Orders")
?? throw new InvalidOperationException(
"Connection string 'Orders' wasn't configured.");
var builder = new SqlConnectionStringBuilder(configuredConnectionString)
{
ApplicationName = "Orders.Api",
};
Vytvořte SqlConnection z builder.ConnectionString. Nespojujte uživatelský vstup do řetězce. Pro autentizační vzory, bezpečné úložiště a syntaxi viz Connection strings.
Otevřete a zlikvidujte spojení
V synchronním kódu volejte Open, v asynchronním kódu OpenAsync. Otevřete nové logické spojení pro každou nezávislou operaci:
public static async Task<string?> LoadOrderStatusAsync(
string connectionString,
int orderId,
CancellationToken cancellationToken)
{
await using var connection = new SqlConnection(connectionString);
await connection.OpenAsync(cancellationToken);
const string sql = """
SELECT Status
FROM Sales.Orders
WHERE OrderId = @orderId;
""";
using var command =
new SqlCommand(sql, connection) { CommandTimeout = 30 };
command.Parameters.Add(
new SqlParameter("@orderId", SqlDbType.Int) { Value = orderId });
object? value =
await command.ExecuteScalarAsync(cancellationToken);
return value is null or DBNull ? null : (string)value;
}
Příkaz await using uvolní připojení při úspěchu, chybě nebo zrušení. Při zapnutí poolování se likvidace obvykle resetuje a fyzické připojení se obnoví místo uzavření síťové zásuvky.
Zbav se čtenářů a příkazů před spojením, které je vlastní. Nespoléhejte na sběr odpadu nebo finalizér pro návrat spojení do poolu.
Použití asynchronních rozhraní API
Používejte asynchronní volání pro práci s databázemi vázanými na síti na webových serverech, službách, uživatelských rozhraních a pracovnících:
OpenAsync(cancellationToken)ExecuteNonQueryAsync(cancellationToken)ExecuteReaderAsync(cancellationToken)ExecuteScalarAsync(cancellationToken)ReadAsync(cancellationToken)
Nepotřebujete Asynchronous Processing=true. Microsoft. Data.SqlClient 4.0 a novější verze nepodporují toto klíčové slovo připojovací řetězec.
Nespouštějte další operaci na spojení, příkazu nebo čtečce dříve, než skončí aktuální asynchronní operace.
Uplatněte zrušení a časové limity
Pošlete volající CancellationToken přes každý asynchronní databázový hovor. Zrušení žádá poskytovatele, aby zastavil probíhající práce, ale dokončení není zaručeno okamžité. Pokračujte v používání omezených časových limitů spojení a příkazů.
Tyto ovládací prvky mají samostatné rozsahy:
| Ovládací prvek | Scope |
|---|---|
Connect Timeout |
Navázání spojení nebo čekání na spojení do skupiny |
SqlCommand.CommandTimeout |
Provedení jednoho příkazu |
CancellationToken |
Zrušení asynchronní operace na žádost volajícího |
Vypršení časového limitu nebo zrušení neznamená, že server vrátil operaci zpět. Použijte transakci, když se musí více změn potvrdit nebo vrátit zpět jako jedna jednotka, a o opakování operace rozhodujte na základě její idempotence a výsledku transakce.
Pochopení stavu spojení
Vlastnost State vrací snímek z ConnectionState výčtu.
| Kraj | Meaning |
|---|---|
Closed |
Logické spojení není otevřené. |
Connecting |
Probíhá otevřená operace. |
Open |
Logické spojení je otevřené. |
Nepoužívejte State jako kontrolu stavu před každým příkazem. Síť může selhat po jakékoli kontrole. Proveďte operaci a zpracujte vzniklou výjimku.
Ovladač obvykle hlásí přechody z uzavřeného do otevřeného a z otevřeného do uzavřeného stavu. Nespoléhejte na pozorování Executing, Fetching, ani Broken jako fáze životního cyklu aplikace.
StateChange událost hlásí přechody stavů. Událost InfoMessage oznamuje informační zprávy a varování serveru, které se neprojeví jako výjimky. Tyto události používejte k diagnostice, ne k koordinaci souběžné práce.
Nesdílejte spojení současně
SqlConnection, SqlCommand, SqlDataReader, a SqlTransaction nepodporují současné použití více vláken. Každé souběžné operaci přiřaďte vlastní připojení a nechte sdružování připojení opakovaně využívat fyzická připojení.
Multiple Active Result Sets (MARS) umožňuje více aktivních dávek na jednom připojení v podporovaných scénářích. Nedělá to objekty SqlClient bezpečnými pro vlákna a přidává pravidla pro relace a transakce. Nechte to vypnuté, pokud to některá operace výslovně nevyžaduje.
Neregistrujte otevřenou službu SqlConnection jako singleton ve vkládání závislostí. Zaregistrujte připojovací řetězec, neměnný objekt možností nebo továrnu, která vytváří nové připojení.
Používejte transakce záměrně
Lokální transakce je vázána na své připojení. Každý příkaz v transakci musí toto spojení použít a nastavit jeho Transaction vlastnost.
await using var connection = new SqlConnection(connectionString);
await connection.OpenAsync(cancellationToken);
await using SqlTransaction transaction =
(SqlTransaction)await connection.BeginTransactionAsync(cancellationToken);
using var command = new SqlCommand(sql, connection, transaction);
command.Parameters.Add(
new SqlParameter("@value", SqlDbType.Int) { Value = value });
await command.ExecuteNonQueryAsync(cancellationToken);
await transaction.CommitAsync(cancellationToken);
Pokud operace selže před CommitAsync, likvidace transakce ji vrátí zpět. Udržujte transakce krátké. Nedělejte síťové hovory, interakce s uživateli ani nesouvisející výpočty, dokud transakce v databázi drží zámky.
Když je System.Transactions.Transaction.Current aktivní, OpenAsync a Open se ve výchozím nastavení automaticky zaregistrují. Nastavte Enlist=false pouze tehdy, když operace musí zůstat mimo okolní transakci.
Změřte jedno logické spojení
Nastavte StatisticsEnabled na true sběr statistik poskytovatele pro jeden SqlConnection objekt:
await using var connection = new SqlConnection(connectionString)
{
StatisticsEnabled = true,
};
await connection.OpenAsync(cancellationToken);
connection.ResetStatistics();
using var command = new SqlCommand(sql, connection);
await command.ExecuteNonQueryAsync(cancellationToken);
System.Collections.IDictionary statistics =
connection.RetrieveStatistics();
long roundTrips =
Convert.ToInt64(statistics["ServerRoundtrips"]);
RetrieveStatistics vrátí snímek.
ResetStatistics označuje začátek nové hranice měření. Nastaveno StatisticsEnabled=false na zastavení sběru; hodnoty získané dosud zůstávají dostupné. Statistiky se vztahují ke každému objektu připojení a zvyšují režii, takže je povolujte pro cílenou diagnostiku, nikoli u každého produkčního požadavku.
Pro měření celých procesů poolu a připojení použijte diagnostické čítače SqlClient.
Řešení chyb připojení
Zachyťte SqlException na rozhraní, které může selhání zaznamenat, transformovat nebo opakovat. Záznam:
NumberStateClassClientConnectionId- Název operace a konfigurované identifikátory serverů a databází
Nezaznamenávejte připojovací řetězec, heslo, klientské tajemství ani access token.
Zlikvidujte přerušené spojení. Pool odstraní neplatné fyzické spojení, když je detekuje. Pokud se změní přihlašovací údaje, token, certifikát, DNS cíl nebo server, opravte konfiguraci před dalším pokusem.
Používejte omezenou logiku opakovaných pokusů pouze pro přechodné selhání. Opakování při počátečním otevření, obnovení nečinného připojení a opakování příkazu jsou různé mechanismy. Viz Konfigurovatelná logika opakovaných pokusů.