我正在运行C#windows应用程序,尝试使用datareader时收到错误消息。错误消息是:
"读取器关闭时调用CheckDataIsReady的尝试无效。"
我使用了停止点,看到代码正常工作,直到它进入"而#34;环。进入后,它会显示错误消息。
我试图在没有关闭之前的阅读器的情况下做到这一点,但随后消息改为"已经有一个开放的阅读器"或者其他一些。
以下是代码:
conn = new SqlConnection(DBConnectionString);
SqlCommand select_cmd = new SqlCommand("SELECT usrRealname, usrIsowner FROM tblUSERS WHERE usrNum = " + UserID, conn);
SqlCommand select_orders = new SqlCommand("SELECT orderNum, orderBy, orderShipadrs, orderDate, orderTotal FROM tblOrders WHERE orderDeliveryDate is NULL AND fkorderTakenbyusrnum = " + UserID, conn);
conn.Open();
SqlDataReader dr = select_cmd.ExecuteReader();
dr.Read();
CurrentUser User = new CurrentUser(Convert.ToString(dr[0]), UserID, Convert.ToBoolean(dr[1]));
DetailsLabel.Text = String.Format("Welcome {0}, ID number {1}. {2}", User.getname, UserID, User.getOwner);
dr.Close();
SqlDataReader orders = select_orders.ExecuteReader();
while (orders.Read())
{
UnfulfilledOrders CurrentOrder = new UnfulfilledOrders(Convert.ToInt32(dr[0]), Convert.ToString(dr[1]), Convert.ToString(dr[2]), Convert.ToString(dr[3]), Convert.ToInt32(dr[4]));
OrderList.Items.Add(CurrentOrder);
}
我尝试做的是将类(UnfulfilledOrders)类型对象添加到列表框(OrderList)。
令我感到困惑的是,我在同一个应用程序中使用了之前形式的while循环,并且在那里工作得很好。 我真的不知道我做错了什么。 我尝试修改代码,添加或删除某些部分,但似乎没有任何工作。
答案 0 :(得分:1)
您的代码:
dr.Close(); //<-- dr closed
SqlDataReader orders = select_orders.ExecuteReader(); // <-- Reader is "orders" here
while (orders.Read())
{
UnfulfilledOrders CurrentOrder = new UnfulfilledOrders(Convert.ToInt32(dr[0]), Convert.ToString(dr[1]), Convert.ToString(dr[2]), Convert.ToString(dr[3]), Convert.ToInt32(dr[4]));
OrderList.Items.Add(CurrentOrder);
}
先前关闭了博士,你的意思是“订单”而不是“博士”吗?
答案 1 :(得分:1)
你的问题是在你的while循环中你使用dr [0]而不是order [0]。这是试图从SqlDataReader博士获取值。
避免这种混淆的好方法是在使用块中创建数据读取器。
using (var dr = select_cmd.ExecuteReader())
{
//your code here
dr.Close();
}
然后
using (var orders = select_orders.ExecuteReader())
{
// your code here
orders.Close();
}
这会阻止您意外地引用错误的阅读器,因为VS会给您一个错误,说它不存在。