Freigeben über


Erstellen einer App zum Ausführen grundlegender Abfragen

Wechseln Sie Dienste mit der Dropdownliste "Version". Weitere Informationen zur Navigation.
Gilt für: ✅ Microsoft Fabric ✅ Azure Data Explorer

In diesem Artikel erfahren Sie, wie Sie:

Voraussetzungen

Richten Sie Ihre Entwicklungsumgebung für die Verwendung der Kusto-Clientbibliothek ein.

Ausführen einer einfachen Abfrage und Verarbeiten der Ergebnisse

Erstellen Sie in Ihrer bevorzugten IDE oder im Text-Editor ein Projekt oder eine Datei mit dem Namen "Grundlegende Abfrage ", indem Sie die Konvention verwenden, die für Ihre bevorzugte Sprache geeignet ist. Fügen Sie dann den folgenden Code hinzu:

  1. Erstellen Sie eine Client-App, die eine Verbindung mit dem Hilfecluster herstellt.

    using Kusto.Data;
    using Kusto.Data.Net.Client;
    
    namespace BasicQuery {
      class BasicQuery {
        static void Main(string[] args) {
          var clusterUri = "https://help.kusto.windows.net/";
          var kcsb = new KustoConnectionStringBuilder(clusterUri)
              .WithAadUserPromptAuthentication();
    
          using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
          }
        }
      }
    }
    
  2. Definieren Sie die auszuführende Datenbank und Abfrage. Die Abfrage gibt das Datum, den Bundesstaat und die tornadobezogenen Gesamtschäden zurück, wenn der Gesamtschaden 100 Millionen Dollar überschritten hat.

    var database = "Samples";
    var query = @"StormEvents
                  | where EventType == 'Tornado'
                  | extend TotalDamage = DamageProperty + DamageCrops
                  | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                  | where DailyDamage > 100000000
                  | order by DailyDamage desc";
    
  3. Führen Sie die Abfrage aus, und drucken Sie das Ergebnis.

    using (var response = kustoClient.ExecuteQuery(database, query, null)) {
      int columnNoStartTime = response.GetOrdinal("StartTime");
      int columnNoState = response.GetOrdinal("State");
      int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
      Console.WriteLine("Daily tornado damages over 100,000,000$:");
    
      while (response.Read()) {
        Console.WriteLine("{0} - {1}, {2}",
          response.GetDateTime(columnNoStartTime),
          response.GetString(columnNoState),
          response.GetInt64(columnNoDailyDamage));
      }
    }
    

Der vollständige Code sollte wie folgt aussehen:

using Kusto.Data;
using Kusto.Data.Net.Client;

namespace BasicQuery {
  class BasicQuery {
    static void Main(string[] args) {
      string clusterUri = "https://help.kusto.windows.net/";
      var kcsb = new KustoConnectionStringBuilder(clusterUri)
          .WithAadUserPromptAuthentication();

      using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
        string database = "Samples";
        string query = @"StormEvents
                         | where EventType == 'Tornado'
                         | extend TotalDamage = DamageProperty + DamageCrops
                         | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                         | where DailyDamage > 100000000
                         | order by DailyDamage desc";

        using (var response = kustoClient.ExecuteQuery(database, query, null)) {
          int columnNoStartTime = response.GetOrdinal("StartTime");
          int columnNoState = response.GetOrdinal("State");
          int columnNoDailyDamage = response.GetOrdinal("DailyDamage");

          Console.WriteLine("Daily tornado damages over 100,000,000$:");

          while (response.Read()) {
            Console.WriteLine("{0} - {1}, {2}",
              response.GetDateTime(columnNoStartTime),
              response.GetString(columnNoState),
              response.GetInt64(columnNoDailyDamage));
          }
        }
      }
    }
  }
}

Ausführen der App

Verwenden Sie in einer Befehlsshell den folgenden Befehl, um Ihre App auszuführen:

# Change directory to the folder that contains the basic queries project
dotnet run .

Es sollte ein Ergebnis wie folgt angezeigt werden:

Daily damages tornado with damages over 100,000,000$:
2007-02-02 00:00:00+00:00 - FLORIDA , 270004000 $
2007-03-01 00:00:00+00:00 - ALABAMA , 266853000 $
2007-05-04 00:00:00+00:00 - KANSAS , 251625000 $
2007-03-01 00:00:00+00:00 - GEORGIA , 143688000 $

Verwenden Sie Ordnungspositionen, um auf Spaltenwerte zuzugreifen

Wenn die Reihenfolge der Spalten in einem Abfrageergebnis bekannt ist, ist es effizienter, auf die Werte der Spalten anhand ihrer Ordnungsposition im Resultset als nach dem Spaltennamen zuzugreifen. Optional können Sie zur Laufzeit eine Bibliotheksmethode verwenden, um ein Spalten-Ordinal anhand des Spaltennamens zu bestimmen.

Hinweis

Sie können das Vorhandensein und die Reihenfolge von Spalten in einem Abfrageergebnis mithilfe der project Operatoren oder project-away Operatoren steuern.

Sie können z. B. den vorherigen Code ändern, um auf die Werte von StartTime, Stateund DailyDamage Spalten anhand ihrer Ordnungspositionen im Resultset zuzugreifen:

In C# können Sie nur auf die Werte der Spalten anhand ihrer Ordnungspositionen im Resultset zugreifen. Sie können die Spaltennamen nicht verwenden. daher bleibt der Code gleich.

