【问题标题】:How to have two executeNonQuery inside a ExecuteReader如何在 ExecuteReader 中有两个 executeNonQuery
【发布时间】:2019-03-28 13:40:19
【问题描述】:

我有这个查询,ExecuteReader,其中有两个ExecuteNonQuery。它什么也没做。我试图将两个executeNonQuery 放在cmd1cmd2 下,但它不允许这样做,因为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();

}

如果解决方法无效,则与该问题开头的错误相同

【问题讨论】:

  • 如果我没记错的话,你不能在没有处理阅读器的情况下使用连接,所以你必须为每个cmd1cmd2创建一个新的连接
  • 它是关于连接...要么使用不同的(一个连接用于 rader,另一个用于插入)或允许此连接具有多个活动结果集(如果它是 mssql)...当您使用时很容易找到会谷歌你的 excpetion ...
  • 当 o 运行代码时,只需 cmd 和 cmd1 什么都不做
  • ...无论如何...我根本不建议这样做...而是使用阅读器来填写一些列表...关闭阅读器...然后迭代列表并做这些事情跨度>

标签: c# sql wpf


【解决方案1】:

ExecuteReader 返回的SqlDataReader 是一个服务器游标,这意味着该连接将由阅读器独占使用,直到您关闭它。因此,您将无法使用同一连接运行任何其他命令。

我会做什么将你必须做的事情(那些插入)保存在一个列表中,并在阅读器关闭后执行你需要执行的所有操作。

您可以使用using 块,以便阅读器关闭和处置。之后,您可以重复使用相同的连接。

using (var nomeItemRdr = cmd.ExecuteReader())
{
} 
//You can reuse your connection here.

【讨论】:

  • 阅读器连接关闭后是否在新连接中执行非查询?
  • @madcodroipo 只要 reader 被释放,这就是你所需要的 - 你不需要新的连接
  • 我不明白我正在阅读链接端的页面,但我不相信这样做我必须使用 MARS 或类似的东西。而且我不明白我要关闭阅读器的连接然后执行位于另一个连接中的 if 内部的查询要做什么?
  • @madcodroipo 添加了using 示例@MarcGravell
  • @hardkoded 我已经根据您的建议的解释更新了代码,但我可能是不对的...您能只看一下实现的问题在哪里吗?
猜你喜欢
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多