简体   繁体   English

C#中的DataReader异常

[英]DataReader exception in C#

Let me first explain my code. 首先让我解释一下我的代码。

  1. fetch fare for selected destination(reader1) 获取选定目的地的票价(reader1)
  2. fetch * for selected user id(reader2) 为选定的用户ID获取*(reader2)
  3. insert data to process new balance(cmd3) 插入数据以处理新的余额(cmd3)
  4. retrieve new balance as calculated field (reader3) 检索新余额作为计算字段(reader3)
  5. update travel account (cmd5) 更新旅行账户(cmd5)
  6. clear calc_tb for next customer input(cmd6) 清除calc_tb以供下一次客户输入(cmd6)

My problem is while running, I get this error: 我的问题是在运行时,出现此错误:

There is already an open DataReader associated with this Command which must be closed first. 已经有一个与此命令相关联的打开的DataReader,必须先关闭它。

How can I handle more than one DataReader accessing different tables? 如何处理多个DataReader访问不同的表? Is DataReader similar to resultset in Java ? DataReader是否类似于Java中的结果集?

I'm a beginner in coding. 我是编码的初学者。

        string id, 
        destin, num;
        id = txt_id.Text;
        destin = cb_destin.Text;
        num = cb_num.Text;



        string sql1 = "SELECT fare FROM route_info WHERE route_name='" +destin + "' ";
        string sql2 = "SELECT * FROM trav_acc WHERE user_id='" + id + "'";

        con.Open();

        cmd1 = new SqlCommand(sql1, con);
        reader1 = cmd1.ExecuteReader();

        while(reader1.Read())
        {

            string fare = (string)reader1["fare"];

            cmd2 = new SqlCommand(sql2, con);
            reader2 = cmd2.ExecuteReader();
            string cur_bal = (string)reader2["cur_bal"];
            reader2.Close();

            string calc1 = "INSERT INTO calc_tb VALUES('" + cur_bal + "','" + num + "','" + fare + "')";
            string calc2 = "SELECT cur_bal - (nof_tickets * fare) AS new_bal FROM calc_tb";

            cmd3 = new SqlCommand(calc1, con);
            cmd3.ExecuteNonQuery();

            cmd4 = new SqlCommand(calc2, con);
            reader3 = cmd4.ExecuteReader();

            while(reader3.Read())
            {
                string new_bal = (string)reader3["new_bal"];

                string update = "UPDATE trav_acc SET cur_bal='" + new_bal + "',last_bal='" + cur_bal + "' WHERE user_id='" + id + "'  ";
                cmd5 = new SqlCommand(update, con);
                cmd5.ExecuteNonQuery();

                string clear = "DELETE FROM calc_tb";
                cmd6 = new SqlCommand(clear, con);
                cmd6.ExecuteNonQuery();
            }

        }
        con.Close();
        MessageBox.Show("Thank you for using EasyTravel.Come again soon!");



    }

It seems that reader3 and cmd4 are defined outside of the code you are showing us, but at least they are defined outside the loop for reader1 . 似乎reader3cmd4是在您向我们展示的代码之外定义的,但是至少它们是在reader1的循环之外定义的。 So if your reader1 contains more than one row, reader3 and cmd4 will be assigned again, but the "old" reader3 is never closed. 因此,如果您的reader1包含多个行, reader3再次分配reader3cmd4 ,但是永远不会关闭“旧” reader3 Close reader3 when it's finished reading. 完成阅读后,关闭reader3 Or use a using statement, which will take care of the closing automatically. 或使用using语句,该语句将自动完成关闭。

using (DataReader reader1 = cmd1.ExecuteReader()) {
    ....
    while (reader1.Read()) {
        ....
        using (DataReader reader3 = cmd4.ExecuteReader()) {
            while (reader3.Read()) {
            }
        }  //reader3 is closed here automatically
    }
} //reader1 is closed here automatically

Furthermore, I'm not sure if I remember correctly, but I think it's not possible to have two open readers on the same connection. 此外,我不确定我是否记错了,但是我认为不可能在同一连接上有两个打开的阅读器。 I may be wrong with this, though. 不过,我可能是错的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM