ExecuteReader查询,其中包含两个ExecuteNonQuery

时间:2019-03-29 07:19:08

标签: c# sql wpf

从c#到sql的某些查询出现问题。我需要一个查询executeReare,在它里面还有一个if,它允许我在两个插入查询之间进行选择。我正在调用一个小的外部程序(URL收集到数据库中),如果选择了1(通过)else(失败),该程序可以在1和2之间进行选择。我不能这样做,因为调试给了我“命令尚未与打开的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 个答案:

答案 0 :(得分:1)

不要共享 single 连接,并将所有内容塞入 single 例程中。请保持您的代码简单

  1. 每当查询RDBMS时创建(和处置)连接
  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;
}

在RDBMS中保存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());
}