服务器报错:System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。练习~~ADO.NET!
在同一个连接的同一事务里进行的两个数据库查询~~~服务器报错如上!把第一个查询的DataReader.Close()然后在执行第二个查询这样才会正常,这是为什么?

解决方案 »

  1.   

    代码贴出来
    这样的问题肯定是没close掉的问题
      

  2.   

    DataReader需要保持与数据库的链接你这个问题应该把源代码贴出来看看。更能说明问题
      

  3.   

    <%@ WebHandler Language="C#" Class="Handler2" %>using System;
    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;
            }
        }}
      

  4.   

    这有什么可说的
    DataReader用完必须关闭~~~~~你可以声明两个不同的变量虽然你声明两个不同的变量
    不关闭执行不会报错
    但是这不是个好习惯
      

  5.   

    还是不明白~~~~
    在这里~~using(){}代码快结束后~~
    SqlConnection就自动关闭了,然后SqlDataReader也会自动关闭!
    问题是上面的代码中不加上  reader.Close()就会报错~~~~~~~~~~~~~~
      

  6.   

       谁说的SqlDataReader也会自动关闭! 
        using  是将连接对象关闭,但是流是需要手动关闭的  就是reader.Close();
                                  
      

  7.   

    一个DataReader就必须对应一个close(),你如果不关闭的话,就不能进行下一个DataReader