Partager via


Créer une application pour exécuter des requêtes de base

Dans cet article, vous apprendrez comment :

Prérequis

Configurez votre environnement de développement pour utiliser la bibliothèque de client Kusto.

Exécuter une requête de base et traiter les résultats

Dans votre IDE ou éditeur de texte préféré, créez un projet ou un fichier nommé requête de base à l’aide de la convention appropriée pour votre langage préféré. Ensuite, ajoutez le code suivant :

  1. Créez une application cliente qui se connecte au cluster d’aide.

    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. Définissez la base de données et la requête à exécuter. La requête retourne la date, l’état et le total des dommages liés à la tornade où le dommage total a dépassé 100 millions de dollars.

    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. Exécutez la requête et imprimez le résultat.

    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));
      }
    }
    

Le code complet doit ressembler à ceci :

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));
          }
        }
      }
    }
  }
}

Exécuter l’application

Dans un interpréteur de commandes, utilisez la commande suivante pour exécuter votre application :

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

Vous devriez voir un résultat similaire à ce qui suit :

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 $

Utiliser des positions ordinales pour accéder aux valeurs de colonne

Lorsque l’ordre des colonnes dans un résultat de requête est connu, il est plus efficace d’accéder aux valeurs des colonnes par leur position ordinale dans le jeu de résultats que par leur nom de colonne. Si vous le souhaitez, au moment de l’exécution, vous pouvez utiliser une méthode de bibliothèque pour déterminer un ordinal de colonne à partir de son nom de colonne.

Notes

Vous pouvez contrôler la présence et l’ordre des colonnes dans un résultat de requête à l’aide des project opérateurs ou project-away .

Par exemple, vous pouvez modifier le code précédent pour accéder aux valeurs des colonnes , Stateet DailyDamage en fonction de StartTimeleur position ordinale dans le jeu de résultats :

En C#, vous pouvez accéder aux valeurs des colonnes uniquement par leur position ordinale dans le jeu de résultats. Vous ne pouvez pas utiliser les noms de colonnes ; par conséquent, le code reste le même.

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));
}

Personnaliser le comportement des requêtes avec les propriétés de requête du client

Vous pouvez personnaliser le comportement d’une requête en définissant les propriétés de requête du client. Pour plus d’informations sur les options disponibles, consultez Propriétés de la demande client.

Par exemple, vous pouvez remplacer l’appel kusto_client.execute_query dans le code précédent pour passer un ID de requête personnalisé et définir le délai d’expiration de la requête sur 1 minute. Pour utiliser les propriétés de requête du client, vous devez importer la ClientRequestProperties classe .

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)) {
}

Utiliser des paramètres de requête pour protéger les entrées utilisateur

Les paramètres de requête sont importants pour maintenir la sécurité et la protection de vos données. Il le protège contre les acteurs malveillants potentiels qui peuvent tenter d’obtenir un accès non autorisé à vos données ou d’endommager vos données. Pour plus d’informations sur les requêtes paramétrables, consultez Instruction de déclaration des paramètres de requête.

Par exemple, vous pouvez modifier le code précédent pour passer la valeur EventType et la valeur minimale DailyDamage en tant que paramètres à la requête. Pour utiliser des paramètres :

  1. Déclarer les paramètres dans le texte de la requête
  2. Remplacez les valeurs de propriété dans le texte de la requête par les noms de paramètres
  3. Définir les valeurs de paramètre dans les propriétés de requête du client passées à la méthode execute
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));
  }
}

Le code complet utilisant des positions ordinales pour accéder aux valeurs et paramètres de colonne doit ressembler à ceci :

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));
          }
        }
      }
    }
  }
}

Vous devriez voir un résultat similaire à ce qui suit :

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

Étape suivante