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.
Belangrijk
Deze functie is beschikbaar als preview-versie.
ADO.NET is een veelgebruikte technologie voor gegevenstoegang in het .NET-ecosysteem waarmee toepassingen verbinding kunnen maken met en kunnen werken met gegevens uit databases en big data-platforms.
Met het Microsoft ADO.NET Driver for Fabric Data Engineering kunt u Spark-workloads in Microsoft Fabric verbinden, opvragen en beheren met de betrouwbaarheid en eenvoud van standaard ADO.NET patronen. Het stuurprogramma is gebouwd op de Livy-API's van Microsoft Fabric en biedt veilige en flexibele Spark SQL-connectiviteit met uw .NET-toepassingen met behulp van vertrouwde DbConnection, DbCommanden DbDataReader abstracties.
Belangrijkste kenmerken
-
ADO.NET Compatibel: Volledige implementatie van ADO.NET abstracties (
DbConnection,DbCommand,DbDataReader,DbParameter,DbProviderFactory) - Microsoft Entra ID-verificatie: meerdere verificatiestromen, waaronder Azure CLI, interactieve browser, clientreferenties, verificatie op basis van certificaten en toegangstokenverificatie
- Ondersteuning voor systeemeigen Spark SQL-query's: Directe uitvoering van Spark SQL-instructies met geparameteriseerde query's
- Uitgebreide ondersteuning voor gegevenstypen: ondersteuning voor alle Spark SQL-gegevenstypen, waaronder complexe typen (ARRAY, MAP, STRUCT)
- Groepsgewijze verbindingen: ingebouwd beheer van verbindingsgroepen voor verbeterde prestaties
- Sessie opnieuw gebruiken: Efficiënt Spark-sessiebeheer om de opstartlatentie te verminderen
- Asynchrone prefetch: achtergrondgegevens laden voor verbeterde prestaties met grote resultatensets
- Automatisch opnieuw verbinding maken: Automatisch sessieherstel na verbindingsfouten
Opmerking
In opensource Apache Spark worden database en schema synoniem gebruikt. Als u bijvoorbeeld SHOW SCHEMAS of SHOW DATABASES uitvoert in een Infrastructuurnotitieblok, wordt hetzelfde resultaat geretourneerd: een lijst met alle schema's in de Lakehouse.
Vereiste voorwaarden
Voordat u het Microsoft ADO.NET-stuurprogramma voor Microsoft Fabric Data Engineering gebruikt, moet u het volgende doen:
- .NET Runtime: .NET 8.0 of hoger
- Microsoft Fabric Access: Toegang tot een Microsoft Fabric-werkruimte met mogelijkheden voor data engineering
- Referenties voor Azure Entra ID: juiste referenties voor authenticatie
- Werkruimte- en Lakehouse-id's: GUID-id's voor uw Fabric-werkruimte en Lakehouse
- Azure CLI (optioneel): vereist voor azure CLI-verificatiemethode
Downloaden, opnemen, verwijzen en verifiëren
NuGet-pakket downloaden
Microsoft ADO.NET Driver voor Microsoft Fabric Data Engineering is in versie 1.0.0 als publieke preview beschikbaar die u kunt downloaden via deze downloadcentrum links.
- Microsoft ADO.NET-stuurprogramma voor Microsoft Fabric Data Engineering (zip) downloaden
- Microsoft ADO.NET-stuurprogramma voor Microsoft Fabric Data Engineering (tar) downloaden
Neem het NuGet-pakket op in uw project
Neem het gedownloade NuGet-pakket op in uw project en voeg een verwijzing van het pakket toe aan uw projectbestand:
<ItemGroup>
<PackageReference Include="Microsoft.Spark.Livy.AdoNet" Version="1.0.0" />
</ItemGroup>
Installatie controleren
Controleer na opname en verwijzing of het pakket beschikbaar is in uw project:
using Microsoft.Spark.Livy.AdoNet;
// Verify the provider is registered
var factory = LivyProviderFactory.Instance;
Console.WriteLine($"Provider: {factory.GetType().Name}");
Snelstartvoorbeeld
using Microsoft.Spark.Livy.AdoNet;
// Connection string with required parameters
string connectionString =
"Server=https://api.fabric.microsoft.com/v1;" +
"SparkServerType=Fabric;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=AzureCli;";
// Create and open connection
using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();
Console.WriteLine("Connected successfully!");
// Execute a query
using var command = connection.CreateCommand();
command.CommandText = "SELECT 'Hello from Fabric!' as message";
using var reader = await command.ExecuteReaderAsync();
if (await reader.ReadAsync())
{
Console.WriteLine(reader.GetString(0));
}
Indeling van verbindingstekenreeks
Basisindeling
Het Microsoft ADO.NET-stuurprogramma maakt gebruik van de standaardindeling voor ADO.NET verbindingsreeks:
Parameter1=Value1;Parameter2=Value2;...
Benodigde parameters
| Kenmerk | Beschrijving | Voorbeeld |
|---|---|---|
Server |
Microsoft Fabric API-eindpunt | https://api.fabric.microsoft.com/v1 |
SparkServerType |
Id van servertype | Fabric |
FabricWorkspaceID |
Microsoft Fabric-werkruimte-id (GUID) | <workspace-id> |
FabricLakehouseID |
Microsoft Fabric Lakehouse-id (GUID) | <lakehouse-id> |
AuthFlow |
Verificatiemethode |
AzureCli, BrowserBased, ClientSecretCredential, ClientCertificateCredential, AuthAccessToken, FileToken |
Optionele parameters
Verbindingsinstellingen
| Kenmerk | Typ | Verstek | Beschrijving |
|---|---|---|---|
LivySessionTimeoutSeconds |
Integer | 60 |
Tijd in seconden voor het aanmaken van een sessie |
LivyStatementTimeoutSeconds |
Integer | 600 |
Tijd in seconden om te wachten op uitvoering van de instructie |
SessionName |
Snaar / Touwtje | (automatisch) | Aangepaste naam voor de Spark-sessie |
AutoReconnect |
Boolean | false |
Automatisch sessieherstel inschakelen |
Instellingen voor verbindingsgroep
| Kenmerk | Typ | Verstek | Beschrijving |
|---|---|---|---|
ConnectionPoolEnabled |
Boolean | true |
Groepsgewijze verbindingen inschakelen |
MinPoolSize |
Integer | 1 |
Minimale verbindingen in de pool |
MaxPoolSize |
Integer | 20 |
Maximum aantal verbindingen in de pool |
ConnectionMaxIdleTimeMs |
Integer | 1800000 |
Maximale niet-actieve tijd voordat de verbinding wordt gerecycled (30 min. ) |
MaxLifetimeMs |
Integer | 3600000 |
Maximale levensduur van een gegroepeerde verbinding (60 min. ) |
ValidateConnections |
Boolean | true |
Verbindingen valideren voor gebruik |
ValidationTimeoutMs |
Integer | 5000 |
Time-out voor verbindingsvalidatie |
Instellingen voor logboekregistratie
| Kenmerk | Typ | Verstek | Beschrijving |
|---|---|---|---|
LogLevel |
Snaar / Touwtje | Information |
Logboekniveau: Trace, Debug, Information, , WarningError |
LogFilePath |
Snaar / Touwtje | (geen) | Pad voor logboekregistratie op basis van bestanden |
Opmerking
Aliassen voor meerdere stuurprogramma's: Het stuurprogramma accepteert naast systeemeigen ADO.NET namen ook namen van JDBC- en ODBC-eigenschappen (bijvoorbeeld WorkspaceId wordt toegewezen aan FabricWorkspaceID, en LakehouseId wordt toegewezen aan FabricLakehouseID). Alle eigenschapsnamen zijn niet-hoofdlettergevoelig.
Voorbeeld van verbindingsreeksen
Basisverbinding (Azure CLI-verificatie)
Server=https://api.fabric.microsoft.com/v1;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli
Met opties voor groepsgewijze verbindingen
Server=https://api.fabric.microsoft.com/v1;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;ConnectionPoolEnabled=true;MinPoolSize=2;MaxPoolSize=10
Met automatisch opnieuw verbinden en logboekregistratie
Server=https://api.fabric.microsoft.com/v1;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;AutoReconnect=true;LogLevel=Debug
Authentication
Het Microsoft ADO.NET-stuurprogramma ondersteunt meerdere verificatiemethoden via Microsoft Entra ID (voorheen Azure Active Directory). Verificatie wordt geconfigureerd met behulp van de AuthFlow parameter in de verbindingsreeks.
Verificatiemethoden
| AuthFlow-waarde | Beschrijving | Geschikt voor |
|---|---|---|
AzureCli |
Maakt gebruik van referenties in de cache van Azure CLI | Ontwikkeling en testen |
BrowserBased |
Interactieve verificatie op basis van een browser | Gebruikersgerichte toepassingen |
ClientSecretCredential |
Service-principal met clientgeheim | Geautomatiseerde services, achtergrondtaken |
ClientCertificateCredential |
Service-principal met certificaat | Bedrijfstoepassingen |
AuthAccessToken |
Vooraf verkregen bearer-toegangstoken | Aangepaste verificatiescenario's |
Azure CLI-verificatie
Geschikt voor: Ontwikkeling en testen
string connectionString =
"Server=https://api.fabric.microsoft.com/v1;" +
"SparkServerType=Fabric;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=AzureCli;";
using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();
vereisten:
- Azure CLI geïnstalleerd:
az --version - Ingelogd:
az login
Interactieve browserverificatie
Geschikt voor: gebruikersgerichte toepassingen
string connectionString =
"Server=https://api.fabric.microsoft.com/v1;" +
"SparkServerType=Fabric;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=BrowserBased;" +
"AuthTenantID=<tenant-id>;";
using var connection = new LivyConnection(connectionString);
await connection.OpenAsync(); // Opens browser for authentication
Gedrag:
- Hiermee opent u een browservenster voor gebruikersverificatie
- Referenties worden in de cache opgeslagen voor volgende verbindingen
Verificatie van clientreferenties (service-principal)
Geschikt voor: Geautomatiseerde services en achtergrondtaken
string connectionString =
"Server=https://api.fabric.microsoft.com/v1;" +
"SparkServerType=Fabric;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=ClientSecretCredential;" +
"AuthTenantID=<tenant-id>;" +
"AuthClientID=<client-id>;" +
"AuthClientSecret=<client-secret>;";
using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();
Vereiste parameters:
-
AuthTenantID: Azure-tenant-id -
AuthClientID: Toepassings-ID (client) van Microsoft Entra ID -
AuthClientSecret: Clientgeheim van Microsoft Entra-id
Verificatie op basis van certificaat
Geschikt voor: Bedrijfstoepassingen waarvoor verificatie op basis van certificaten is vereist
string connectionString =
"Server=https://api.fabric.microsoft.com/v1;" +
"SparkServerType=Fabric;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=ClientCertificateCredential;" +
"AuthTenantID=<tenant-id>;" +
"AuthClientID=<client-id>;" +
"AuthCertificatePath=C:\\certs\\mycert.pfx;" +
"AuthCertificatePassword=<password>;";
using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();
Vereiste parameters:
-
AuthTenantID: Azure-tenant-id -
AuthClientID: Applicatie-ID (client) -
AuthCertificatePath: Pad naar PFX-/PKCS12-certificaatbestand -
AuthCertificatePassword: Certificaatwachtwoord
Verificatie van toegangstokens
Geschikt voor: Scenario's voor aangepaste verificatie
// Acquire token through your custom mechanism
string accessToken = await AcquireTokenFromCustomSourceAsync();
string connectionString =
"Server=https://api.fabric.microsoft.com/v1;" +
"SparkServerType=Fabric;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=AuthAccessToken;" +
$"AuthAccessToken={accessToken};";
using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();
Opmerking
We raden u ten zeerste aan om het hard-coderen van referenties zoals wachtwoorden, sleutels, geheimen, tokens of certificaten in uw code te vermijden. Gebruik in plaats daarvan Azure Key Vault om deze waarden veilig op te slaan en op te halen tijdens runtime.
Voorbeelden van gebruik
Eenvoudige verbinding en opvraging
using Microsoft.Spark.Livy.AdoNet;
string connectionString =
"Server=https://api.fabric.microsoft.com/v1;" +
"SparkServerType=Fabric;" +
"FabricWorkspaceID=<workspace-id>;" +
"FabricLakehouseID=<lakehouse-id>;" +
"AuthFlow=AzureCli;";
using var connection = new LivyConnection(connectionString);
await connection.OpenAsync();
Console.WriteLine($"Connected! Server version: {connection.ServerVersion}");
// Execute a query
using var command = connection.CreateCommand();
command.CommandText = "SELECT * FROM employees LIMIT 10";
using var reader = await command.ExecuteReaderAsync();
// Print column names
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write($"{reader.GetName(i)}\t");
}
Console.WriteLine();
// Print rows
while (await reader.ReadAsync())
{
for (int i = 0; i < reader.FieldCount; i++)
{
Console.Write($"{reader.GetValue(i)}\t");
}
Console.WriteLine();
}
Geparameteriseerde query's
using var command = connection.CreateCommand();
command.CommandText = "SELECT * FROM orders WHERE order_date >= @startDate AND status = @status";
// Add parameters
command.Parameters.AddWithValue("@startDate", new DateTime(2024, 1, 1));
command.Parameters.AddWithValue("@status", "completed");
using var reader = await command.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
Console.WriteLine($"Order: {reader["order_id"]}, Total: {reader["total"]:C}");
}
ExecuteScalar voor enkele waarden
using var command = connection.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM customers";
var count = await command.ExecuteScalarAsync();
Console.WriteLine($"Total customers: {count}");
ExecuteNonQuery voor DML-bewerkingen
// INSERT
using var insertCommand = connection.CreateCommand();
insertCommand.CommandText = @"
INSERT INTO employees (id, name, department, salary)
VALUES (100, 'John Doe', 'Engineering', 85000)";
int rowsAffected = await insertCommand.ExecuteNonQueryAsync();
Console.WriteLine($"Inserted {rowsAffected} row(s)");
// UPDATE
using var updateCommand = connection.CreateCommand();
updateCommand.CommandText = "UPDATE employees SET salary = 90000 WHERE id = 100";
rowsAffected = await updateCommand.ExecuteNonQueryAsync();
Console.WriteLine($"Updated {rowsAffected} row(s)");
// DELETE
using var deleteCommand = connection.CreateCommand();
deleteCommand.CommandText = "DELETE FROM employees WHERE id = 100";
rowsAffected = await deleteCommand.ExecuteNonQueryAsync();
Console.WriteLine($"Deleted {rowsAffected} row(s)");
Werken met grote resultatensets
using var command = connection.CreateCommand();
command.CommandText = "SELECT * FROM large_table";
using var reader = await command.ExecuteReaderAsync();
int rowCount = 0;
while (await reader.ReadAsync())
{
// Process each row
ProcessRow(reader);
rowCount++;
if (rowCount % 10000 == 0)
{
Console.WriteLine($"Processed {rowCount} rows...");
}
}
Console.WriteLine($"Total rows processed: {rowCount}");
Schema-ontdekking
// List all tables
using var showTablesCommand = connection.CreateCommand();
showTablesCommand.CommandText = "SHOW TABLES";
using var tablesReader = await showTablesCommand.ExecuteReaderAsync();
Console.WriteLine("Available tables:");
while (await tablesReader.ReadAsync())
{
Console.WriteLine($" {tablesReader.GetString(0)}");
}
// Describe table structure
using var describeCommand = connection.CreateCommand();
describeCommand.CommandText = "DESCRIBE employees";
using var schemaReader = await describeCommand.ExecuteReaderAsync();
Console.WriteLine("\nTable structure for 'employees':");
while (await schemaReader.ReadAsync())
{
Console.WriteLine($" {schemaReader["col_name"]}: {schemaReader["data_type"]}");
}
LivyConnectionStringBuilder gebruiken
using Microsoft.Spark.Livy.AdoNet;
var builder = new LivyConnectionStringBuilder
{
Server = "https://api.fabric.microsoft.com/v1",
SparkServerType = "Fabric",
FabricWorkspaceID = "<workspace-id>",
FabricLakehouseID = "<lakehouse-id>",
AuthFlow = "AzureCli",
ConnectionPoolingEnabled = true,
MinPoolSize = 2,
MaxPoolSize = 10,
ConnectionTimeout = 60
};
using var connection = new LivyConnection(builder.ConnectionString);
await connection.OpenAsync();
DbProviderFactory gebruiken
using System.Data.Common;
using Microsoft.Spark.Livy.AdoNet;
// Register the provider factory (typically done at application startup)
DbProviderFactories.RegisterFactory("Microsoft.Spark.Livy.AdoNet", LivyProviderFactory.Instance);
// Create connection using factory
var factory = DbProviderFactories.GetFactory("Microsoft.Spark.Livy.AdoNet");
using var connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
await connection.OpenAsync();
using var command = factory.CreateCommand();
command.Connection = connection;
command.CommandText = "SELECT * FROM employees LIMIT 5";
using var reader = await command.ExecuteReaderAsync();
// Process results...
Koppeling van gegevenstypen
Het stuurprogramma wijst Spark SQL-gegevenstypen toe aan .NET-typen:
| Spark SQL-type | .NET type | DbType |
|---|---|---|
| BOOLEAN | bool |
Boolean |
| TINYINT | sbyte |
SByte |
| SMALLINT | short |
Int16 |
| INT | int |
Int32 |
| BIGINT | long |
Int64 |
| FLOAT | float |
Enkel |
| Dubbel | double |
Dubbel |
| DECIMAL(p,s) | decimal |
Decimaal |
| STRING | string |
Snaar / Touwtje |
| VARCHAR(n) | string |
Snaar / Touwtje |
| CHAR(n) | string |
Snaar / Touwtje |
| BINARY | byte[] |
Binary |
| DATE | DateTime |
Datum |
| TIMESTAMP | DateTime |
Datum/tijd |
| ARRAY<T> |
T[] of string (JSON) |
Object |
| MAP<K,V> |
Dictionary<K,V> of string (JSON) |
Object |
| Structuur |
object of string (JSON) |
Object |
Werken met complexe typen
Complexe typen (MATRIX, MAP, STRUCT) worden standaard geretourneerd als JSON-tekenreeksen:
using System.Text.Json;
using System.Collections.Generic;
using var command = connection.CreateCommand();
command.CommandText = "SELECT array_column, map_column, struct_column FROM complex_table LIMIT 1";
using var reader = await command.ExecuteReaderAsync();
if (await reader.ReadAsync())
{
// Complex types returned as JSON strings
string arrayJson = reader.GetString(0); // e.g., "[1, 2, 3]"
string mapJson = reader.GetString(1); // e.g., "{\"key\": \"value\"}"
string structJson = reader.GetString(2); // e.g., "{\"field1\": 1, \"field2\": \"text\"}"
// Parse with System.Text.Json
var array = JsonSerializer.Deserialize<int[]>(arrayJson);
var map = JsonSerializer.Deserialize<Dictionary<string, string>>(mapJson);
}
Troubleshooting
Deze sectie bevat richtlijnen voor het oplossen van veelvoorkomende problemen die kunnen optreden bij het gebruik van het Microsoft ADO.NET-stuurprogramma voor Microsoft Fabric Data Engineering.
Veelvoorkomende problemen
In de volgende secties worden veelvoorkomende problemen en hun oplossingen beschreven:
Verbindingsfouten
Probleem: Kan geen verbinding maken met Microsoft Fabric
Oplossingen:
- Controleer
FabricWorkspaceIDenFabricLakehouseIDzijn juiste GUID's - Azure CLI-verificatie controleren:
az account show - Zorg ervoor dat u over de juiste Fabric werkruimtemachtigingen beschikt
- Controleer de netwerkverbinding met
api.fabric.microsoft.com
Authenticatiefouten
Probleem: verificatie mislukt met Azure CLI
Oplossingen:
- Voer
az loginuit om referentiegegevens te vernieuwen - Controleer de juiste tenant:
az account set --subscription <subscription-id> - Controleer de geldigheid van het token:
az account get-access-token --resource https://api.fabric.microsoft.com
Querytime-outs
Probleem: Time-outs van query's in grote datasets
Oplossingen:
- Time-out van query verhogen:
LivyStatementTimeoutSeconds=300 - Gebruik
LIMITclausule om de resultaatgrootte tijdens de ontwikkeling te beperken - Zorg ervoor dat het Spark-cluster voldoende resources heeft
Time-out voor het maken van sessies
Probleem: Er treedt een time-out op voor de verbinding tijdens het maken van een sessie
Oplossingen:
- Time-out van sessie verhogen:
LivySessionTimeoutSeconds=120 - Beschikbaarheid van Fabric capaciteit controleren
- Controleren of de werkruimte geen sessielimieten heeft bereikt
Logboekregistratie inschakelen
Bij het oplossen van problemen kan het inschakelen van gedetailleerde logboekregistratie u helpen bij het identificeren van de hoofdoorzaak van problemen. U kunt logboekregistratie via de verbindingsreeks of programmatisch inschakelen.
Gedetailleerde logboekregistratie inschakelen via verbindingsreeks:
LogLevel=Debug
Ofwel programmeer een configuratie:
using Microsoft.Extensions.Logging;
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole();
builder.SetMinimumLevel(LogLevel.Debug);
});
// Logging is automatically integrated with the connection
Logboekniveaus:
-
Trace: De meeste uitgebreide, omvat alle API-aanroepen -
Debug: Gedetailleerde informatie over foutopsporing -
Information: Algemene informatie (standaard) -
Warning: alleen waarschuwingen -
Error: alleen fouten