Запрос ExecuteReader с двумя внутренними ExecuteNonQuery - PullRequest
1 голос
/ 29 марта 2019

У меня проблема с некоторыми запросами от c # до sql.Мне нужно иметь запрос executeReare и внутри него a if else, который позволяет мне выбирать между двумя запросами вставок.Я вызываю небольшую внешнюю программу (с URL-адресом, собранным в БД), который позволяет мне выбирать между 1 и 2, если выбрана 1 (pass) else (fail).Я не могу этого сделать, потому что отладка дает мне: «Команда еще связана с открытым DataReader, который должен быть закрыт».Я не знаю, что попробовать больше.

private void btnSTART_Click(object sender, RoutedEventArgs e)
{
  sqliteCon.Open();
  if (sqliteCon.State == System.Data.ConnectionState.Open)
  {
    string path = null;//estrazione1
    SqlCommand cmd = new SqlCommand("select nomeI  FROM tabL where selection=1", sqliteCon);
    SqlDataReader nomeIRdr = null;//estrazione2

                    //qui                  
    var scriptsToRun = new List<string>();

    using (nomeIRdr = cmd.ExecuteReader())
    {
      while (nomeIRdr.Read())//estrazione4
      {
        path = nomeIRdr["nomeI"].ToString();//estrazione5

        Process MyProc = Process.Start(path);//permette la run del path contenuto nel db
        MyProc.WaitForExit();
        var exitCode = MyProc.ExitCode;

        if (exitCode == 1)
        {
          scriptsToRun.Add("insert into tabL resItem values 'PASS'");
        }
        else
        {
          scriptsToRun.Add("insert into tabL resItem values 'FAIL'");
        }
        sqliteCon.Close();
      }

    }

    foreach (var script in scriptsToRun)
    {
      SqlCommand cmd1 = new SqlCommand(script, sqliteCon);
      cmd1.ExecuteNonQuery();
    }

  }

}

1 Ответ

1 голос
/ 29 марта 2019

Не разделяйте одиночное соединение и втисните все в одну процедуру.Пожалуйста, сохраняйте ваш код simple .

  1. Создание (и удаление) подключения при каждом запросе СУБД
  2. Методы извлечения

Код:

Сбор результатов выполнения процесса и возврата выполнения:

// Item1 - path
// Item2 - true in succeed 
private List<Tuple<string, bool>> ExecuteResults() {
  List<Tuple<string, bool>> result = new List<Tuple<string, bool>>();

  using (var con = new SqlConnection(ConnectionStringHere)) {
    con.Open();

    string sql = 
      @"select nomeItem 
          from tabList 
         where selection = 1";

    using (SqlCommand cmd = new SqlCommand(sql, con)) {
      using (var reader = cmd.ExecuteReader()) {
        while (reader.Read()) {
          string path = Convert.ToString(reader[0]);

          using (Process process = Process.Start(path)) {
            process.WaitForExit();

            result.Add(Tuple.Create(path, process.ExitCode == 1)); 
          }
        }
      } 
    }
  }

  return result;
}

Сохранение results в СУБД

private void ApplyExecuteResults(IEnumerable<Tuple<string, bool>> results) {
  using (var con = new SqlConnection(ConnectionStringHere)) {
    con.Open();

    string sql = 
      @"update tabList 
           set resItem = @prm_resItem
         where nomeItem = @prm_nomeItem";

    using (SqlCommand cmd = new SqlCommand(sql, con)) {
      cmd.Parameters.Add("@prm_nomeItem", SqlDbType.VarChar);
      cmd.Parameters.Add("@prm_resItem", SqlDbType.VarChar);

      foreach (var item in results) {
        cmd.Parameters[0].Value = item.Item1; 
        cmd.Parameters[1].Value = item.Item2 ? "PASS" : "FAIL"; 

        cmd.ExecuteNonQuery();
      }
    } 
  }
}

Наконец, объедините обе подпрограммы:

private void btnSTART_Click(object sender, RoutedEventArgs e) {
  ApplyExecuteResults(ExecuteResults());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...