【问题标题】:c#, how to Reuse the SqlCommand and OleDbCommandc#,如何重用SqlCommand和OleDbCommand
【发布时间】:2012-07-14 03:15:41
【问题描述】:

这是我参考的网址:http://support.microsoft.com/kb/317559

我研究了他们的方法并应用了它们,一切都很好,直到我包含 2_2,错误消息:数据阅读器中没有当前查询。

我已经在 2_1 if 语句下关闭了我的 drSelect1_1。我需要关闭它,否则我无法创建一个新的。所以问题是,如何再次打开 drSelect1_1 以便我可以用于我的 2_2?我试图创建 drSelect1_1a 而不是使用 back drSelect1_1,出现错误:在调用 Read() 之前访问字段的尝试无效。 有什么建议吗?代码如下:

cmdSelect.CommandText = "SELECT * FROM member WHERE username = @username";

connSelect.Open();

MySqlDataReader drSelect1_1 = cmdSelect.ExecuteReader();

if (drSelect1_1.Read())
{
     //1_1
     this.lbl1_1.Text = drSelect1_1["username"].ToString();

     //2_1
     if (drSelect1_1["direct1"].ToString() != "")
     {
        //this.ib2_1.Visible = true;
        this.lbl2_1.Text = drSelect1_1["direct1"].ToString();
        drSelect1_1.Close();

        cmdSelect.CommandText = "SELECT * FROM member WHERE username = '" + this.lbl2_1.Text + "'";
        MySqlDataReader drSelect2_1 = cmdSelect.ExecuteReader();

        if (drSelect2_1.Read())
        {                  
             drSelect2_1.Close();
        }
    }

    //2_2            
    if (drSelect1_1["direct2"].ToString() != "")
    {

    }
}
connSelect.Close();

【问题讨论】:

  • 您想要重用该命令的原因是什么?为什么不创建另一个?
  • 如果抛出异常会发生什么,你在哪里 Dispose 你的资源?
  • @RichardSzalay,我之前的代码是创建一个新的命令和连接。但页面需要时间来加载。因为我需要重复相同的步骤 32 次。这意味着网站需要打开 32 个新连接并关闭它们。
  • 你为什么要重新打开drSelect1_1,难道你不能先完成所有工作,即在你关闭它之前在2_2尝试做的事情吗?
  • 创建多个使用同一个连接对象的命令不会打开多个连接

标签: c# sqlcommand oledbcommand


【解决方案1】:

编辑#2

好吧,如果是这样的话。在关闭阅读器之前,将值分配给块开头的变量。它会让你免于这么多麻烦。 :)

if (drSelect1_1.Read())
{
     string username = drSelect1_1["username"].ToString();
     string direct1 = drSelect1_1["direct1"].ToString();
     string direct2 = drSelect1_1["direct2"].ToString();

     drSelect1_1.Close();

     //1_1
     this.lbl1_1.Text = username;

     //2_1
     if (direct1 != "")
     {
        //this.ib2_1.Visible = true;
        this.lbl2_1.Text = direct1;

        cmdSelect.CommandText = "SELECT * FROM member WHERE username = '" + this.lbl2_1.Text + "'";
        MySqlDataReader drSelect2_1 = cmdSelect.ExecuteReader();

        if (drSelect2_1.Read())
        {                  
             drSelect2_1.Close();
        }
    }

    //2_2            
    if (direct2 != "")
    {

    }
}

您已关闭数据阅读器drSelect1_1.Close(); 并尝试再次访问它

if (drSelect1_1["direct2"].ToString() != "")

删除这一行

drSelect1_1.Close();

或者只是在 Read() 块中的 } 之前移动它。

编辑

只需创建另一个MySqlCommand 实例,如下所示:

MySqlCommand cmdSelect2 = new MySqlCommand("SELECT * FROM member WHERE username = '" + this.lbl2_1.Text + "'", connSelect);
MySqlDataReader drSelect2_1 = cmdSelect2.ExecuteReader();

所以你可以安全地删除上面提到的行。

【讨论】:

  • 我无法删除它或者我无法创建 drSelect2_1
  • 再创建一个实例,请再看我的回答。
  • @Ruen 一样,还是要先关闭之前的dataReader :(
  • @Ruen,太棒了!谢谢老兄!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多