系统的运行环境是:.net framework 2.0 ,sql server 2000(sp4),windows 2000;
当在线的人数不多时,基本上没错,人稍微多点就会有一些奇怪的错误,请大家帮忙解决,谢谢~!@错误一:
用户IP:192.168.7.242
计算机名:192.168.7.242
发生时间:2008-1-10 10:38:04
发生异常页: http://192.168.0.2:8088/TaskAdd.aspx
异常信息: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。错误源:System.Data
堆栈信息: 在 System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
在 System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
在 System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
在 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
在 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
在 DataAccess.Archives.SelectArchivesDynamic(String WhereCondition, String OrderByExpression) 位置 f:\oasys\App_Code\DataAccess\Archives.cs:行号 60
在 Bussiness.ArchivesBLL.SelectArchivesDynamic(String WhereCondition, String OrderByExpression) 位置 f:\oasys\App_Code\Bussiness\ArchivesBLL.cs:行号 43
在 TaskDispatch.DropDispatchOrg_SelectedIndexChanged(Object sender, EventArgs e) 位置 f:\oasys\TaskAdd.aspx.cs:行号 80
在 System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
在 System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
在 System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
在 System.Web.UI.Page.RaiseChangedEvents()
在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
------------------------------------------------------------
Archives.cs的那个函数 /// <summary>
/// 根据条件查询档案
/// </summary>
/// <param name="WhereCondition"></param>
/// <param name="OrderByExpression"></param>
/// <returns></returns>
public DataTable SelectArchivesDynamic(string WhereCondition, string OrderByExpression)
{
DataTable dt = new DataTable();
SqlCommand comm = new SqlCommand("SelectArchivesDynamic", conn.Conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@WhereCondition", SqlDbType.NVarChar, 500);
comm.Parameters["@WhereCondition"].Value = WhereCondition;
comm.Parameters["@WhereCondition"].Direction = System.Data.ParameterDirection.Input;
comm.Parameters.Add("@OrderByExpression", SqlDbType.NVarChar, 250);
comm.Parameters["@OrderByExpression"].Value = OrderByExpression;
comm.Parameters["@OrderByExpression"].Direction = System.Data.ParameterDirection.Input;
SqlDataAdapter adapter = new SqlDataAdapter(comm);
adapter.Fill(dt); //就是这行报错了,
//adapter.Dispose();
if (conn.Conn.State == ConnectionState.Open)
conn.Conn.Close();
return dt;
}问题是我在整个系统中都没有用
DataReader这个类,而且有时候刷新下又好了,到底是怎么回事啊?
当在线的人数不多时,基本上没错,人稍微多点就会有一些奇怪的错误,请大家帮忙解决,谢谢~!@错误一:
用户IP:192.168.7.242
计算机名:192.168.7.242
发生时间:2008-1-10 10:38:04
发生异常页: http://192.168.0.2:8088/TaskAdd.aspx
异常信息: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。错误源:System.Data
堆栈信息: 在 System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command)
在 System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command)
在 System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
在 System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
在 System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
在 DataAccess.Archives.SelectArchivesDynamic(String WhereCondition, String OrderByExpression) 位置 f:\oasys\App_Code\DataAccess\Archives.cs:行号 60
在 Bussiness.ArchivesBLL.SelectArchivesDynamic(String WhereCondition, String OrderByExpression) 位置 f:\oasys\App_Code\Bussiness\ArchivesBLL.cs:行号 43
在 TaskDispatch.DropDispatchOrg_SelectedIndexChanged(Object sender, EventArgs e) 位置 f:\oasys\TaskAdd.aspx.cs:行号 80
在 System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e)
在 System.Web.UI.WebControls.DropDownList.RaisePostDataChangedEvent()
在 System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent()
在 System.Web.UI.Page.RaiseChangedEvents()
在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
------------------------------------------------------------
Archives.cs的那个函数 /// <summary>
/// 根据条件查询档案
/// </summary>
/// <param name="WhereCondition"></param>
/// <param name="OrderByExpression"></param>
/// <returns></returns>
public DataTable SelectArchivesDynamic(string WhereCondition, string OrderByExpression)
{
DataTable dt = new DataTable();
SqlCommand comm = new SqlCommand("SelectArchivesDynamic", conn.Conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@WhereCondition", SqlDbType.NVarChar, 500);
comm.Parameters["@WhereCondition"].Value = WhereCondition;
comm.Parameters["@WhereCondition"].Direction = System.Data.ParameterDirection.Input;
comm.Parameters.Add("@OrderByExpression", SqlDbType.NVarChar, 250);
comm.Parameters["@OrderByExpression"].Value = OrderByExpression;
comm.Parameters["@OrderByExpression"].Direction = System.Data.ParameterDirection.Input;
SqlDataAdapter adapter = new SqlDataAdapter(comm);
adapter.Fill(dt); //就是这行报错了,
//adapter.Dispose();
if (conn.Conn.State == ConnectionState.Open)
conn.Conn.Close();
return dt;
}问题是我在整个系统中都没有用
DataReader这个类,而且有时候刷新下又好了,到底是怎么回事啊?
dr1.close
但是整个系统中我没有用到DataReader对象啊,而且有时刷新下就好了
我该到那里去关闭DataReader对象呢
SqlDataReader reader = null;
reader = ....
if(reader != null)// 还有个壮态忘了怎么写的了, reader.State != SqlDataReader.Closed
{
reader.Close();
}
if (conn.Conn.State == ConnectionState.Open)
conn.Conn.Close(); 整个系统中我没有用到DataReader对象啊,而且有时刷新下就好了
我该到那里去关闭DataReader对象呢 希望大家看看代码
Connection1.Open()
Connection1.Close()
还有:
SqlDataReader.Close()
整个系统中我没有用到DataReader对象啊,而且有时刷新下就好了
我该到那里去关闭DataReader对象呢
SqlCommand comm = new SqlCommand("SelectArchivesDynamic", conn.Conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@WhereCondition", SqlDbType.NVarChar, 500);
comm.Parameters["@WhereCondition"].Value = WhereCondition;
comm.Parameters["@WhereCondition"].Direction = System.Data.ParameterDirection.Input;
comm.Parameters.Add("@OrderByExpression", SqlDbType.NVarChar, 250);
comm.Parameters["@OrderByExpression"].Value = OrderByExpression;
comm.Parameters["@OrderByExpression"].Direction = System.Data.ParameterDirection.Input;
SqlDataAdapter adapter = new SqlDataAdapter(comm);
adapter.Fill(dt); //修改一下,试试呢 SqlDataReader.Close() ;
if (conn.Conn.State != ConnectionState.Close)
conn.Conn.Close();
这个我的系统中没有啊,怎么关闭呢
if (conn.Conn.State != ConnectionState.Close)
conn.Conn.Close();
如果conn.Conn.State的状态处于其他的状态,但是还关闭是不是会有其他的错误啊
用完dr.close(),可以关闭conn实在找不着,换用sqlhelper这种类来操作试试
我的所有的数据库连接完后,如果状态是打开的都关闭了
if (conn.Conn.State == ConnectionState.Open)
conn.Conn.Close();
还有整个系统中没有用到DataReader对象,我该怎么关闭呢。
一般情况下,人不多时都是好的,有时刷新又是好的。
是用.net2.0开发的
晚上高峰的时候看着看着就出你这个问题!刷一下又好了!
后来这个网站说已经解决了这个问题!
你可以问问他们站长是怎么解决的
public DataTable SelectArchivesDynamic(string WhereCondition, string OrderByExpression)
{
DataTable dt = new DataTable();
if (conn.Conn.State != ConnectionState.Closed)
conn.Conn.Close();
conn.Conn.Open();
SqlCommand comm = new SqlCommand("SelectArchivesDynamic", conn.Conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add("@WhereCondition", SqlDbType.NVarChar, 500);
comm.Parameters["@WhereCondition"].Value = WhereCondition;
comm.Parameters["@WhereCondition"].Direction = System.Data.ParameterDirection.Input;
comm.Parameters.Add("@OrderByExpression", SqlDbType.NVarChar, 250);
comm.Parameters["@OrderByExpression"].Value = OrderByExpression;
comm.Parameters["@OrderByExpression"].Direction = System.Data.ParameterDirection.Input;
SqlDataAdapter adapter = new SqlDataAdapter(comm);
adapter.Fill(dt); //就是这行报错了,
//adapter.Dispose();
if (conn.Conn.State != ConnectionState.Closed)
conn.Conn.Close();
return dt;
}
改成上面试试~
comm.Parameters.Add("@WhereCondition", SqlDbType.NVarChar, 500);
comm.Parameters["@WhereCondition"].Value = WhereCondition;
comm.Parameters["@WhereCondition"].Direction = System.Data.ParameterDirection.Input;
comm.Parameters.Add("@OrderByExpression", SqlDbType.NVarChar, 250);
comm.Parameters["@OrderByExpression"].Value = OrderByExpression;
comm.Parameters["@OrderByExpression"].Direction = System.Data.ParameterDirection.Input;
SqlDataAdapter adapter = new SqlDataAdapter(comm);
应该是在里面出了问题!你出现了2次ADD 可能这个操作就涉及到了DataReader了
你可以试下 30楼的解决方案。
你的代码中,conn不知道是sqlconn还是oledbconn?如果是后者,并且你的oledb驱动如果不新,那么在最后if(conn.Conn.State这句上,会有问题。
还有一个问题,你的代码没有使用异常处理机制,可能会有某种异常导致程序中断,而还没有执行到你的conn.Close上。
SqlCommand comm = new SqlCommand("SelectArchivesDynamic", conn.Conn);
这句不建议这么做,不要用全局的conn.Conn,用一个临时变量,重新初始化这个conection,然后在finally里面Close。最大的可能性,你仔细检查你所有的代码,看哪里忘记调用conn.Close了;其次,在所有数据库操作的地方,加上try/catch/finally处理。有不清楚的,可以msn我:[email protected]
如35楼所说,是因为设置了全局静态的conn的问题
把static去掉就好了,不过这个是我自己试出来的
但是还是要感谢大家
我用的sqlhelper,方法改成这个就好了.public static DataTable GetDataSet(string safeSql)
{
string connectionString = ConfigurationManager.ConnectionStrings["TaxDB"].ConnectionString;
SqlConnection conn = new SqlConnection(connectionString);
try
{
DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand(safeSql, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
return ds.Tables[0];
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
}