我的代码抛出错误
读取器关闭时无效尝试调用Read。
我正在使用SqlDataReader从数据库中读取值,这是我的代码:
while (rd.Read())
{
string stateincharge = rd["stateincharge"].ToString();
string email = rd["email"].ToString();
cmd.Dispose();
rd.Close();
cmd = con.CreateCommand();
cmd.CommandText = "str_procedure";
cmd.Parameters.AddWithValue("@stateincharge", stateincharge);
cmd.CommandType = CommandType.StoredProcedure;
ad.SelectCommand = cmd;
ad.Fill(ds);
count = ds.Tables[0].Rows.Count;
DataTable dt = new DataTable();
}
这在ASP.NET代码隐藏中循环运行。
我的问题是我认为由于显示错误,我需要关闭SqlDatReader。
如何在while循环结束时再次打开sqlDataReader?
答案 0 :(得分:2)
// connection for reader
using (SqlConnection connection1 = new SqlConnection(connectionString))
using (SqlCommand command1 = new connection1.CreateCommand())
{
command1.CommandText = commandText1;
connection1.Open();
using (SqlDataReader reader = command1.ExecuteReader())
{
// fill table in loop
while (reader.Read())
{
string stateincharge = reader["stateincharge"].ToString();
string email = reader["email"].ToString();
// connection for adapter
using (SqlConnection connection2 = new SqlConnection(connectionString))
using (SqlCommand command2 = new connection2.CreateCommand())
{
command2.CommandText = commandText2;
command2.Parameters.AddWithValue("@stateincharge", stateincharge);
command2.Parameters.AddWithValue("@email ", email );
connection2.Open();
DataTable table = new DataTable();
using (SqlDataApapter adapter = new SqlDataAdapter(command2))
{
adapter.Fill(table);
// yield return table;
}
}
}
}
}
答案 1 :(得分:0)
您必须删除关闭阅读器rd.Close();
的行,因为您正在关闭while循环内的阅读器,然后再次尝试访问阅读器。此外,我认为如果您使用新的SQL命令和新适配器,则不会收到此错误。
答案 2 :(得分:0)
每个连接最多只能有一个活动命令(包括“响应”,即读取器)。您正在尝试对数据库执行嵌套调用,这要求您在循环之前完全加载数据(例如加载到DataTable
),或者为嵌套调用{{{设置第二个连接。 1}}。
答案 3 :(得分:0)
while (rd.Read())
{
string stateincharge = rd["stateincharge"].ToString();
string email = rd["email"].ToString();
cmd.Dispose();
cmd = con.CreateCommand();
cmd.CommandText = "str_procedure";
cmd.Parameters.AddWithValue("@stateincharge", stateincharge);
cmd.CommandType = CommandType.StoredProcedure;
ad.SelectCommand = cmd;
ad.Fill(ds);
count = ds.Tables[0].Rows.Count;
DataTable dt = new DataTable();
}
rd.Close();