重新打开SqlDataReader
本文关键字:SqlDataReader 新打开 | 更新日期: 2023-09-27 18:07:08
我的代码抛出错误
当读取器关闭时,尝试调用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中循环运行。净后台代码。
我的问题是,我认为我需要关闭SqlDatReader,因为一个错误显示。
我怎么能再次打开sqlDataReader在while循环结束?
// 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;
}
}
}
}
}
您必须删除关闭读取器rd.Close();
的行,因为您在while循环中关闭读取器,然后您尝试再次访问读取器。此外,我认为如果您使用新的SQL命令和新的适配器,您将不会收到此错误。
每个连接最多只能有一个活动命令(其中包括"响应",即读取器)。你试图做一个嵌套的调用数据库,这需要你要么加载数据完全(例如到一个DataTable
)循环之前,或者你使用第二个连接的嵌套调用str_procedure
。
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();