已有打开的与此命令相关联的 DataReader,必须首先将它关闭——什么原因啊???

wzwen 2008-07-21 08:00:06
已有打开的与此命令相关联的 DataReader,必须首先将它关闭——什么原因啊???


提示错误如下:


“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

源错误:


行 40: string strSQL1 = "INSERT INTO wyx_user (wyx_name,wyx_pass) VALUES ('" + TextBox1.Text + "','" + password + "')";
行 41: SqlCommand cmd1 = new SqlCommand(strSQL1, ConnSql);
行 42: cmd1.ExecuteNonQuery();
行 43:
行 44: Response.Write("<script>alert('添加成功!')</script>");


源文件: f:\wyx3.0\wyxback\admin_adminadd.aspx.cs 行: 42


源码:

   protected void Button1_Click(object sender, EventArgs e)
{
string strConn = ConfigurationManager.ConnectionStrings["SperConnectionString1"].ToString();
SqlConnection ConnSql = new SqlConnection(strConn);
ConnSql.Open();
string strSQL = "SELECT * FROM wyx_user WHERE wyx_name='" + TextBox1.Text + "'";
SqlCommand cmd = new SqlCommand(strSQL, ConnSql);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())//如果用户名存在
{
Response.Write("<script>alert('对不起,用户名已被注册,请换个名称,谢谢!')</script>");

}
else
{
string password = FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text, "MD5");

string strSQL1 = "INSERT INTO wyx_user (wyx_name,wyx_pass) VALUES ('" + TextBox1.Text + "','" + password + "')";
SqlCommand cmd1 = new SqlCommand(strSQL1, ConnSql);
cmd1.ExecuteNonQuery();

Response.Write("<script>alert('添加成功!')</script>");
}

dr.Close();
ConnSql.Close();


Response.Redirect("admin_admin.aspx");//返回管理页面

}



说明一下,这个程序的功能是添加管理员

数据库里的管理员表是wyx_user

我估计是if语句有问题,因为要考虑到如果添加的用户名已经存在,就要给出提示信息
...全文
732 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
flg717 2009-09-02
  • 打赏
  • 举报
回复
你第二次用ExecuteReader()出错,如果第一个ExecuteReader()还不能关的话,就用另一个connection建立你用的第二个ExecuteReader(),这样就不冲突了
wzwen 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bindsang 的回复:]
引用 14 楼 jack20080808 的回复:
答案上面已经说了,和你说一下原因,SqlDataReader对数据库的连接是独占方式,使用完后必须关闭才能执行其它的,你可以把SqlDataReader换成DataSet来处理,其优点是数据存在内存中,缺点是比SqlDataReader要慢


为何不用SqlCommand.ExecuteScalar 方法呢

if(cmd.ExecuteScalar() == null) // 没有存在的用户
{
//插入新用户
}
else
{
//提示已存在
}

// 返回
[/Quote]


这样也行啊,小弟太菜了,呵呵。。。

学习……
bindsang 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jack20080808 的回复:]
答案上面已经说了,和你说一下原因,SqlDataReader对数据库的连接是独占方式,使用完后必须关闭才能执行其它的,你可以把SqlDataReader换成DataSet来处理,其优点是数据存在内存中,缺点是比SqlDataReader要慢
[/Quote]

为何不用SqlCommand.ExecuteScalar 方法呢

if(cmd.ExecuteScalar() == null) // 没有存在的用户
{
//插入新用户
}
else
{
//提示已存在
}

// 返回

jack20080808 2008-07-21
  • 打赏
  • 举报
回复
答案上面已经说了,和你说一下原因,SqlDataReader对数据库的连接是独占方式,使用完后必须关闭才能执行其它的,你可以把SqlDataReader换成DataSet来处理,其优点是数据存在内存中,缺点是比SqlDataReader要慢
dotnetsong 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wzwen 的回复:]
引用 1 楼 hubblebubblepig 的回复:
你把SqlDataReader的关闭写在if (dr.Read())里面第一句



你是说这样写:


