Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ebben a rövid útmutatóban egy .NET-konzolalkalmazást hozol létre a Microsoft.Data.SqlClient 7.1.1 használatával.
Egy üres mappával, a .NET SDK-val, valamint egy SQL Server vagy Azure SQL adatbázissal kezded, amit a számítógépedről elérhetsz. A végére lesz egy konzolos alkalmazásod, ami létrehoz egy táblázatot, két sort helyez be paraméterekkel, és visszaolvassa azokat.
Útközben az alkalmazás:
- A kapcsolati karakterláncet a forráskód helyett egy környezeti változóból olvassa ki.
- Aszinkron módon nyit meg egy kapcsolatot.
- Minden, az adatbázisba küldött értékhez paramétereket használ.
- SQL hibákat és megszakítást kezel.
Ugyanezen adathozzáférés webes API-ba való beépítéséről lásd: Gyorsútmutató: A Microsoft.Data.SqlClient használata ASP.NET Core-alkalmazásban. Ugyanazt a táblázatot használja.
Prerequisites
- A .NET 10 SDK vagy egy újabb támogatott .NET SDK. Az SDK Windows-on, Linuxon és macOS-en fut. Az SDK a .NET Framework verziót is készíti a mintaverzióból, amely csak Windows-on fut, és .NET Framework 4.8.1-et igényel. Új fejlesztéshez használd a .NET verziót.
- Egy kódszerkesztő. Használhatod a Visual Studio-t, a Visual Studio Code-ot vagy bármely szerkesztőt a .NET CLI-vel együtt. Ez a cikk a .NET CLI-t használja.
- Egy adatbázis, amihez csatlakozni tudsz. Ha nincs ilyened, hozz létre egyet az alábbi opciókkal.
SQL-adatbázis létrehozása
Létrehozni vagy csatlakozni SQL adatbázishoz az alábbi platformok egyikén:
Adatbázis-engedélyek
Az alkalmazás saját táblázatot hoz létre, így nincs szükség mintaadatokra. Az adatbázis identitásának engedélyre van szüksége a csatlakozáshoz, valamint a táblázat létrehozásához, beillesztéséhez és kiválasztásához.
Az SQL adatbázishoz a Microsoft Fabric-ben másold le a szerver- és adatbázisneveket az SQL adatbázis elemből. Ne használd az SQL analitikai végpontot. Az identitáshoz Olvasási elem engedélyre van szükség, amit egy munkaterületi szerep vagy elem jogosultság biztosíthat. További információért lásd: Hitelesítés az SQL adatbázisban. Az SQL hitelesítés nem támogatott.
Azure SQL Database esetén konfiguráld a Microsoft Entra ID hitelesítést és adatbázis-hozzáférést.
A projekt létrehozása
Egy üres mappában futtassa ezeket a parancsokat:
dotnet new console --framework net10.0 --name SqlClientQuickstart
cd SqlClientQuickstart
dotnet add package Microsoft.Data.SqlClient --version 7.1.1
dotnet add package Microsoft.Data.SqlClient.Extensions.Azure --version 7.1.1
A kiterjesztési csomag biztosítja a meghajtó Microsoft Entra hitelesítési módjait, például Active Directory Default. Ha az alkalmazásod csak SQL hitelesítést vagy Windows integrált hitelesítést használ, akkor kihagyhatod Microsoft.Data.SqlClient.Extensions.Azure. Ha mindkét csomagot használod, ügyelj arra, hogy a verziójuk azonos legyen. További telepítési lehetőségekért lásd: Telepítés, frissítés és üzembe helyezés Microsoft.Data.SqlClient.
Konfiguráld a kapcsolatot
Állítsd be a SQL_CONNECTION_STRING környezeti változót az adatbázisodhoz. Ne helyezz jelszót, hozzáférési tokent vagy éles kapcsolati karakterláncot a forráskódba.
Válassz ki ezek közül az egyik kezdőpontot, és cseréld le a helykitöltőket.
Azure SQL vagy Fabricbeli SQL-adatbázis Microsoft Entra ID-val
Jelentkezz be egy Microsoft Entra azonosítóval, amely hozzáfér az adatbázishoz. Helyi fejlesztéshez használj fejlesztői eszközt, például az Azure CLI-t:
az login
Másold le a pontos szerver- és adatbázisneveket az Azure SQL adatbázisból vagy az SQL adatbázis elemből a Fabric-ben. PowerShell esetén:
$env:SQL_CONNECTION_STRING = 'Server=tcp:<server>,1433;Database=<database>;Authentication=Active Directory Default;Encrypt=Strict;MultiSubnetFailover=true;Connect Timeout=30'
Bash esetén:
export SQL_CONNECTION_STRING='Server=tcp:<server>,1433;Database=<database>;Authentication=Active Directory Default;Encrypt=Strict;MultiSubnetFailover=true;Connect Timeout=30'
Egy Azure-ban üzemeltetett alkalmazás esetén adj adatbázis-hozzáférést a felügyelt identitásának, majd használd Authentication=Active Directory Managed Identity. További lehetőségekért lásd: Microsoft Entra-hitelesítés a Microsoft.Data.SqlClienttel.
SQL Server SQL hitelesítéssel
Használd a szervert, portot, adatbázist és bejelentkezési nevet az SQL Server példányodhoz. A következő példa egy helyi fejlesztési példányra vonatkozik, amelynek nincs megbízható tanúsítványa. PowerShell esetén:
$env:SQL_CONNECTION_STRING = 'Server=tcp:<server>,1433;Database=<database>;User ID=<user-id>;Password=<password>;Encrypt=true;TrustServerCertificate=true;Connect Timeout=30'
Bash esetén:
export SQL_CONNECTION_STRING='Server=tcp:<server>,1433;Database=<database>;User ID=<user-id>;Password=<password>;Encrypt=true;TrustServerCertificate=true;Connect Timeout=30'
Caution
TrustServerCertificate=true kihagyja a szerver tanúsítvány ellenőrzését. Csak olyan helyi fejlesztési instansszal használd, amelynek nincs megbízható tanúsítványa. Megosztott vagy éles SQL Server-példányok esetén telepítsen egy olyan tanúsítványt, amelyben az ügyfél megbízik, használja a tanúsítványon szereplő kiszolgálónevet, és távolítsa el a(z) TrustServerCertificate=true elemet. További információ: Titkosítás és tanúsítványérvényesítés a Microsoft.Data.SqlClientben.
Ha a környezeted támogatja a Windows integrált hitelesítést vagy a Kerberost, cseréld le a(z) User ID és Password elemeket erre: Integrated Security=true. A beállítási követelményekért lásd: SQL Server és Windows-hitelesítés.
A kód hozzáadása
Cserélje le a Program.cs tartalmát ezzel a kóddal:
using System.Data;
using Microsoft.Data.SqlClient;
string? connectionString =
Environment.GetEnvironmentVariable("SQL_CONNECTION_STRING");
if (string.IsNullOrWhiteSpace(connectionString))
{
Console.Error.WriteLine(
"Set the SQL_CONNECTION_STRING environment variable.");
return 1;
}
using var cancellation = new CancellationTokenSource();
Console.CancelKeyPress += (_, eventArgs) =>
{
eventArgs.Cancel = true;
cancellation.Cancel();
};
try
{
await using var connection = new SqlConnection(connectionString);
await connection.OpenAsync(cancellation.Token);
const string createTableSql = """
IF OBJECT_ID(N'dbo.SqlClientQuickstart', N'U') IS NULL
BEGIN
CREATE TABLE dbo.SqlClientQuickstart
(
Id int IDENTITY(1, 1) PRIMARY KEY,
Message nvarchar(200) NOT NULL,
CreatedAt datetimeoffset NOT NULL
CONSTRAINT DF_SqlClientQuickstart_CreatedAt
DEFAULT sysdatetimeoffset()
);
END;
""";
await using (var createCommand =
new SqlCommand(createTableSql, connection) { CommandTimeout = 30 })
{
await createCommand.ExecuteNonQueryAsync(cancellation.Token);
}
const string insertSql = """
INSERT INTO dbo.SqlClientQuickstart (Message)
OUTPUT INSERTED.Id
VALUES (@message);
""";
string[] messages =
[
"Hello from Microsoft.Data.SqlClient",
"Parameters keep values out of the SQL text"
];
int firstId = 0;
await using (var insertCommand =
new SqlCommand(insertSql, connection) { CommandTimeout = 30 })
{
SqlParameter messageParameter =
insertCommand.Parameters.Add("@message", SqlDbType.NVarChar, 200);
foreach (string message in messages)
{
messageParameter.Value = message;
int id = (int)(await insertCommand.ExecuteScalarAsync(
cancellation.Token))!;
Console.WriteLine($"Inserted row {id}.");
firstId = firstId == 0 ? id : firstId;
}
}
const string querySql = """
SELECT Id, Message, CreatedAt
FROM dbo.SqlClientQuickstart
WHERE Id >= @firstId
ORDER BY Id;
""";
await using var queryCommand =
new SqlCommand(querySql, connection) { CommandTimeout = 30 };
queryCommand.Parameters.Add("@firstId", SqlDbType.Int).Value = firstId;
await using SqlDataReader reader =
await queryCommand.ExecuteReaderAsync(cancellation.Token);
while (await reader.ReadAsync(cancellation.Token))
{
Console.WriteLine(
$"{reader.GetInt32(0)}: {reader.GetString(1)} " +
$"(created {reader.GetDateTimeOffset(2):u})");
}
return 0;
}
catch (OperationCanceledException)
{
Console.Error.WriteLine("The operation was canceled.");
return 2;
}
catch (SqlException ex)
{
Console.Error.WriteLine(
$"SQL error {ex.Number}, connection {ex.ClientConnectionId}: " +
ex.Message);
if (ex.InnerException is not null)
{
Console.Error.WriteLine(ex.InnerException.Message);
}
return 3;
}
Az alkalmazás futtatása
Futtassa az alkalmazást:
dotnet run
Amikor először futtatod az alkalmazást, a tábla üres, és a kimenet így néz ki:
Inserted row 1.
Inserted row 2.
1: Hello from Microsoft.Data.SqlClient (created 2026-10-20 20:56:10Z)
2: Parameters keep values out of the SQL text (created 2026-10-20 20:56:10Z)
Az időbélyegeid eltérnek. Minden későbbi futás két újabb sort ad hozzá, így az azonosítók az előző futástól folytatódnak.
Ha az alkalmazás nem tud csatlakozni, kinyomtatja az SQL hibaszámot, a kliens kapcsolati azonosítóját, a hibaüzenetet és a belső kivétel üzenetet, majd 3-as kóddal kilép. Gyakori hibák esetén lásd: Hibakeresés.
A kód működése
-
OpenAsync,ExecuteNonQueryAsync,ExecuteScalarAsync,ExecuteReaderAsync, , ésReadAsyncmind ugyanaztCancellationTokenkapják. Nyomja meg a Ctrl+C gombot, hogy megszakítsa a folyamatban lévő műveletet. - A beszúrási parancs egyszer jön létre, és üzenetenként egyszer fut le. Csak a paraméterérték változik.
- A paramétertípusok és méretek megegyeznek a táblázatoszlopokkal. A paraméterek az SQL-szövegtől elkülönítve küldik az értékeket, ami megakadályozza, hogy ezek az értékek megváltoztassák a parancsot, és segít az SQL Server-nek a lekérdezési tervek újrahasznosításában.
-
OUTPUT INSERTED.Idvisszaadja az új identitásértéket, ígyExecuteScalarAsyncaz azonosítót második lekérdezés nélkül adja vissza. -
await usingfelszabadítja a parancsokat, az olvasót és a kapcsolatot, még akkor is, ha kivétel adódik. A kapcsolat lezárása visszaadja a kapcsolatpoolba. A .NET Framework verzióusingblokkokat használ, mert ezek a típusok nem implementálják aIAsyncDisposableelemet a .NET Frameworkön. -
SqlException.Numberazonosítja a hibát, ésClientConnectionIdlehetővé teszi, hogy egy klienshibát a szerveroldali naplókhoz társítson. Linux és macOS rendszerben fellépő kapcsolódási hibák esetén az ok gyakran csak a(z)InnerExceptionrészben látható, például egy tanúsítvány-ellenőrzési hiba az általánoserror: 35 - An internal exception was caughtmögött.
Troubleshoot
| Hiba vagy tünet | Mit kell ellenőrizni? | További információ |
|---|---|---|
The certificate chain was issued by an authority that is not trustedWindows-on. Linuxon és macOS rendszeren error: 35 - An internal exception was caught, majd a belső kivétel Certificate failed chain validation következik ezzel: UntrustedRoot. |
Az ügyfél nem bízik meg a szerver tanúsítványában, vagy a kapcsolati karakterláncban szereplő szervernév nem egyezik meg a tanúsítvánnyal. Telepíts egy megbízható tanúsítványt. A TrustServerCertificate=true elemet csak helyi fejlesztői példánnyal használd. |
Titkosítás és tanúsítvány ellenőrzése a Microsoft-ban. Data.SqlClient |
SQL error 18456 és Login failed for user |
A felhasználónév, jelszó vagy adatbázisnév hibás, vagy a felhasználó nem fér hozzá az adatbázishoz. Microsoft Entra ID esetén ellenőrizd, hogy az identitás adatbázis-felhasználóként lett-e hozzáadva. | Az SqlClient hibaelhárítási útmutatója |
A network-related or instance-specific error occurred a(z) error: 26, error: 40 vagy The wait operation timed out használatával. Linuxon és macOS-en időtúllépés esetén SQL error 258 jelenik meg error: 35 kíséretében, majd a belső kivétel: The connection attempt timed out. |
A szerver neve vagy portja hibás, a szerver nem fogad el távoli TCP kapcsolatokat, vagy egy tűzfal blokkolja a portot. Azure SQL esetén ellenőrizze a kiszolgáló tűzfalszabályait. | Az SqlClient hibaelhárítási útmutatója |
System.ArgumentException: Cannot find an authentication provider for 'ActiveDirectoryDefault' |
A kapcsolati karakterlánc Active Directory hitelesítési módot használ, de a projekt nem hivatkozik a(z) Microsoft.Data.SqlClient.Extensions.Azure elemre. Add a csomagot a(z) Microsoft.Data.SqlClient csomagéval azonos verzióval. |
A Microsoft Entra hitelesítés 7.0-ban egy bővítménycsomagba kerül |
CS0234: The type or namespace name 'Data' does not exist in the namespace 'Microsoft' |
A projekt nem utal a Microsoft.Data.SqlClient csomagra. Futtasd a dotnet add package parancsot abból a mappából, amely a projektfájlt tartalmazza. |
Telepítsd, frissítsd és telepítsd a Microsoft-ot. Data.SqlClient |
Jelentések visszaállítása NU1902 vagy NU1903 egy tranzitív csomaghoz |
Közzétettek egy figyelmeztetést egy csomagról, amelytől az illesztőprogram függ. | Műveletek ismert sebezhetőségeket tartalmazó csomagok jelentésekor |
Erőforrások tisztítása
A tábla az adatbázisban marad, miután az alkalmazás kilép. Ha nem tervezed folytatni az ASP.NET Core gyorsindítást, amely ugyanazt a táblát használja, töröld bármelyik lekérdezési eszközzel:
DROP TABLE IF EXISTS dbo.SqlClientQuickstart;
Aztán töröld a projektmappát. Az anyamappából, PowerShell esetén:
Remove-Item -Recurse -Force SqlClientQuickstart
Bash esetén:
rm -rf SqlClientQuickstart
Töröld a környezeti változót, hogy a kapcsolati karakterlánc ne maradjon a shell sessionben. PowerShellhez futtatd Remove-Item Env:\SQL_CONNECTION_STRING. A Bashben futtasd: unset SQL_CONNECTION_STRING.
Használd a mintát egy alkalmazásban
Tartsd meg ezeket a határokat, amikor a mintát API-ba, szolgáltatásba, asztali alkalmazásba vagy háttérfolyamatba helyezed:
- Töltsd be a kapcsolati információkat az alkalmazás konfigurációs rendszerén keresztül.
- Nyiss meg egy kapcsolatot egy rövid munkafolyamathoz, majd szüntesd meg.
- Add át a
CancellationTokenelemet az open-, command- és readerhívásoknak. - Állítsd be a parancsidőkorlátokat a művelet alapján.
- Használj paramétereket minden olyan értékhez, amely az SQL utasításon kívül érkezik.
- Naplózza
SqlException.NumberésClientConnectionIdelemeket hitelesítő adatok vagy hozzáférési tokenek naplózása nélkül. - Csak átmeneti hibák esetén és csak akkor adj ismétlést, ha a művelet megismétlése biztonságos.