Share via


Creación de una aplicación para ejecutar consultas básicas

En este artículo aprenderá a:

Requisitos previos

Configure el entorno de desarrollo para usar la biblioteca cliente de Kusto.

Ejecución de una consulta básica y procesamiento de los resultados

En el IDE o editor de texto que prefiera, cree un proyecto o un archivo denominado consulta básica con la convención adecuada para su idioma preferido. Después agregue el siguiente código:

  1. Cree una aplicación cliente que se conecte al clúster de ayuda.

    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. Defina la base de datos y la consulta que se va a ejecutar. La consulta devuelve la fecha, el estado y el daño total relacionado con el tornado en el que el daño total superó los 100 millones de dólares.

    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. Ejecute la consulta e imprima el resultado.

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

El código completo debe tener este aspecto:

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

Ejecutar la aplicación

En un shell de comandos, use el siguiente comando para ejecutar la aplicación:

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

Debería ver un resultado similar al siguiente:

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 $

Uso de posiciones ordinales para acceder a los valores de columna

Cuando se conoce el orden de las columnas de un resultado de consulta, es más eficaz tener acceso a los valores de las columnas por su posición ordinal en el conjunto de resultados que por su nombre de columna. Opcionalmente, en tiempo de ejecución puede usar un método de biblioteca para determinar un ordinal de columna a partir de su nombre de columna.

Nota

Puede controlar la presencia y el orden de las columnas en un resultado de consulta mediante los project operadores o project-away .

Por ejemplo, puede modificar el código anterior para tener acceso a los valores de las StartTimecolumnas , Statey DailyDamage por sus posiciones ordinales en el conjunto de resultados:

En C#, solo puede acceder a los valores de las columnas por sus posiciones ordinales en el conjunto de resultados. No puede usar los nombres de columna; por lo tanto, el código sigue siendo el mismo.

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

Personalización del comportamiento de la consulta con propiedades de solicitud de cliente

Puede personalizar el comportamiento de una consulta estableciendo las propiedades de solicitud de cliente. Para obtener más información sobre las opciones disponibles, consulte propiedades de solicitud de cliente.

Por ejemplo, puede reemplazar la kusto_client.execute_query llamada en el código anterior para pasar un identificador de solicitud personalizado y establecer el tiempo de espera de la consulta en 1 minuto. Para usar las propiedades de solicitud de cliente, debe importar la ClientRequestProperties clase .

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

Uso de parámetros de consulta para proteger la entrada del usuario

Los parámetros de consulta son importantes para mantener la seguridad y la protección de los datos. Protege de posibles actores malintencionados que pueden intentar obtener acceso no autorizado a los datos o dañarlos. Para obtener más información sobre las consultas parametrizadas, vea Instrucción de declaración de parámetros de consulta.

Por ejemplo, puede modificar el código anterior para pasar el valor EventType y el valor mínimo DailyDamage como parámetros a la consulta. Para usar parámetros:

  1. Declaración de los parámetros en el texto de la consulta
  2. Sustituya los valores de propiedad en el texto de la consulta por los nombres de parámetro
  3. Establecer los valores de parámetro en las propiedades de solicitud de cliente que se pasan al método 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));
  }
}

El código completo que usa posiciones ordinales para tener acceso a los valores de columna y los parámetros debe tener este aspecto:

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

Debería ver un resultado similar al siguiente:

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

Paso siguiente