C# code if (dr.Read())//如果用户名存在
{
dr.Close();
Response.Write("<script>alert('对不起,用户名已被注册,请换个名称,谢谢!')</script>");

}
[/Quote]
hubblebubblepig 2008-07-21
  • 打赏
  • 举报
回复
7#~
hubblebubblepig 2008-07-21
  • 打赏
  • 举报
回复
恩 9#对的 if和else里面都该关闭
反正你用了sqldatareader了就在用过后第一时间关闭
wzwen 2008-07-21
  • 打赏
  • 举报
回复
谢谢上面的热心朋友,还有其他方法吗?
bsetsail 2008-07-21
  • 打赏
  • 举报
回复
if (dr.Read())//如果用户名存在
{
Response.Write("<script>alert('对不起,用户名已被注册,请换个名称,谢谢!')</script>");

}
else
{
dr.Close();
string password = FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text, "MD5");

string strSQL1 = "INSERT INTO wyx_user (wyx_name,wyx_pass) VALUES ('" + TextBox1.Text + "','" + password + "')";
SqlCommand cmd1 = new SqlCommand(strSQL1, ConnSql);
cmd1.ExecuteNonQuery();

Response.Write("<script>alert('添加成功!')</script>");
}


这样写,写到else里边的第一句!
bsetsail 2008-07-21
  • 打赏
  • 举报
回复
       if (dr.Read())//如果用户名存在
{
Response.Write("<script>alert('对不起,用户名已被注册,请换个名称,谢谢!')</script>");

}
else
{
string password = FormsAuthentication.HashPasswordForStoringInConfigFile(TextBox2.Text, "MD5");

string strSQL1 = "INSERT INTO wyx_user (wyx_name,wyx_pass) VALUES ('" + TextBox1.Text + "','" + password + "')";
SqlCommand cmd1 = new SqlCommand(strSQL1, ConnSql);
cmd1.ExecuteNonQuery();

Response.Write("<script>alert('添加成功!')</script>");
}

dr.Close();

这样写
CloneCenter 2008-07-21
  • 打赏
  • 举报
回复
改成这个样子即可:
//...前面都一样
SqlDataReader dr = cmd.ExecuteReader();
boolean bExists;
bExists = dr.Read();//如果用户名存在
dr.close();
if (bExists)
{...}
//后面都一样。
aaajedll 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hubblebubblepig 的回复:]
你把SqlDataReader的关闭写在if (dr.Read())里面第一句
[/Quote]
wzwen 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hubblebubblepig 的回复:]
你把SqlDataReader的关闭写在if (dr.Read())里面第一句
[/Quote]


你是说这样写:

        if (dr.Read())//如果用户名存在
{
dr.Close();
Response.Write("<script>alert('对不起,用户名已被注册,请换个名称,谢谢!')</script>");

}
wzwen 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hubblebubblepig 的回复:]
你把SqlDataReader的关闭写在if (dr.Read())里面第一句
[/Quote]

你是说这样写:
        if (dr.Read())//如果用户名存在
{
dr.Close();
Response.Write("<script>alert('对不起,用户名已被注册,请换个名称,谢谢!')</script>");

}
wayuILY 2008-07-21
  • 打赏
  • 举报
回复
cmd.ExecuteNonQuery(CommandBehavion.Close);
大概就是这样!
  • 打赏
  • 举报
回复
看着没有问题呀.要不你换个测试的方法吧.把那条SQL语名改成
string strSQL = "SELECT * FROM wyx_user WHERE wyx_name='" + TextBox1.Text + "'";
改为:string strSQL = "SELECT COUNT(*) FROM wyx_user WHERE wyx_name='" + TextBox1.Text + "'";

然后设一个int 变量,int count=cmd.ExecuteNonQuery();

把if语句的条件改成if(count>0).就是说如果用户名存在的话.这样就行了.
hubblebubblepig 2008-07-21
  • 打赏
  • 举报
回复
你把SqlDataReader的关闭写在if (dr.Read())里面第一句

62,025

社区成员

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

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

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

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