หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
สำคัญ
คุณลักษณะนี้อยู่ใน แสดงตัวอย่าง
ADO.NET เป็นเทคโนโลยีการเข้าถึงข้อมูลที่นํามาใช้อย่างแพร่หลายในระบบนิเวศ .NET ที่ช่วยให้แอปพลิเคชันสามารถเชื่อมต่อและทํางานกับข้อมูลจากฐานข้อมูลและแพลตฟอร์มข้อมูลขนาดใหญ่ได้
ไดรเวอร์ Microsoft ADO.NET สําหรับ Fabric Data Engineering ช่วยให้คุณเชื่อมต่อ สืบค้น และจัดการงาน Spark ใน Fabric ด้วยความน่าเชื่อถือและความเรียบง่ายของรูปแบบมาตรฐาน ADO.NET ไดรเวอร์นี้สร้างขึ้นบน Fabric Livy APIs เพื่อให้การเชื่อมต่อ Spark SQL ที่ปลอดภัยและยืดหยุ่นกับแอปพลิเคชัน .NET ของคุณโดยใช้ , DbConnection, และDbCommandนามธรรมที่คุ้นเคยDbDataReader
คุณลักษณะสำคัญ
-
สอดคล้องกับ ADO.NET: การใช้งานนามธรรม ADO.NET อย่างเต็มรูปแบบ (
DbConnection, ,DbCommand,DbDataReader,DbParameter)DbProviderFactory - การรับรองความถูกต้องของ Microsoft Entra ID: โฟลว์การรับรองความถูกต้องหลายรายการ รวมถึง Azure CLI, เบราว์เซอร์แบบโต้ตอบ, ข้อมูลประจําตัวไคลเอ็นต์, ตามใบรับรอง และการรับรองความถูกต้องของโทเค็นการเข้าถึง
- รองรับการสืบค้นแบบเนทีฟของ Spark SQL: การดําเนินการโดยตรงของคําสั่ง Spark SQL ด้วยแบบสอบถามที่มีพารามิเตอร์
- รองรับประเภทข้อมูลที่ครอบคลุม: รองรับประเภทข้อมูล Spark SQL ทั้งหมดรวมถึงประเภทที่ซับซ้อน (ARRAY, MAP, STRUCT)
- Connection Pooling: การจัดการพูลการเชื่อมต่อในตัวเพื่อประสิทธิภาพที่ดีขึ้น
- การนําเซสชันกลับมาใช้ใหม่: การจัดการเซสชัน Spark ที่มีประสิทธิภาพเพื่อลดเวลาแฝงในการเริ่มต้น
- Async Prefetch: การโหลดข้อมูลพื้นหลังเพื่อประสิทธิภาพที่ดีขึ้นด้วยชุดผลลัพธ์ขนาดใหญ่
- เชื่อมต่อใหม่อัตโนมัติ: การกู้คืนเซสชันอัตโนมัติหลังจากการเชื่อมต่อล้มเหลว
Note
ใน Apache Spark แบบโอเพ่นซอร์ส ฐานข้อมูลและสคีมาจะถูกใช้เหมือนกัน ตัวอย่างเช่น การรันSHOW SCHEMASหรือSHOW DATABASESในสมุดบันทึก Fabric จะได้ผลลัพธ์เดียวกัน — คือรายการสคีมาทั้งหมดในบ้านพักริมทะเลสาบ
ข้อกำหนดเบื้องต้น
ก่อนใช้ไดรเวอร์ Microsoft ADO.NET สําหรับ Fabric Data Engineering โปรดตรวจสอบให้แน่ใจว่าคุณมี:
- รันไทม์ .NET: .NET 8.0 หรือใหม่กว่า
- Fabric Access: การเข้าถึงพื้นที่ทํางาน Fabric ด้วยความสามารถด้านวิศวกรรมข้อมูล
- ข้อมูลประจําตัว Azure Entra ID: ข้อมูลประจําตัวที่เหมาะสมสําหรับการรับรองความถูกต้อง
- รหัสพื้นที่ทํางานและเลคเฮาส์: ตัวระบุ GUID สําหรับพื้นที่ทํางาน Fabric และเลคเฮาส์ของคุณ
- Azure CLI (ไม่บังคับ): จําเป็นสําหรับวิธีการรับรองความถูกต้องของ Azure CLI
ดาวน์โหลด รวม อ้างอิง และตรวจสอบ
ดาวน์โหลดแพ็คเกจ NuGet
ไดรเวอร์ Microsoft ADO.NET สําหรับ Fabric Data Engineering เวอร์ชัน 1.0.0 อยู่ในโหมดพรีวิวสาธารณะ ซึ่งคุณสามารถดาวน์โหลดได้จากลิงก์ศูนย์ดาวน์โหลดเหล่านี้
- ดาวน์โหลดไดรเวอร์ Microsoft ADO.NET สําหรับ Fabric Data Engineering (zip)
- ดาวน์โหลดไดรเวอร์ Microsoft ADO.NET สําหรับ Fabric Data Engineering (tar)
อ้างอิงแพ็คเกจ NuGet ในโครงการของคุณ
รวมแพ็คเกจ NuGet ที่ดาวน์โหลดมาในโครงการของคุณและเพิ่มการอ้างอิงของแพ็คเกจไปยังไฟล์โครงการของคุณ:
<ItemGroup>
<PackageReference Include="Microsoft.Spark.Livy.AdoNet" Version="1.0.0" />
</ItemGroup>
ตรวจสอบการติดตั้ง
หลังจากรวมและอ้างอิงแล้ว ให้ตรวจสอบว่าแพ็คเกจพร้อมใช้งานในโครงการของคุณ:
using Microsoft.Spark.Livy.AdoNet;
// Verify the provider is registered
var factory = LivyProviderFactory.Instance;
Console.WriteLine($"Provider: {factory.GetType().Name}");
ตัวอย่างการเริ่มต้นอย่างรวดเร็ว
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));
}
รูปแบบสตริงการเชื่อมต่อ
รูปแบบพื้นฐาน
โปรแกรมควบคุม Microsoft ADO.NET ใช้รูปแบบสตริงการเชื่อมต่อ ADO.NET มาตรฐาน:
Parameter1=Value1;Parameter2=Value2;...
พารามิเตอร์ที่ต้องการ
| พารามิเตอร์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
Server |
ปลายทาง API ของ Fabric | https://api.fabric.microsoft.com/v1 |
SparkServerType |
ตัวระบุประเภทเซิร์ฟเวอร์ | Fabric |
FabricWorkspaceID |
ตัวระบุพื้นที่ทํางาน Fabric (GUID) | <workspace-id> |
FabricLakehouseID |
รหัสบ้านพักริมทะเลสาบ Fabric (GUID) | <lakehouse-id> |
AuthFlow |
วิธีการรับรองความถูกต้อง |
AzureCli, BrowserBased, ClientSecretCredential, ClientCertificateCredential, AuthAccessTokenFileToken |
พารามิเตอร์เพิ่มเติม
การตั้งค่าการเชื่อมต่อ
| พารามิเตอร์ | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
LivySessionTimeoutSeconds |
เลขจำนวนเต็ม | 60 |
เวลาเป็นวินาทีเพื่อรอการสร้างเซสชัน |
LivyStatementTimeoutSeconds |
เลขจำนวนเต็ม | 600 |
เวลาเป็นวินาทีเพื่อรอการดําเนินการคําสั่ง |
SessionName |
สตริง | (อัตโนมัติ) | ชื่อที่กําหนดเองสําหรับเซสชัน Spark |
AutoReconnect |
แบบบูลีน | false |
เปิดใช้งานการกู้คืนเซสชันอัตโนมัติ |
การตั้งค่าพูลการเชื่อมต่อ
| พารามิเตอร์ | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
ConnectionPoolEnabled |
แบบบูลีน | true |
เปิดใช้งานการรวมการเชื่อมต่อ |
MinPoolSize |
เลขจำนวนเต็ม | 1 |
การเชื่อมต่อขั้นต่ําในพูล |
MaxPoolSize |
เลขจำนวนเต็ม | 20 |
การเชื่อมต่อสูงสุดในพูล |
ConnectionMaxIdleTimeMs |
เลขจำนวนเต็ม | 1800000 |
เวลาว่างสูงสุดก่อนนําการเชื่อมต่อกลับมาใช้ใหม่ (30 นาที) |
MaxLifetimeMs |
เลขจำนวนเต็ม | 3600000 |
อายุการใช้งานสูงสุดของการเชื่อมต่อแบบรวม (60 นาที) |
ValidateConnections |
แบบบูลีน | true |
ตรวจสอบการเชื่อมต่อก่อนใช้งาน |
ValidationTimeoutMs |
เลขจำนวนเต็ม | 5000 |
หมดเวลาสําหรับการตรวจสอบการเชื่อมต่อ |
การตั้งค่าการบันทึก
| พารามิเตอร์ | ประเภท | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
LogLevel |
สตริง | Information |
ระดับบันทึก: Trace, Debug, , Information, WarningError |
LogFilePath |
สตริง | (ไม่มี) | เส้นทางสําหรับการบันทึกตามไฟล์ |
Note
นามแฝงข้ามไดรเวอร์: โปรแกรมควบคุมยอมรับชื่อคุณสมบัติ JDBC และ ODBC นอกเหนือจากชื่อ ADO.NET ดั้งเดิม (เช่น WorkspaceId แมปไปยัง แมปไปยัง FabricWorkspaceIDแม LakehouseId ปไปยัง FabricLakehouseID) ชื่อพร็อพเพอร์ตี้ทั้งหมดไม่คํานึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
ตัวอย่างสตริงการเชื่อมต่อ
การเชื่อมต่อพื้นฐาน (การรับรองความถูกต้อง Azure CLI)
Server=https://api.fabric.microsoft.com/v1;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli
ด้วยตัวเลือกการรวมการเชื่อมต่อ
Server=https://api.fabric.microsoft.com/v1;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;ConnectionPoolEnabled=true;MinPoolSize=2;MaxPoolSize=10
ด้วยการเชื่อมต่อใหม่และการบันทึกอัตโนมัติ
Server=https://api.fabric.microsoft.com/v1;SparkServerType=Fabric;FabricWorkspaceID=<workspace-id>;FabricLakehouseID=<lakehouse-id>;AuthFlow=AzureCli;AutoReconnect=true;LogLevel=Debug
การพิสูจน์ตัวตน
โปรแกรมควบคุม Microsoft ADO.NET สนับสนุนวิธีการรับรองความถูกต้องหลายวิธีผ่าน Microsoft Entra ID (เดิมคือ Azure Active Directory) การรับรองความถูกต้องถูกกําหนดค่าโดยใช้ AuthFlow พารามิเตอร์ในสตริงการเชื่อมต่อ
วิธีการรับรองความถูกต้อง
| ค่า AuthFlow | คำอธิบาย | ดีที่สุดสำหรับ |
|---|---|---|
AzureCli |
ใช้ข้อมูลประจําตัวที่แคชไว้ของ Azure CLI | การพัฒนาและการทดสอบ |
BrowserBased |
การรับรองความถูกต้องบนเบราว์เซอร์แบบโต้ตอบ | แอปพลิเคชันที่ผู้ใช้ต้องเผชิญ |
ClientSecretCredential |
บริการหลักพร้อมข้อมูลลับไคลเอ็นต์ | บริการอัตโนมัติ งานเบื้องหลัง |
ClientCertificateCredential |
บริการหลักพร้อมใบรับรอง | แอปพลิเคชันขององค์กร |
AuthAccessToken |
โทเค็นการเข้าถึงผู้ถือที่ได้มาล่วงหน้า | สถานการณ์การรับรองความถูกต้องแบบกําหนดเอง |
การรับรองความถูกต้องของ Azure CLI
ดีที่สุดสําหรับ: การพัฒนาและการทดสอบ
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();
ข้อกําหนดเบื้องต้น:
- ติดตั้ง Azure CLI:
az --version - เข้าสู่ระบบ:
az login
การรับรองความถูกต้องของเบราว์เซอร์แบบโต้ตอบ
ดีที่สุดสําหรับ: แอปพลิเคชันที่ต้องเผชิญหน้ากับผู้ใช้
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
ลักษณะการทํางาน:
- เปิดหน้าต่างเบราว์เซอร์สําหรับการตรวจสอบผู้ใช้
- ข้อมูลประจําตัวจะถูกแคชสําหรับการเชื่อมต่อที่ตามมา
การรับรองความถูกต้องของข้อมูลประจําตัวไคลเอ็นต์ (บริการหลัก)
ดีที่สุดสําหรับ: บริการอัตโนมัติและงานเบื้องหลัง
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();
พารามิเตอร์ที่จําเป็น:
-
AuthTenantID: รหัสผู้เช่า Azure -
AuthClientID: รหัสแอปพลิเคชัน (ไคลเอ็นต์) จาก Microsoft Entra ID -
AuthClientSecret: ข้อมูลลับของไคลเอ็นต์จาก Microsoft Entra ID
การรับรองความถูกต้องตามใบรับรอง
ดีที่สุดสําหรับ: แอปพลิเคชันระดับองค์กรที่ต้องการการรับรองความถูกต้องตามใบรับรอง
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();
พารามิเตอร์ที่จําเป็น:
-
AuthTenantID: รหัสผู้เช่า Azure -
AuthClientID: รหัสแอปพลิเคชัน (ไคลเอ็นต์) -
AuthCertificatePath: เส้นทางไปยังไฟล์ใบรับรอง PFX/PKCS12 -
AuthCertificatePassword: รหัสผ่านใบรับรอง
การรับรองความถูกต้องของโทเค็นการเข้าถึง
ดีที่สุดสําหรับ: สถานการณ์การรับรองความถูกต้องแบบกําหนดเอง
// 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();
Note
เราขอแนะนําอย่างยิ่งให้หลีกเลี่ยงข้อมูลประจําตัวแบบฮาร์ดโค้ด เช่น รหัสผ่าน คีย์ ความลับ โทเค็น หรือใบรับรองในโค้ดของคุณ ให้ใช้ Azure Key Vault เพื่อจัดเก็บค่าเหล่านี้อย่างปลอดภัยและดึงข้อมูลในขณะรันไทม์แทน
ตัวอย่างการใช้
การเชื่อมต่อและแบบสอบถามพื้นฐาน
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();
}
คิวรีแบบกําหนดพารามิเตอร์
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 สําหรับค่าเดียว
using var command = connection.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM customers";
var count = await command.ExecuteScalarAsync();
Console.WriteLine($"Total customers: {count}");
ExecuteNonQuery สําหรับการดําเนินการ DML
// 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)");
การทํางานกับชุดผลลัพธ์ขนาดใหญ่
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}");
การค้นพบสคีมา
// 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
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
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...
การแมปชนิดข้อมูล
ไดรเวอร์แมปชนิดข้อมูล Spark SQL กับชนิด .NET:
| ประเภท Spark SQL | ประเภท .NET | ประเภท Db |
|---|---|---|
| บูลีน | bool |
แบบบูลีน |
| จินินท์ | sbyte |
เอสไบต์ |
| SMALLINT | short |
Int16 |
| INT | int |
Int32 |
| บิ๊กอินต์ | long |
Int64 |
| ลอย | float |
โสด |
| คู่ | double |
ดับเบิ้ล |
| ทศนิยม (p,s) | decimal |
ทศนิยม |
| เชือก | string |
สตริง |
| วาร์ชาร์(n) | string |
สตริง |
| ชาร์(n) | string |
สตริง |
| ไบ นารี | byte[] |
Binary |
| วันที่ | DateTime |
วันที่ |
| ประทับเวลา | DateTime |
วันเวลา |
| อาร์เรย์<T> |
T[] หรือ string (JSON) |
วัตถุ |
| แผนที่<K,V> |
Dictionary<K,V> หรือ string (JSON) |
วัตถุ |
| โครงสร้าง |
object หรือ string (JSON) |
วัตถุ |
การทํางานกับประเภทที่ซับซ้อน
ประเภทที่ซับซ้อน (ARRAY, MAP, STRUCT) จะถูกส่งคืนเป็นสตริง JSON ตามค่าเริ่มต้น:
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);
}
แก้ไข ปัญหา
ส่วนนี้ให้คําแนะนําในการแก้ไขปัญหาทั่วไปที่คุณอาจพบเมื่อใช้งานไดรเวอร์ Microsoft ADO.NET สําหรับ Fabric Data Engineering
ปัญหาทั่วไป
ส่วนต่อไปนี้จะอธิบายปัญหาทั่วไปและวิธีแก้ไข:
การเชื่อมต่อล้มเหลว
ปัญหา: ไม่สามารถเชื่อมต่อกับ Fabric ได้
โซลูชัน:
- ตรวจสอบ
FabricWorkspaceIDและเป็นFabricLakehouseIDGUID ที่ถูกต้อง - ตรวจสอบการรับรองความถูกต้อง Azure CLI:
az account show - ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์พื้นที่ทํางาน Fabric ที่เหมาะสม
- ตรวจสอบการเชื่อมต่อเครือข่ายเพื่อ
api.fabric.microsoft.com
ข้อผิดพลาดในการรับรองความถูกต้อง
ปัญหา: การรับรองความถูกต้องล้มเหลวด้วย Azure CLI
โซลูชัน:
- เรียกใช้
az loginเพื่อรีเฟรชข้อมูลประจําตัว - ตรวจสอบผู้เช่าที่ถูกต้อง:
az account set --subscription <subscription-id> - ตรวจสอบความถูกต้องของโทเค็น:
az account get-access-token --resource https://api.fabric.microsoft.com
หมดเวลาคิวรี
ปัญหา: การสืบค้นหมดเวลาบนตารางขนาดใหญ่
โซลูชัน:
- เพิ่มการหมดเวลาของใบแจ้งยอด:
LivyStatementTimeoutSeconds=300 - ใช้
LIMITส่วนคําสั่งเพื่อจํากัดขนาดผลลัพธ์ระหว่างการพัฒนา - ตรวจสอบให้แน่ใจว่าคลัสเตอร์ Spark มีทรัพยากรเพียงพอ
หมดเวลาการสร้างเซสชัน
ปัญหา: การเชื่อมต่อหมดเวลาระหว่างการสร้างเซสชัน
โซลูชัน:
- เพิ่มการหมดเวลาของเซสชัน:
LivySessionTimeoutSeconds=120 - ตรวจสอบความพร้อมใช้งานของความจุ Fabric
- ตรวจสอบว่าพื้นที่ทํางานยังไม่ถึงขีดจํากัดเซสชัน
เปิดใช้งานการบันทึก
เมื่อแก้ไขปัญหา การเปิดใช้งานการบันทึกโดยละเอียดสามารถช่วยคุณระบุสาเหตุของปัญหาได้ คุณสามารถเปิดใช้งานการบันทึกผ่านสตริงการเชื่อมต่อหรือโดยทางโปรแกรม
วิธีเปิดใช้งานการบันทึกโดยละเอียดผ่านสตริงการเชื่อมต่อ:
LogLevel=Debug
หรือกําหนดค่าโดยทางโปรแกรม:
using Microsoft.Extensions.Logging;
var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddConsole();
builder.SetMinimumLevel(LogLevel.Debug);
});
// Logging is automatically integrated with the connection
ระดับบันทึก:
-
Trace: ฟุ่มเฟือยที่สุด รวมถึงการเรียก API ทั้งหมด -
Debug: ข้อมูลการดีบักโดยละเอียด -
Information: ข้อมูลทั่วไป (ค่าเริ่มต้น) -
Warning: คําเตือนเท่านั้น -
Error: ข้อผิดพลาดเท่านั้น