打开网站,有时候出现DataReader报错!!怎么解决

liuzhengdong007 2011-03-16 10:30:19
打开网站,有时候出现DataReader报错!!


报错如下:


“/”应用程序中的服务器错误。
________________________________________
已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:

[InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。]
System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) +4846116
System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +23
System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +287
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +94
LearnEng.DBUtility.DBHelper.GetDate(String helpType, String dateString) in E:\LearnEng2\LearnEng\DBUtility\DBHelper.cs:270
LearnEng.DAL.le_Grade.ListView() in E:\LearnEng2\LearnEng\DAL\le_Grade.cs:268
LearnEng.BLL.le_Grade.ListView() in E:\LearnEng2\LearnEng\BLL\le_Grade.cs:215
LearnEng.Web.EngWord.List() in E:\LearnEng2\LearnEng\Web\EngWord.aspx.cs:160
LearnEng.Web.EngWord.Page_Load(Object sender, EventArgs e) in E:\LearnEng2\LearnEng\Web\EngWord.aspx.cs:53
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627





连接代码如下:
public static SqlConnection Connection
{

get
{
string connString = ConfigurationManager.ConnectionStrings["conStr"].ToString();
if (connection == null)
{
connection = new SqlConnection(connString);
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;
}
}





/// <summary>
/// 无参数返回Table
/// </summary>
/// <param name="helpType"></param>
/// <param name="dateString"></param>
/// <returns></returns>
public static DataTable GetDate(string helpType, string dateString)
{
DataSet ds = new DataSet();
SqlCommand cmd = null;
if (helpType == "pro")
{
cmd = new SqlCommand();
cmd.Connection = Connection;
cmd.CommandText = dateString;
cmd.CommandType = CommandType.StoredProcedure;
}
else if (helpType == "sql")
{
cmd = new SqlCommand(dateString, Connection);
}
else
{
return null;
}
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
Connection.Close();
return ds.Tables[0];

}



...全文
250 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanqiang456 2011-03-17
  • 打赏
  • 举报
回复
如2楼说的,同一个连接 LZ要打开第2次``````
狼王_ 2011-03-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cpp2017 的回复:]
你的sqldatareader使用后没有关闭,同一个连接又要打开另一个,所以报错。
[/Quote]
顶。。。。。
liuzhengdong007 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 amandag 的回复:]
是调用DataReader的地方有问题,但你贴的代码没有包括它
[/Quote]

我没有用到DataReader
但是就是报这个错误
amandag 2011-03-16
  • 打赏
  • 举报
回复
是调用DataReader的地方有问题,但你贴的代码没有包括它
liuzhengdong007 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dongxinxi 的回复:]
DataReader是保持连接的,用了要记得关闭(包括各分支条件里头)
否则很容易就达到数据库连接数限制而抛异常
[/Quote]

知道,但不知道怎么关闭啊,我只会引用这些分装好的!!!
porschev 2011-03-16
  • 打赏
  • 举报
回复

有datareader对像在使用后没有关闭

检查数据访问层。。

及时释放资源
  • 打赏
  • 举报
回复
DataReader是保持连接的,用了要记得关闭(包括各分支条件里头)
否则很容易就达到数据库连接数限制而抛异常
liuzhengdong007 2011-03-16
  • 打赏
  • 举报
回复
我想改连接!!!
不是里面的代码
他说立马关闭!
不知道怎样,能立马关闭

public static SqlConnection Connection
{

get
{
string connString = ConfigurationManager.ConnectionStrings["conStr"].ToString();
if (connection == null)
{
connection = new SqlConnection(connString);
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;
}
}





/// <summary>
/// 无参数返回Table
/// </summary>
/// <param name="helpType"></param>
/// <param name="dateString"></param>
/// <returns></returns>
public static DataTable GetDate(string helpType, string dateString)
{
DataSet ds = new DataSet();
SqlCommand cmd = null;
if (helpType == "pro")
{
cmd = new SqlCommand();
cmd.Connection = Connection;
cmd.CommandText = dateString;
cmd.CommandType = CommandType.StoredProcedure;
}
else if (helpType == "sql")
{
cmd = new SqlCommand(dateString, Connection);
}
else
{
return null;
}
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
Connection.Close();
return ds.Tables[0];

}

cpp2017 2011-03-16
  • 打赏
  • 举报
回复
可以使用alan_219_2008的建议,改哪里要看你的代码。
liuzhengdong007 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 alan_219_2008 的回复:]
引用 2 楼 cpp2017 的回复:

你的sqldatareader使用后没有关闭,同一个连接又要打开另一个,所以报错。


用完立马关闭
放using内
[/Quote]

这个我没写过,怎么写啊!!!
修改哪些
alan_219_2008 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cpp2017 的回复:]

你的sqldatareader使用后没有关闭,同一个连接又要打开另一个,所以报错。
[/Quote]

用完立马关闭
放using内
SK_Aqi 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuzhengdong007 的回复:]
引用 1 楼 xialiluo 的回复:
是每次出现还是偶尔?

抑或是某个页面?

偶尔出现的,怎么解决好啊!
[/Quote]
还是得关闭啊!
xzpanyao 2011-03-16
  • 打赏
  • 举报
回复
datareader一定要记得关闭,如果你怕忘了就用using,自动关闭的
liuzhengdong007 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xialiluo 的回复:]
是每次出现还是偶尔?

抑或是某个页面?
[/Quote]
偶尔出现的,怎么解决好啊!
cpp2017 2011-03-16
  • 打赏
  • 举报
回复
你的sqldatareader使用后没有关闭,同一个连接又要打开另一个,所以报错。
离洛 2011-03-16
  • 打赏
  • 举报
回复


是每次出现还是偶尔?

抑或是某个页面?
子夜__ 2011-03-16
  • 打赏
  • 举报
回复
让他自动关闭就行了

dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
net5354 2011-03-16
  • 打赏
  • 举报
回复
if (connection == null)
{
connection = new SqlConnection(connString);
connection.Open();
}

connection.Close();
else if (connection.State == System.Data.ConnectionState.Closed)
{
connection.Open();
}
connection.Close();
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
}

葑神榜 2011-03-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xzpanyao 的回复:]
datareader一定要记得关闭,如果你怕忘了就用using,自动关闭的
[/Quote]
using (SqlDataReader dr)
{
。。。。
}
lifusong890910 2011-03-16
  • 打赏
  • 举报
回复
closed();
加载更多回复(4)

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