int columnNoStartTime = response.GetOrdinal("StartTime");
int columnNoState = response.GetOrdinal("State");
int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
Console.WriteLine("Daily tornado damages over 100,000,000$:");

while (response.Read()) {
  Console.WriteLine("{0} - {1}, {2}",
    response.GetDateTime(columnNoStartTime),
    response.GetString(columnNoState),
    response.GetInt64(columnNoDailyDamage));
}

Anpassen des Abfrageverhaltens mit Clientanforderungseigenschaften

Sie können das Verhalten einer Abfrage anpassen, indem Sie Clientanforderungseigenschaften festlegen. Weitere Informationen zu verfügbaren Optionen finden Sie unter Clientanforderungseigenschaften.

Sie können z. B. den kusto_client.execute_query Aufruf im vorherigen Code ersetzen, um eine benutzerdefinierte Anforderungs-ID zu übergeben und das Abfragetimeout auf 1 Minute festzulegen. Um die Clientanforderungseigenschaften zu verwenden, müssen Sie die ClientRequestProperties Klasse importieren.

using Kusto.Data.Common;

var crp = new ClientRequestProperties();
// Set a custom client request identifier
crp.ClientRequestId = "QueryDemo" + Guid.NewGuid().ToString();
// Set the query timeout to 1 minute
crp.SetOption(ClientRequestProperties.OptionServerTimeout, "1m");

using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
}

Verwenden von Abfrageparametern zum Schutz der Benutzereingabe

Abfrageparameter sind wichtig für die Aufrechterhaltung der Sicherheit und des Schutzes Ihrer Daten. Es schützt sie vor potenziellen böswilligen Akteuren, die versuchen können, nicht autorisierten Zugriff auf Ihre Daten zu erhalten oder zu beschädigen. Weitere Informationen zu parametrisierten Abfragen finden Sie unter Abfrageparameterdeklarationsanweisung.

Sie können beispielsweise den vorherigen Code so ändern, dass der EventType-Wert und der DailyDamage-Mindestwert als Parameter an die Abfrage übergeben werden. So verwenden Sie Parameter:

  1. Deklarieren der Parameter im Abfragetext
  2. Ersetzen Sie die Eigenschaftswerte im Abfragetext durch die Parameternamen.
  3. Festlegen der Parameterwerte in den Clientanforderungseigenschaften, die an die Execute-Methode übergeben werden
string query = @"declare query_parameters(event_type:string, daily_damage:int);
                  StormEvents
                  | where EventType == event_type
                  | extend TotalDamage = DamageProperty + DamageCrops
                  | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                  | where DailyDamage > daily_damage
                  | order by DailyDamage desc";

var crp = new ClientRequestProperties();
crp.SetParameter("event_type", "Flash Flood");
crp.SetParameter("daily_damage", 200000000.ToString());

using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
  int columnNoStartTime = response.GetOrdinal("StartTime");
  int columnNoState = response.GetOrdinal("State");
  int columnNoDailyDamage = response.GetOrdinal("DailyDamage");
  Console.WriteLine("Daily flash flood damages over 200,000,000$:");

  while (response.Read()) {
    Console.WriteLine("{0} - {1}, {2}",
      response.GetDateTime(columnNoStartTime),
      response.GetString(columnNoState),
      response.GetInt64(columnNoDailyDamage));
  }
}

Der vollständige Code mit Ordnungspositionen für den Zugriff auf Spaltenwerte und Parameter sollte wie folgt aussehen:

using Kusto.Data;
using Kusto.Data.Common;
using Kusto.Data.Net.Client;

namespace BasicQuery {
  class BasicQuery {
    static void Main(string[] args) {
      string clusterUri = "https://help.kusto.windows.net/";
      var kcsb = new KustoConnectionStringBuilder(clusterUri)
          .WithAadUserPromptAuthentication();

      using (var kustoClient = KustoClientFactory.CreateCslQueryProvider(kcsb)) {
        string database = "Samples";
        string query = @"declare query_parameters(event_type:string, daily_damage:int);
                         StormEvents
                         | where EventType == event_type
                         | extend TotalDamage = DamageProperty + DamageCrops
                         | summarize DailyDamage=sum(TotalDamage) by State, bin(StartTime, 1d)
                         | where DailyDamage > daily_damage
                         | order by DailyDamage desc";

        var crp = new ClientRequestProperties();
        crp.ClientRequestId = "QueryDemo" + Guid.NewGuid().ToString();
        crp.SetOption(ClientRequestProperties.OptionServerTimeout, "1m");
        crp.SetParameter("event_type", "Flash Flood");
        crp.SetParameter("daily_damage", 200000000.ToString());

        using (var response = kustoClient.ExecuteQuery(database, query, crp)) {
          int columnNoStartTime = response.GetOrdinal("StartTime");
          int columnNoState = response.GetOrdinal("State");
          int columnNoDailyDamage = response.GetOrdinal("DailyDamage");

          Console.WriteLine("Daily flash flood damages over 200,000,000$:");

          while (response.Read()) {
            Console.WriteLine("{0} - {1}, {2}",
              response.GetDateTime(columnNoStartTime),
              response.GetString(columnNoState),
              response.GetInt64(columnNoDailyDamage));
          }
        }
      }
    }
  }
}

Es sollte ein Ergebnis wie folgt angezeigt werden:

Daily flash flood damages over 200,000,000$:
2007-08-21 00:00:00+00:00 - OHIO , 253320000 $

Nächster Schritt