我在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,不知如何处理,请高手指教,不胜感谢!
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,不知如何处理,请高手指教,不胜感谢!
所有的操作使用的是一个Connection,当然会出问题了。
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()方法之前连接对象已经打开,则检索后继续保持打开状态。
注意:一个数据集中可以放置多张数据表。但是每个数据适配器只能够对应于一张数据表。
那种把Connection弄成Static的好像那些培训学校很常见。
这么做第一次使用没有什么问题,第二次的时候Connection关闭掉了,释放掉了,你还Open()自然报错了。
第二台电脑再调用setdataset就会报你说的那个错误using SqlHelper.cs
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);
}
}
public static dataset setdataset(string sqlstring)
{
open();
sqldataadapter adapter=new sqldataadapter(sqlstring,conncetion);
dataset dataset=new dataset();
adapter fill(dataset);
close();
retuern dataset;
}
{
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();}
using(SqlConnetion conn=new SqlConnetion(""))
{}
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;
}
那这样,只声明下,写成这样:
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;
}
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();
}
}
dataset ds=dbhelpersql.getdataset("select * from ...");
没有调用 SetDataSet, 调用的是GetDataSet
请帖出GetDataSet