public class SqlDB
    {
        private static SqlConnection connection;    //构建连接字符串
        public static SqlConnection Connection
        {
            get
            {
                string connectionString = ConfigurationManager.ConnectionStrings["sql"].ToString();//读取配置文件
                if (connection == null)
                {
                    connection = new SqlConnection(connectionString);
                    connection.Open();
                }
                else if (connection.State == System.Data.ConnectionState.Closed)
                {
                    connection.Open();
                }
                else if (connection.State == System.Data.ConnectionState.Broken)
                {
                    connection.Close();
                    connection.Open();
                }
                return connection;
            }
        }
        public static DataTable GetDataSet(string safeSql)
        {
            DataSet ds = new DataSet();
            SqlCommand cmd = new SqlCommand(safeSql, Connection);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(ds); //到这里是 报错 “已有打开的与此命令相关联的 DataReader,必须首先将它关闭 ”            return ds.Tables[0];
            
        }
        //执行(增、删、改)返回受影响的行数
        public static int ExecuteCommand(string safeSql)
        {
            SqlCommand cmd = new SqlCommand(safeSql, Connection);
            int result = cmd.ExecuteNonQuery();
            return result;
        }
    }web.config 是这样写的 <add name="sql" connectionString="server=.;database=ProjectManage;uid=sa;pwd=webtba;Max Pool Size=512"/>
我用的 是 SqlServer 2000  vs2005   我所有 的查询都用这个方法完成GetDataSet(string safeSql)   safeSql是sql语句
我在同一台电脑上运行 当一个用户在查询大量数据时 后面的人在查询就报“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。   两个用户都是调用 GetDataSet()方法

解决方案 »

  1.   

    sqlDataReader没有关闭吧,你看看这个方法前面哪里有没有用到sqlDataReader
    dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    加上CommandBehavior.CloseConnection这个枚举
      

  2.   

    多用户访问DataReader的同一段代码,并不冲突
    在一个用户ip访问中,一定要关闭后,再DataReader检查DataReader打开没关的地方
      

  3.   

    使用后 close()       建议用 datatable 
      

  4.   

    用静态SqlConnection会出问题的。写个静态方法返回SqlConnection还是可以的。
      

  5.   

    SqlDataReader 要先关闭,再执行ExecuteNonQuery操作
    using (SqlConnection cn = new SqlConnection(“”))
      {
      SqlCommand cmd1 = new SqlCommand("", cn);
      cn.Open();
      using (SqlDataReader dr1 = cmd1.ExecuteReader())
      {
      while (dr1.Read())
      {
      string sql= "";
      SqlConnection conn2 = new SqlConnection("");
      SqlCommand cmd2 = new SqlCommand(sql, conn2 );
      cmd2.ExecuteNonQuery();
      }
      }  }
      

  6.   


    我这 跟本就没 SqlDataReader 
      

  7.   

    da.Fill(ds);  这里不一定就是DataReader了, 应该是你的Sqlconnection在其他地方正用着。
      

  8.   

    这个肯定 没有 异常就是 在 SqlCommand cmd = new SqlCommand(safeSql, Connection);这段代码报出来的 开始写错了
      

  9.   

    用DataSet——》DataTable吧,这个就不会出现那个问题了,以前刚学的时候也老是遇到这个问题,后来了解到用DataTable就不会出现这个问题。楼主用个试试吧!!!
      

  10.   

    检查代码,datareader使用完必须关闭
      

  11.   

    如果 关键是我在哪关啊    我这个项目 都没的datareader  假如有一个用户在查询打开了datareader  但还没查询完 另一个用户 也要查该数据 就会如上错误
      

  12.   

    问题解决了 呵呵 贴出来 大家 分享 呵呵using System;
    using System.Collections.Generic;
    using System.Text;using System.Data.SqlClient;
    using System.Configuration;
    using System.Data;namespace Pj_DAL.Conn
    {
        public class SqlDB
        {
           // public static SqlConnection conn;    //隐藏这一行 
            public static SqlConnection Connection
            {
                get
                {
                   
                    string connectionString = ConfigurationManager.ConnectionStrings["sql"].ToString();                SqlConnection conn = new SqlConnection(connectionString);//在这里新建一个
                    if (conn.State == System.Data.ConnectionState.Closed)//增加一个判断语句
                    {
                        conn.Close();
                        conn.Open();
                    }
                    if (conn == null)
                    {
                        conn.Open();
                    }
                    else if (conn.State == System.Data.ConnectionState.Closed)
                    {
                        conn.Open();
                    }
                    else if (conn.State == System.Data.ConnectionState.Broken)
                    {
                        conn.Close();
                        conn.Open();
                    }
                    return conn;
                }
            }
            public static DataTable GetDataSet(string safeSql)
            {
                DataSet ds = new DataSet();
                using (SqlCommand cmd = new SqlCommand(safeSql, Connection))
                {
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    da.Fill(ds);
                }
                return ds.Tables[0];
                
            }
            //执行(增、删、改)返回受影响的行数
            public static int ExecuteCommand(string safeSql)
            {
                SqlCommand cmd = new SqlCommand(safeSql, Connection);
                int result = cmd.ExecuteNonQuery();
                return result;
            }
        }
    }