我正在尝试从datareader读取但我得知错误“读取器关闭时无效尝试调用读取”。存储过程工作正常,但当我尝试读取fom datareader时,它会抛出错误.Plz帮助我
protected void CheckDatabase()
{
SqlConnection conn = new SqlConnection(GetConnectionString());
conn.Open();
SqlParameter[] param = new SqlParameter[2];
param[0]= new SqlParameter("@EmpID", SqlDbType.Int);
param[0].Value = txtEmpId.Text;
param[1]= new SqlParameter("@Date", SqlDbType.VarChar,50);
param[1].Value = txtDate.Text;
SqlDataReader reader = DNDatabase.ExecuteStoredProcedureReader("RetrieveDeatails", param);
while (reader.Read())
{
gridConfirm.DataSource = reader;
gridConfirm.Columns[0].Visible = false;
gridConfirm.DataBind();
Session["Task_List"] = reader;
}}
这里存储过程代码
public static SqlDataReader ExecuteStoredProcedureReader(string procedureName, SqlParameter[] parameters)
{
SqlConnection _conn = new SqlConnection(DNDatabase.SQLConnectionString);
SqlCommand cmd = new SqlCommand(procedureName, _conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = procedureName;
cmd.CommandTimeout = 300;
try
{
foreach (SqlParameter param in parameters)
{
cmd.Parameters.Add(param);
}
_conn.Open();
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
catch (Exception sqlExc)
{
throw new Exception("An error occured", sqlExc);
}
finally
{
if (_conn != null)
_conn.Close();
}
}
答案 0 :(得分:2)
对我来说这看起来不错:
Session["Task_List"] = reader;
您执行该操作然后然后再次呼叫reader.Read()
,继续直到没有任何内容可供阅读。大概你也会在某个时候关闭读者(我希望 - 理想情况下是using
语句)。从根本上说,SqlDataReader
是连接的资源 - 它就像是数据库的流。这不是你应该坚持的时间超过你需要的时间,并且当然不是你应该放在会话中的东西,即使你没有用随后的{{1调用。
我认为数据绑定在您调用Read()
时通过获取数据起作用,但是没有迹象表明您通过将读者本身的引用添加到会话中来实现的目的。
我建议:
DataBind()
或其他“断开连接”表单)此外,您应该考虑为什么要循环 - 目前您基本上要遍历所有结果,并且只显示 last 一个(因为您覆盖了每次数据绑定)。这真的是你想要的吗?
答案 1 :(得分:1)
检查DNDatabase.ExecuteStoredProcedureReader代码可能会在fetchdata之后关闭阅读器 我应该说的另一件事是: 你不能使用Session [“Task_List”] =读者;因为读者是前瞻性的 如果你想在数据表中保持读取器的当前值并保持表的数据行
DataTable dt = new DataTanle(); dt.Load(DR); 并循环数据表行
答案 2 :(得分:0)
您的方法ExecuteStoredProcedureReader有一个finally语句,用于关闭连接。因此,你无法从读者那里读到任何东西。在您调用ExecuteStoredProcedureReader的方法中关闭阅读器,或者合并两个方法以将它们放在一个方法中。