C# reader 读时关闭?

C# reader is closed while reading?

我是 运行 C# windows 应用程序,我在尝试使用数据时收到一条错误消息reader。错误信息是:

"Invalid attempt to call CheckDataIsReady when reader is closed."

我使用了停止点,看到代码在进入 "while" 循环之前运行良好。进入后,它会给出错误消息。

我曾尝试在不关闭之前的 reader 的情况下执行此操作,但随后消息更改为 "there is already an open reader" 之类的内容。

代码如下:

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);
}

我想做的是将 class (UnfulfilledOrders) 类型的对象添加到列表框 (OrderList)。

让我感到困惑的是,我在同一个应用程序的前一个表单中使用了这样一个 while 循环,并且在那里工作得很好。 我真的不知道我做错了什么。 我尝试修改代码,添加或删除某些部分,但似乎没有任何效果。

您的代码:

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);
}

dr 之前被关闭了,你是说 "orders" 而不是 "dr"?

您的问题是在 while 循环中您使用的是 dr[0] 而不是 orders[0]。这是试图从 SqlDataReader dr 获取值。

避免此类混淆的一个好方法是在 using 块中创建数据 reader。

using (var dr = select_cmd.ExecuteReader())
{
   //your code here
   dr.Close();
}

然后

using (var orders = select_orders.ExecuteReader())
{
  // your code here
  orders.Close();
}

这将防止您意外地引用错误的 reader 因为 VS 会给您一个错误,说它不存在。