Асин c Звони в Снежинку от. Net - PullRequest
0 голосов
/ 30 апреля 2020

Есть ли способ асинхронно вызвать хранимую процедуру Snowflake из. Net? Я запускаю приложение. Net Core API с использованием драйвера Snowflake Do tNet. По сути, мне нужно иметь возможность использовать conn.OpenAsync и cmd.ExecuteNonQueryAsync, как вы это обычно делаете с SQL сервером, но это кажется невозможным.

executeResults.SessionId =RunNonQueryAsync(connectionString, command).Result;

static async Task<String> RunNonQueryAsync(string execConnection, string execCommand)
{
   String sessionId = null;
   using (IDbConnection conn = new SnowflakeDbConnection())
   {
      conn.ConnectionString = execConnection;
      conn.Open();

      // Get Session Information
      IDbCommand cmd2 = conn.CreateCommand();
      cmd2.CommandText = "SELECT CURRENT_SESSION() as SESSION_ID";
      IDataReader rdr2 = cmd2.ExecuteReader();
      while (rdr2.Read())
      {
         sessionId = rdr2.GetValue(0).ToString();
      }

      Task taskA = new Task(() =>
      {
         using (IDbConnection cn = new SnowflakeDbConnection())
         {
            cn.ConnectionString = execConnection;
            cn.Open();
            IDbCommand cm = conn.CreateCommand();
            cm.CommandText = "call StoredProcedureThatTakes5MinutesToRun";

            cn.Close();
         }
      });
      taskA.Start();

    }
    return sessionId;
}

1 Ответ

0 голосов
/ 02 мая 2020

Мой браузер отправляет HTTP-запрос GET, который API-интерфейс Do tNet получает вместе со свойствами [SQL Тип: «NonQuery» И StatementText: «Call StoredProcX»].

Это звучит как кошмар абсолютной безопасности. SQL Инъекции достаточно плохие, но это, по сути, помещение центрального венозного катетера в вашу базу данных.

В лучшем случае я бы разрешил посылать с запросом простое перечисление, целое или строковое значение. Тот, который затем передается через оператор switch / case. Может быть, подается в Dictionary<String, Action>, если это работает лучше. Случай или действие затем выполнят всю работу по отправке запросов.

Оттуда на самом деле просто выполняется две вещи в одном и том же соединении:

     using (IDbConnection cn = new SnowflakeDbConnection())
     {
        cn.Open();

        //Build command 1
        //Execute command 1
        //Do stuff with results of command 1

        //Build command 2
        //Execute command 2
        //Do stuff with results of command 2

        //Can propably be omited, as Dispose usually includes close. But we are talking about some 3rd party code, that might not be tested that well
        cn.Close();
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...