Как иметь два executeNonQuery внутри ExecuteReader - PullRequest
1 голос
/ 28 марта 2019

У меня есть этот запрос, ExecuteReader, и внутри него два ExecuteNonQuery. Это ничего не делает. Я попытался поместить два executeNonQuery в cmd1 и cmd2, но это не позволяет, потому что executeReader открыт. Какие шаги мне нужно предпринять, чтобы исправить эту проблему?

   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
    nomeIRdr = cmd.ExecuteReader();//estrazione3
    while (nomeIRdr.Read())//estrazione4
    {
      path = nomeIRdr["nomeI"].ToString();//estrazione5

    }
    using (nomeIRdr = cmd.ExecuteReader())//cmd.ExecuteReader() gives me the error cmd doesn't exist in the current 
    {
      sqliteCon.Open();
      if (sqliteCon.State == System.Data.ConnectionState.Open)
      {
        Process MyProc = Process.Start(path);//permette la run del path contenuto nel db
        MyProc.WaitForExit();
        var exitCode = MyProc.ExitCode;

        if (exitCode == 1)
        {
          SqlCommand cmd1 = new SqlCommand("insert into tabL resI values 'PASS'", sqliteCon);
          cmd1.ExecuteNonQuery();
        }
        else
        {
          SqlCommand cmd2 = new SqlCommand("insert into tabL resI values 'FAIL'", sqliteCon);
          cmd2.ExecuteNonQuery();
        }
      }
      sqliteCon.Close();
    }
    MessageBox.Show("Items Started"); 
  }
  sqliteCon.Close();

}

Если решение состоит в том, что это не работает, то же самое ошибка начала этого вопроса

1 Ответ

2 голосов
/ 28 марта 2019

SqlDataReader , который ExecuteReader возвращает, является серверным курсором, это означает, что соединение будет использоваться исключительно читателем, пока вы его не закроете. Таким образом, вы не сможете выполнить любую другую команду, используя то же соединение.

Что бы я сделал, сохранив в списке то, что вы должны сделать (эти вставки), и после того, как считыватель закроется, выполните все операции, которые вам нужно выполнить.

Вы можете использовать блок using, чтобы считыватель был закрыт и утилизирован. После этого вы можете повторно использовать то же соединение.

using (var nomeItemRdr = cmd.ExecuteReader())
{
} 
//You can reuse your connection here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...