asp.net 阅读器关闭时 Read 的尝试无效。

gw789123 2011-04-30 05:19:30
SqlDataReader dr = null;
try
{
dr = da.ExceRead(cmdtxt);
dr.Read();
if (dr.HasRows)
{
Session["admin"] = this.txtUid.Text.Trim();
Response.Redirect("admin_index.aspx");

}
else
{
Response.Write("<script>alert('帐号或密码错误!');</script>");
}
}
catch (SqlException ex)
{
Response.Write(ex.Message);
}
finally
{
if(dr != null)
dr.Close();
}


public SqlDataReader ExceRead(string SqlCom)
{
SqlConnection sqlcon = null;
SqlCommand sqlcom = null;
SqlDataReader read = null;
try
{
sqlcon = getconn();
sqlcon.Open();
sqlcom = new SqlCommand(SqlCom, sqlcon);
read = sqlcom.ExecuteReader();

}
catch (SqlException ex)
{
System.Web.HttpContext.Current.Response.Write(ex.Message);
}

finally
{
if(sqlcon!=null)
sqlcon.Close();
if(read!=null)
read.Close();
}
return read;

}


阅读器关闭时 Read 的尝试无效。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: 阅读器关闭时 Read 的尝试无效。

源错误:


行 29: {
行 30: dr = da.ExceRead(cmdtxt);
行 31: dr.Read();行 32: if (dr.HasRows)
行 33: {

...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
白云任去留 2011-04-30
  • 打赏
  • 举报
回复
cmd.ExecuteReader(CommandBehavior.CloseConnection)
  • 打赏
  • 举报
回复
Response.Redirect("admin_index.aspx", fasle);
或者使用using()

using(dr = da.ExceRead(cmdtxt))
{
dr.Read();
if (dr.HasRows)
{
Session["admin"] = this.txtUid.Text.Trim();
Response.Redirect("admin_index.aspx");
}
else
{
}
}
暖枫无敌 2011-04-30
  • 打赏
  • 举报
回复
给你改造下:

DataSet ds = null;
try
{
ds = ExceRead(cmdtxt);
if (ds.Tables[0].Rows.Count>0)
{
Session["admin"] = this.txtUid.Text.Trim();
Response.Redirect("admin_index.aspx");
}
else
{
Response.Write("<script>alert('帐号或密码错误!');</script>");
}
}
catch (SqlException ex)
{
Response.Write(ex.Message);
}


public DataSet ExceRead(string SqlCom)
{
SqlConnection sqlcon = null;
SqlDataAdapter da = null;
DataSet ds = null;
try
{
sqlcon = getconn();
sqlcon.Open();
da = new SqlDataAdapter(SqlCom, sqlcon);
da.Fill(ds);
}
catch (SqlException ex)
{
System.Web.HttpContext.Current.Response.Write(ex.Message);
}
finally
{
if (sqlcon != null)
sqlcon.Close();
}
return ds;
}
暖枫无敌 2011-04-30
  • 打赏
  • 举报
回复
你的那个返回SqlDataReader的方法,将你的finally块去掉就行了。

看来你是没明白SqlDataReader,数据读取器的原理,使用SqlDataReader,你的SqlConnection是不能关闭的,SqlDataReader也是不能关闭的。

将你的finally块去掉后,就不会报错了,但是连接始终是打开的,这样每次有一个用户正确登录,就会占用一个连接资源,是非常不好的写法。




gw789123 2011-04-30
  • 打赏
  • 举报
回复
我希望在我原来的程序上修改
[Quote=引用 1 楼 wxr0323 的回复:]
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)

CommandBehavior.CloseConnection


public static DataTable ReturnDataTable(string cmdtext, CommandType ct, SqlParameter[] para)
{
Da……
[/Quote]
子夜__ 2011-04-30
  • 打赏
  • 举报
回复
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)

CommandBehavior.CloseConnection


public static DataTable ReturnDataTable(string cmdtext, CommandType ct, SqlParameter[] para)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdtext, GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(para);
SqlDataReader dr = null;
using (dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(dr);
}
return dt;
}

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