Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In deze quickstart bouw je een .NET-consoleapp met Microsoft. Data.SqlClient 7.1.1.
Je begint met een lege map, de .NET SDK en een SQL Server- of Azure SQL-database die je vanaf je computer kunt bereiken. Je eindigt met een console-app die een tabel maakt, twee rijen met parameters invoegt en deze terugleest.
Onderweg doet de app het volgende:
- Leest zijn verbindingsreeks uit een omgevingsvariabele in plaats van broncode.
- Opent een verbinding asynchroon.
- Gebruikt parameters voor elke waarde die het naar de database stuurt.
- Behandelt SQL-fouten en annuleringen.
Om dezelfde data-toegang in een web-API te bouwen, zie Quickstart: Use Microsoft.Data.SqlClient in een ASP.NET Core-app. Het gebruikt dezelfde tabel.
Prerequisites
- De .NET 10 SDK of een nieuwere ondersteunde .NET SDK. De SDK draait op Windows, Linux en macOS. De SDK bouwt ook de .NET Framework-versie van het voorbeeld, die alleen op Windows draait en .NET Framework 4.8.1 nodig heeft. Gebruik de .NET-versie voor nieuwe ontwikkelingen.
- Een code-editor. Je kunt Visual Studio, Visual Studio Code of een andere editor samen met de .NET CLI gebruiken. Dit artikel gebruikt de .NET CLI.
- Een database waarmee je verbinding kunt maken. Als je er geen hebt, maak er dan een aan met de volgende opties.
Een SQL-database maken
Maak een SQL-database aan of maak verbinding met een van de volgende platforms:
Databasemachtigingen
De app maakt zijn eigen tabel, dus je hebt geen voorbeeldgegevens nodig. De database-identiteit heeft toestemming nodig om verbinding te maken en om een tabel te maken, in te voegen en te selecteren.
Voor een SQL-database in Microsoft Fabric kopieert u de server- en databasenamen van het SQL-databaseitem. Gebruik het SQL analytics-endpoint niet. De identiteit heeft een machtiging nodig om items te lezen, die kan worden verleend door een werkruimterol of een itemmachtiging. Voor meer informatie, zie Authenticatie in SQL-database. SQL-authenticatie wordt niet ondersteund.
Voor Azure SQL Database configureer je Microsoft Entra ID-authenticatie en database-toegang.
Het project maken
Voer in een lege map deze commando's uit:
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
Het uitbreidingspakket levert de Microsoft Entra-authenticatiemodi van het stuurprogramma, zoals Active Directory Default. Als je app alleen SQL-authenticatie of Windows-geïntegreerde authenticatie gebruikt, kun je Microsoft.Data.SqlClient.Extensions.Azure weglaten. Als je beide pakketten gebruikt, houd dan hun versies hetzelfde. Voor andere installatieopties, zie Installeren, bijwerken en implementeren van Microsoft.Data.SqlClient.
Configureer de verbinding
Stel de omgevingsvariabele SQL_CONNECTION_STRING in voor je database. Zet geen wachtwoord, toegangstoken of productie-verbindingsreeks in de broncode.
Kies een van deze startpunten en vervang de placeholders.
Azure SQL of SQL-database in Fabric met Microsoft Entra ID
Log in met een Microsoft Entra-identiteit die toegang heeft tot de database. Voor lokale ontwikkeling gebruik je een ontwikkelaarstool zoals de Azure CLI:
az login
Kopieer de exacte server- en databasenamen uit de Azure SQL-database of het SQL-database-item in Fabric. Voor PowerShell:
$env:SQL_CONNECTION_STRING = 'Server=tcp:<server>,1433;Database=<database>;Authentication=Active Directory Default;Encrypt=Strict;MultiSubnetFailover=true;Connect Timeout=30'
Voor Bash:
export SQL_CONNECTION_STRING='Server=tcp:<server>,1433;Database=<database>;Authentication=Active Directory Default;Encrypt=Strict;MultiSubnetFailover=true;Connect Timeout=30'
Voor een app die in Azure wordt gehost, verleen je de beheerde identiteit toegang tot de database en gebruik je vervolgens Authentication=Active Directory Managed Identity. Voor andere opties, zie Microsoft Entra-authenticatie met Microsoft.Data.SqlClient.
SQL Server met SQL-authenticatie
Gebruik de server, poort, database en login voor je SQL Server-instantie. Het volgende voorbeeld is voor een lokale ontwikkelingsinstantie die geen vertrouwd certificaat heeft. Voor PowerShell:
$env:SQL_CONNECTION_STRING = 'Server=tcp:<server>,1433;Database=<database>;User ID=<user-id>;Password=<password>;Encrypt=true;TrustServerCertificate=true;Connect Timeout=30'
Voor Bash:
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 Slaat servercertificaatvalidatie over. Gebruik het alleen met een lokale ontwikkelinstantie die geen vertrouwd certificaat heeft. Voor gedeelde of productie-SQL Server-instanties, installeer een certificaat dat de client vertrouwt, gebruik de servernaam op dat certificaat en verwijder TrustServerCertificate=true. Zie Versleuteling en certificaatvalidatie in Microsoft.Data.SqlClientvoor meer informatie.
Als je omgeving Windows-geïntegreerde authenticatie of Kerberos ondersteunt, vervang User ID en Password door Integrated Security=true. Zie SQL Server- en Windows-verificatie voor installatievereisten.
Code toevoegen
Vervang de inhoud van Program.cs met deze code:
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;
}
De app uitvoeren
De app uitvoeren:
dotnet run
De eerste keer dat je de app uitvoert, is de tabel leeg en ziet de output er zo uit:
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)
Je tijdstempels verschillen. Elke latere run voegt twee extra rijen toe, zodat de ID's doorgaan van de laatste run.
Als de app geen verbinding kan maken, print hij het SQL-foutnummer, de client-verbindings-ID, het foutbericht en het interne uitzonderingsbericht, en sluit dan af met code 3. Voor veelvoorkomende fouten, zie Probleemoplossing.
Hoe de code werkt
-
OpenAsync,ExecuteNonQueryAsync,ExecuteReaderAsync,ReadAsyncenCancellationTokenontvangen allemaal hetzelfdeExecuteScalarAsync. Druk op Ctrl+C om het werk in uitvoering te annuleren. - Het invoegen-commando wordt één keer aangemaakt en één keer uitgevoerd voor elk bericht. Alleen de parameterwaarde verandert.
- De parametertypen en -groottes komen overeen met de kolommen van de tabel. Parameters sturen waarden apart van de SQL-tekst, wat voorkomt dat die waarden het commando wijzigen en SQL Server helpt queryplannen te hergebruiken.
-
OUTPUT INSERTED.Idgeeft de nieuwe identity value terug, dusExecuteScalarAsyncgeeft de ID terug zonder een tweede query. -
await usingGeeft de opdrachten, de reader en de verbinding vrij, zelfs wanneer er een uitzondering plaatsvindt. Het vrijgeven van de verbinding geeft deze terug aan de verbindingspool. De versie van het .NET Framework gebruiktusingblokken, omdat deze typenIAsyncDisposableniet implementeren op .NET Framework. -
SqlException.NumberIdentificeert de fout enClientConnectionIdstelt je in staat een clientstoring te koppelen aan server-side logs. Bij verbindingsfouten op Linux en macOS ligt de oorzaak vaak alleen inInnerException, zoals een certificaatvalidatiefout achter de generiekeerror: 35 - An internal exception was caught.
Troubleshoot
| Fout of symptoom | Wat u moet controleren | Meer informatie |
|---|---|---|
The certificate chain was issued by an authority that is not trustedop Windows. Op Linux en macOS wordt error: 35 - An internal exception was caught gevolgd door de interne uitzondering Certificate failed chain validation met UntrustedRoot. |
Het servercertificaat wordt niet vertrouwd door de client, of de servernaam in de verbindingsreeks komt niet overeen met het certificaat. Installeer een vertrouwd certificaat. Gebruik TrustServerCertificate=true alleen met een lokale ontwikkelingsinstantie. |
Versleuteling en certificaatvalidatie bij Microsoft. Data.SqlClient |
SQL error 18456 met Login failed for user |
De gebruikersnaam, het wachtwoord of de databasenaam is verkeerd, of de login heeft geen toegang tot de database. Controleer voor Microsoft Entra ID of de identiteit als databasegebruiker is toegevoegd. | Probleemoplossingsgids voor SqlClient |
A network-related or instance-specific error occurred met error: 26, error: 40, of The wait operation timed out. Op Linux en macOS verschijnt een timeout SQL error 258 met error: 35, gevolgd door de binnenste uitzondering The connection attempt timed out. |
De servernaam of poort klopt niet, de server accepteert geen externe TCP-verbindingen, of een firewall blokkeert de poort. Voor Azure SQL, controleer de serverfirewallregels. | Probleemoplossingsgids voor SqlClient |
System.ArgumentException: Cannot find an authentication provider for 'ActiveDirectoryDefault' |
De verbindingsreeks gebruikt een Active Directory authenticatiemodus, maar het project verwijst niet naar Microsoft.Data.SqlClient.Extensions.Azure. Voeg het pakket toe met dezelfde versie als Microsoft.Data.SqlClient. |
Microsoft Entra-authenticatie verplaatst zich in 7.0 naar een extensiepakket |
CS0234: The type or namespace name 'Data' does not exist in the namespace 'Microsoft' |
Het project verwijst niet naar het Microsoft.Data.SqlClient pakket. Voer het dotnet add package commando uit vanuit de map waarin het projectbestand staat. |
Installeer, werk Microsoft.Data.SqlClient bij en implementeer het |
Herstelrapporten NU1902 of NU1903 voor een transitief pakket |
Een pakket waarvan het stuurprogramma afhankelijk is, heeft een gepubliceerd beveiligingsadvies. | Acties wanneer pakketten met bekende kwetsbaarheden worden gerapporteerd |
De hulpbronnen opschonen
De tabel blijft in je database nadat de app is afgesloten. Als je niet van plan bent door te gaan met de ASP.NET Core quickstart, die dezelfde tabel gebruikt, verwijder deze dan met een willekeurige querytool:
DROP TABLE IF EXISTS dbo.SqlClientQuickstart;
Verwijder daarna de projectmap. Vanuit de oudermap, voor PowerShell:
Remove-Item -Recurse -Force SqlClientQuickstart
Voor Bash:
rm -rf SqlClientQuickstart
Maak de omgevingsvariabele schoon zodat de verbindingsreeks niet in je shell-sessie blijft. Voor PowerShell voer Remove-Item Env:\SQL_CONNECTION_STRING uit. Voor Bash, voer unset SQL_CONNECTION_STRING uit.
Gebruik het patroon in een applicatie
Houd deze grenzen aan wanneer je het voorbeeld verplaatst naar een API, service, desktopapp of achtergrondwerker:
- Laad verbindingsinformatie via het configuratiesysteem van de app.
- Open één verbinding voor een korte eenheid werk en verwijder die dan.
- Geef een
CancellationTokendoor aan open-, opdracht- en reader-aanroepen. - Stel commando-timeouts in op basis van de operatie.
- Gebruik parameters voor elke waarde die buiten de SQL-instructie komt.
- Registreer
SqlException.NumberenClientConnectionIdzonder inloggegevens of toegangstokens te registreren. - Voeg herpogingen alleen toe bij tijdelijke storingen en alleen wanneer het herhalen van de operatie veilig is.