Lesen und Aufrufen
In dieser Einführung binden Sie den Client in eine .NET-Anwendung ein, lesen Zeilen einer Sicht und rufen eine Prozedur auf.
Voraussetzungen
- eine Konsolenanwendung mit Zielframework
net10.0und den PaketenWkl.Data.Gateway.ClientundMicrosoft.Extensions.Hosting - ein laufender Datendienst und seine Adresse
- eine Datenquelle im Dienst (im Beispiel
fachdaten) mit einer Sichtcontainer_typ(Spaltenid,bezeichnung) und einer Prozedurstamm.farbe_speichern; die Namen ersetzen Sie durch Ihre eigenen - ein Schlüssel mit einer Regel, die die Sicht lesen und die Prozedur ausführen darf
Schritte
Schlüssel bereitstellen. Der Schlüssel steht in einer Umgebungsvariablen des Prozesses, nie in einer Datei der Anwendung:
$env:WKL_GATEWAY_API_KEY = '<Schlüssel>'
Adresse eintragen. In
appsettings.jsonder Anwendung:{ "GatewayClient": { "BaseAddress": "https://daten.example.com/" } }Alle Einstellungen stehen in der Konfiguration.
Registrieren, lesen, aufrufen.
Program.cs:using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Wkl.Data.Gateway.Client; using Wkl.Data.Gateway.Contracts; var builder = Host.CreateApplicationBuilder(args); builder.Services.AddGatewayClient(builder.Configuration.GetSection(GatewayClientOptions.SectionName)); using var host = builder.Build(); // Starting the host validates the settings; a missing BaseAddress stops the application here await host.StartAsync(); var client = host.Services.GetRequiredService<IGatewayClient>(); // Read at most 100 rows whose description contains "DV", sorted by id, with the total count var page = await client.ReadAsync<ContainerTyp>(new GatewayQuery( new GatewayResource("fachdaten", GatewayResourceKind.View, "container_typ"), select: ["id", "bezeichnung"], filter: new GatewayFilter.Comparison("bezeichnung", GatewayComparisonOperator.Contains, "DV"), orderBy: [new GatewaySortField("id", GatewaySortDirection.Ascending)], top: 100, includeTotalCount: true)); foreach (var row in page.Rows) { Console.WriteLine($"{row.Id}: {row.Bezeichnung}"); } Console.WriteLine($"{page.Rows.Count} of {page.TotalCount} rows"); // Call the procedure with two arguments; null is sent as SQL NULL var result = await client.InvokeAsync<SpeicherErgebnis>(new GatewayRoutineRequest( new GatewayResource("fachdaten", GatewayResourceKind.Procedure, "stamm.farbe_speichern"), new Dictionary<string, object?> { ["ral_nummer"] = "RAL 5010", ["name_en"] = null })); Console.WriteLine(result.ReturnedRows && result.Rows.Count > 0 ? $"Saved as {result.Rows[0].Id}" : $"{result.AffectedRowCount} rows changed"); public sealed class ContainerTyp { public int Id { get; init; } public string Bezeichnung { get; init; } = string.Empty; } public sealed class SpeicherErgebnis { public int Id { get; init; } }
Spaltennamen werden in
snake_caseauf gewöhnliche Eigenschaftsnamen abgebildet:ZuletztGeaendertUtcliestzuletzt_geaendert_utc(verglichen ohne Rücksicht auf Groß- und Kleinschreibung). Ein Attribut je Eigenschaft ist dafür nicht nötig – bei einigen hundert Spalten wäre es vor allem eine Stelle, an der man sich vertippt. Die Abbildung trifft aber nur Spalten, die selbst insnake_caseheißen. Eine Spalte wieGeändertAmoderA&Bbraucht eine Eigenschaft mit[JsonPropertyName("…")]und genau diesem Namen; ohne sie bleibt die Eigenschaft still auf ihrem Vorgabewert, ohne Fehler. Inselect,filterundorderBynennen Sie eine Spalte mit Zeichen außerhalb von Buchstaben, Ziffern und_in der kodierten Form des Dienstes, etwaA_x0026_BfürA&B(siehe Programmierschnittstelle). Wer die Zeilen unverändert braucht, liest aufJsonElement.
Ergebnis
Die Anwendung gibt die gelesenen Zeilen aus und danach, wie viele der Filter insgesamt trifft
(page.TotalCount ist nur gesetzt, weil includeTotalCount gesetzt ist). Liefert die Prozedur
eine Ergebniszeile, nennt die letzte Ausgabe deren id, sonst die Zahl der geänderten Zeilen.
Nächste Schritte
- Grenzen und Eigenschaften – vor allem:
TotalCountdarf fehlen