服务器报错:System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。练习~~ADO.NET!
在同一个连接的同一事务里进行的两个数据库查询~~~服务器报错如上!把第一个查询的DataReader.Close()然后在执行第二个查询这样才会正常,这是为什么?
在同一个连接的同一事务里进行的两个数据库查询~~~服务器报错如上!把第一个查询的DataReader.Close()然后在执行第二个查询这样才会正常,这是为什么?
这样的问题肯定是没close掉的问题
using System.Web;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web.SessionState;public class Handler2 : IHttpHandler,IRequiresSessionState
{
public void ProcessRequest (HttpContext context) {
string result=null;
Hashtable table = (Hashtable)(context.Application["Hashtable"]);
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL"].ConnectionString); //两个要执行的SqlCommand对象
SqlCommand command = new SqlCommand();
SqlCommand command1 = new SqlCommand();
//获取Http请求中的参数值
string userID = context.Request.Form["id"];
string password = context.Request.Form["pass"];
using (con)
{
con.Open();
SqlTransaction transaction=con.BeginTransaction(); //两个SqlCommand在同一事务里
command.Transaction = transaction;
command1.Transaction = transaction;
command.CommandType = CommandType.StoredProcedure;
command1.CommandType = CommandType.StoredProcedure;
command.CommandText = "用户登陆";
command1.CommandText ="朋友"; //两个SqlCommand使用同一个数据库连接
command.Connection = con;
command1.Connection = con; //给两个SqlCommand注册存储过程的参数
SqlParameter parameter = new SqlParameter("@UserID", SqlDbType.Char,50);
command.Parameters.Add(parameter);
parameter.Direction = ParameterDirection.Input;
parameter.Value = userID;
parameter=new SqlParameter("@PassWord",SqlDbType.Char,50);
parameter.Direction= ParameterDirection.Input;
parameter.Value=password;
command.Parameters.Add(parameter); parameter = new SqlParameter("@用户名", SqlDbType.Char,20);
parameter.Direction = ParameterDirection.Input;
parameter.Value = userID;
command1.Parameters.Add(parameter);
try
{
SqlDataReader reader = command.ExecuteReader();//第一个SqlCommand执行
if (reader.HasRows)
{
reader.Close();//关键,如果不写这段代码服务器将报错~~~~~`System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
if (!table.Contains(userID))
table.Add(userID, null);
reader = command1.ExecuteReader();//第二个SqlCommand执行
if (reader.HasRows)
{
reader.Read();
}
result = (string)reader["好友"];
context.Response.Write(result);
context.Response.End();
}
else
{
context.Response.Write("此用户不存在");
context.Response.End();
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
context.Response.Write("异常"+ex.Message);
context.Response.End();
}
}
}
public bool IsReusable {
get {
return false;
}
}}
DataReader用完必须关闭~~~~~你可以声明两个不同的变量虽然你声明两个不同的变量
不关闭执行不会报错
但是这不是个好习惯
在这里~~using(){}代码快结束后~~
SqlConnection就自动关闭了,然后SqlDataReader也会自动关闭!
问题是上面的代码中不加上 reader.Close()就会报错~~~~~~~~~~~~~~
using 是将连接对象关闭,但是流是需要手动关闭的 就是reader.Close();