我在asp.net(c#)中,有一个查询功能:
dataset ds=dbhelpersql.getdataset("select * from ...");getdataset的代码如下:
public static dataset setdataset(string sqlstring)
{
open();
sqldataadapter adapter=new sqldataadapter(sqlstring,conncetion);
dataset dataset=new dataset();
adapter fill(dataset);
close();
retuern dataset;
}open()的代码如下:
public static open()
{
 if(connection==null)
{
connection=new sqlconnection(connectionstring);
}
if (connection.state.equals(connectionstate.closed))
connection.open();
}close()代码如下:
public static close()
{if(connection!=null)
{
connection.close();}当我在二台电脑上快速按下同一按钮一段时间,会出现“已有打开的与此命令相关联的DataReader,必须首先将它关闭”,在其他地方也有这个想象,我电脑系统是xp,sql2000
查了一下网上,说是要关闭datareader,不知如何处理,请高手指教,不胜感谢!

解决方案 »

  1.   

    怎么关呢,看了一些贴,又说打开之前先判断一下状态,是说将close()行放在open之前吧
      

  2.   

    晕死。
    所有的操作使用的是一个Connection,当然会出问题了。
      

  3.   

    asp.net 夜话之七:ADO.NET介绍
    ADO.NET是对Microsoft ActiveX Data Objects (ADO)一个跨时代的改进,它提供了平台互用性和可伸缩的数据访问。由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。事实上,接受数据的组件不一定要是ADO .NET组件,它可以是基于一个Microsoft Visual Studio的解决方案,也可以是任何运行在其它平台上的任何应用程序。以前做数据库访问的时候,需要一直与数据库保持连接,直到获取完所有满足需要的数据之后才会断开数据库连接,这种数据库访问方式称之为连接式数据访问技术。相比于以前的连接式数据访问技术,ADO.NET除了提供连接式数据访问技术之外,还提供了另一种断开式解决方案,那就是在内存中模拟一个数据库,也就是内存中的数据库。我们知道在实际的数据库技术中,每个数据库就是一个业务逻辑单元,一般来说这个数据库包含了实现一个应用软件或者一个网站所需要的全部数据。DataAdapter对象
    DataAdapter对象也称之为数据适配器对象,DataAdapter对象利用数据库连接对象(Connection)连接的数据源,使用数据库命令对象(Command)规定的操作从数据源中检索出数据送往数据集对象(DataSet),或者将数据集中经过编辑后的数据送回数据源。
    数据适配器将数据填入数据集时调用方法Fill(),语句如下:   1. dataAdapter1.Fill (dataTable);//直接填充表  或者   1. dataAdapter1.Fill (dataSet11, "Products");//填充dataSet11数据集中的"Products"表当dataAdapter1调用Fill() 方法时将使用与之相关联的命令组件所指定的 SELECT 语句从数据源中检索行。然后将行中的数据添加到 DataSet 中的DataTable 对象中或者直接填充到DataTable的实例中,如果 DataTable 对象不存在,则自动创建该对象。
    当执行上述SELECT语句时,与数据库的连接必须有效,但不需要用语句将连接对象打开。如果调用Fill()方法之前与数据库的连接已经关闭,则将自动打开它以检索数据,执行完毕后再自动将其关闭。如果调用Fill()方法之前连接对象已经打开,则检索后继续保持打开状态。
    注意:一个数据集中可以放置多张数据表。但是每个数据适配器只能够对应于一张数据表。
      

  4.   

    你是培训学校的吧?
    那种把Connection弄成Static的好像那些培训学校很常见。
    这么做第一次使用没有什么问题,第二次的时候Connection关闭掉了,释放掉了,你还Open()自然报错了。
      

  5.   

    你不要写成静态的,静态的相当一个全局变量,谁都可以改你第一台电脑打开的时候,还没有来的及执行conn.Close(),此时
    第二台电脑再调用setdataset就会报你说的那个错误using SqlHelper.cs
      

  6.   

    我是买了一本书学习c#.net的,能否具体写几行代码,点按钮首先还是可以的,多了就报错了
      

  7.   

    谢谢了,到底怎么做呢,不写成静态,怎么写?带几行具体的代码好吗,用二个connecton.哎
      

  8.   

    看了一些贴,说是打开之前下能判断,故将close()放在open()之前,还是不行
      

  9.   

    SqlDataReader 要先关闭,再执行ExecuteNonQuery操作
    dr.Read();
    int logid = Convert.ToInt32(dr["ID"]);
    dr.Close();

    using (SqlDataReader dr1 = cmd1.ExecuteReader())
                    {
                        while (dr1.Read())
                        {
                            
                            SqlConnection cn2 = new SqlConnection(connectionString);
                            SqlCommand cmd2 = new SqlCommand("", cn2);
                           
                        }
                    }
      

  10.   

    程序里没有SqlDataReader:
     public static dataset setdataset(string sqlstring)
    {
    open();
    sqldataadapter adapter=new sqldataadapter(sqlstring,conncetion);
    dataset dataset=new dataset();
    adapter fill(dataset);
    close();
    retuern dataset;
    }
      

  11.   

    public static dataset setdataset(string sqlstring)
    {
    open();
    sqldataadapter adapter=new sqldataadapter(sqlstring,conncetion);
    dataset dataset=new dataset();
    adapter fill(dataset);
    close();
    retuern dataset;
    }open()的代码如下:
    public static open()
    {
    if(connection==null)
    {
    connection=new sqlconnection(connectionstring);
    }
    if (connection.state.equals(connectionstate.closed))
    connection.open();
    }close()代码如下:
    public static close()
    {if(connection!=null)
    {
    connection.close();}
      

  12.   

    csdn人气还是旺啊,但还没有解决这个问题,我觉得要改一改论坛管理方法,到这来提问的,肯定急于想知道答案,说实话,出点钱都是可以的,那位提出一个具体可行的方案来,
      

  13.   

    没有用datareader的,点一段时间、还是可以,点久了就不行,
      

  14.   

    数据库操作看看sqlhelper
    using(SqlConnetion conn=new SqlConnetion(""))
    {}
      

  15.   

    只从这段代码看,与DataReader无关呀,好像就是“公共变量”connection所致吧,建议不在万不得已的情况下,不要使用“公共变量”,改成这样试下:
    public static dataset setdataset(string sqlstring)
    {
    //这里定义局部变量connection,connection作用域不就在此范围了;缺点是服务器内存占用多,当同时访问的人多时,你可以在close()里connection.Dispose()补偿下
    sqlconnection connection=new ...open();
    sqldataadapter adapter=new sqldataadapter(sqlstring,conncetion);
    dataset dataset=new dataset();
    adapter fill(dataset);
    close();
    retuern dataset;
    }
      

  16.   

    奥,你open()里具体连接库了
    那这样,只声明下,写成这样:
    public static dataset setdataset(string sqlstring)
    {
    //这里定义局部变量connection,connection作用域不就在此范围了;缺点是服务器内存占用多,当同时访问的人多时,你可以在close()里connection.Dispose()补偿下
    sqlconnection connection;  //把你原来静态的conncetion删除
    open();
    sqldataadapter adapter=new sqldataadapter(sqlstring,conncetion);
    dataset dataset=new dataset();
    adapter fill(dataset);
    close();
    retuern dataset;
    }
      

  17.   

    程序是这样的,也不知道怎么改啊
    using System.Text;namespace ZWL.DBUtility
    {
        /// <summary>
        /// 数据访问抽象基础类
        /// Copyright (C) 2004-2008 By zwl 
        /// </summary>
        public abstract class DbHelperSQL
        {
            private static readonly string RETURNVALUE = "RETURNVALUE";
            public DbHelperSQL()
            {        }
             //定义连接字符串。
            protected static string ConnectionString = DecryptDBStr(ConfigurationManager.AppSettings["SQLConnectionString"], "zhangweilong");
            protected static SqlConnection Connection;
            protected static SqlConnection Connection1;
            //定义数据库的打开和关闭方法
            protected static void Open()
            {
                if (Connection == null)
                {
                    Connection = new SqlConnection(ConnectionString);
                }
                if (Connection.State.Equals(ConnectionState.Closed))
                {
                    Connection.Open();
                }
            }
      

  18.   

    你贴出的程序本身没有错误SetDataSet,但是你的程序调用的是
    dataset ds=dbhelpersql.getdataset("select * from ...");
    没有调用 SetDataSet, 调用的是GetDataSet 
    请帖出GetDataSet
      

  19.   

    getdataset写成setdataset了,不好意思
      

  20.   

    还是人生如梦“using(SqlConnetion conn=new SqlConnetion(""))”这句话,提示了我,谢谢啊