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 会给您一个错误,说它不存在。
我是 运行 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 会给您一个错误,说它不存在。