ExecuteReader的关闭

dabendano 2009-12-09 02:34:28
平时自己用着没事,当访问的人数多的时候会出现
在每个SqlDataReader中都用using扩起来了,helper中也用ExecuteReader(CommandBehavior.CloseConnection)了,出现:

1.已有打开的与此命令相关联的 DataReader,必须首先将它关闭
2.ExecuteReader 要求已打开且可用的连接。连接的当前状态为正在连接。
等错误,如何解决?
...全文
685 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dabendano 2009-12-09
  • 打赏
  • 举报
回复
好啦,谢谢大家了,的确connection应该在加个判断,如果是打开的先关掉再打开
这样对么?这样就不报错了,只是这个helper是老师给的,我觉得不应该在这种地方会有错误吧,哎~
my51f12w 2009-12-09
  • 打赏
  • 举报
回复
确保当前的资源已关闭,可进行下次访问
dabendano 2009-12-09
  • 打赏
  • 举报
回复
public static List<SMSList> GetSMS(string sql)
{
try
{
List<SMSList> smsList = new List<SMSList>();

using(SqlDataReader dataReader = DBHelper.ExecuteReader(sql))
{
while (dataReader.Read())
{
SMSList sms = new SMSList();
sms.User = Convert.ToInt32(dataReader["User"]);
sms.Id = Convert.ToInt32(dataReader["Id"]);
sms.Mobiles = dataReader["Mobiles"].ToString();
sms.Message = dataReader["Message"].ToString();
sms.State = Convert.ToInt32(dataReader["State"]);
sms.SendTime = Convert.ToDateTime(dataReader["SendTime"]);

smsList.Add(sms);
}
}
return smsList;
}
catch (Exception ex)
{
er.WriteSensitive(ex);
return null;
}
}
就这个样子咯
stning 2009-12-09
  • 打赏
  • 举报
回复
确认connection有被调用哦
dabendano 2009-12-09
  • 打赏
  • 举报
回复
把using都换成close还是有错

“锁定数据库连接对象。然后连接,执行,完了以后关闭。。释放对象”
怎么锁定?
stning 2009-12-09
  • 打赏
  • 举报
回复
using(SqlDataReader dataReader = DBHelper.ExecuteReader(sql, p))
{
if (dataReader.Read())
{
u.Id = Convert.ToInt32(dataReader["Id"]);
}
}
这个函数贴完整
kkkkkkmn 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zetee 的回复:]
using扩起来 本人强烈要求不要

要应该这样
try{
..
}
catch()
{...}
fin..{...}

原因方便写日记,和处理



[/Quote]
hao
spook0621 2009-12-09
  • 打赏
  • 举报
回复
我的做法很简单,连接每次使用完毕以后,就关闭。如果实在要纠结USING语句,那么可以换成使用,然后关闭。我控制台程序的做法是这样的,多线程环境下:
锁定数据库连接对象。然后连接,执行,完了以后关闭。。释放对象。
dabendano 2009-12-09
  • 打赏
  • 举报
回复

using(SqlDataReader dataReader = DBHelper.ExecuteReader(sql, p))
{
if (dataReader.Read())
{
u.Id = Convert.ToInt32(dataReader["Id"]);
}
}

//helper
public static SqlDataReader ExecuteReader(string safeSql)
{
SqlCommand cmd = new SqlCommand(safeSql, Connection);
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}

stning 2009-12-09
  • 打赏
  • 举报
回复
你把你那个using的整个函数发上来看一下吧
dabendano 2009-12-09
  • 打赏
  • 举报
回复
helper中加入判读了
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;
freeboy827 2009-12-09
  • 打赏
  • 举报
回复
先关闭以前用的CONN,再打开就行了
sysudzx 2009-12-09
  • 打赏
  • 举报
回复
判断是下当前connection是否处于连接状态,如果是的话,就不用open,否则open
dabendano 2009-12-09
  • 打赏
  • 举报
回复
楼上是插入啊,我说的是executeReader啊,插入我这个没问题
还有就是不是说using相当于close掉了么,难道有什么问题?
stning 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dabendano 的回复:]
引用 1 楼 stning 的回复:
using后,出了{}就销毁了。那么你其他地方用到这个对象就会出现问题。
你应该在SqlDataReader调用完了后,确认是都调用完了。在close(),然后Dispose().就行了。

using不是相当于close了么?

using(datareader=helper.exreader(sql)){
  while(..){
  ..
  }
}
这个样子不对么?如果错着呢,正确的如怎么写?能给写个小例子么
[/Quote]是相当于close。不过你在其他地方有调用到你写的这个方法吗?还有你方法的返回值是不是SqlDataReader
悔说话的哑巴 2009-12-09
  • 打赏
  • 举报
回复
public override void Undo()
{
SetButtonMode(MaintenanceMode.Read);
this.butSearch.Enabled = true;
disableControl();
base.Undo();
}

/// <summary>
/// 保存过程
/// </summary>
/// <returns></returns>
private bool _DoSaved()
{

DataTable dt=(DataTable)binSearch.DataSource;

bool blnSave = true;

_db.Connect();
_db.BeginTransaction();
try
{

for (int i = 0; i < dt.DefaultView.Count; i++)//主撞颜色表
{

switch (dt.DefaultView[i].Row.RowState)
{
case DataRowState.Modified:

IDbCommand insCmd = _db.GetCommand("usp_UpdOrderPlanning");
insCmd.CommandType = CommandType.StoredProcedure;
insCmd.Parameters.Add(_db.GetParameter("@intOrderID", dt.DefaultView[i].Row["OrderID"]));
insCmd.Parameters.Add(_db.GetParameter("@TeamID", dt.DefaultView[i].Row["TeamID"]));
insCmd.Parameters.Add(_db.GetParameter("@dPlanWIPStart", dt.DefaultView[i].Row["dPlanWIPStart"]));
insCmd.Parameters.Add(_db.GetParameter("@dCutting", dt.DefaultView[i].Row["dCutting"]));
insCmd.Parameters.Add(_db.GetParameter("@dPlanWIPFinish", dt.DefaultView[i].Row["dPlanWIPFinish"]));
insCmd.Parameters.Add(_db.GetParameter("@dWIPStart", dt.DefaultView[i].Row["dWIPStart"]));
insCmd.Parameters.Add(_db.GetParameter("@cSewingStatus", dt.DefaultView[i].Row["cSewingStatus"]));
insCmd.Parameters.Add(_db.GetParameter("@cTeamRemark", dt.DefaultView[i].Row["cTeamRemark"]));
insCmd.Parameters.Add(_db.GetParameter("@dPacking", dt.DefaultView[i].Row["dPacking"]));
insCmd.Parameters.Add(_db.GetParameter("@EditedBy",GlobalService.LoginSession.UserID));
insCmd.Parameters.Add(_db.GetParameter("@dBOM", dt.DefaultView[i].Row["dBOM"]));

insCmd.Parameters.Add(_db.GetParameter("@dPaperSample", dt.DefaultView[i].Row["dPaperSample"]));
insCmd.Parameters.Add(_db.GetParameter("@dPlanPur", dt.DefaultView[i].Row["dPlanPur"]));

insCmd.Parameters.Add(_db.GetParameter("@dMaterialRece", dt.DefaultView[i].Row["dMaterialRece"]));

insCmd.Parameters.Add(_db.GetParameter("@dMainMatReqPur", dt.DefaultView[i].Row["dMainMatReqPur"]));
insCmd.Parameters.Add(_db.GetParameter("@dMainMatIssue", dt.DefaultView[i].Row["dMainMatIssue"]));
insCmd.Parameters.Add(_db.GetParameter("@cMainMatStatus", dt.DefaultView[i].Row["cMainMatStatus"]));
insCmd.Parameters.Add(_db.GetParameter("@cSupMatStatus", dt.DefaultView[i].Row["cSupMatStatus"]));
insCmd.Parameters.Add(_db.GetParameter("@cRemarks", dt.DefaultView[i].Row["cRemarks"]));

insCmd.Parameters.Add(_db.GetParameter("@WipCompleted", dt.DefaultView[i].Row["WipCompleted"]));



insCmd.ExecuteNonQuery();

break;

}
}

_db.CommitTransaction();

}
catch (Exception ex)
{
_db.RollbackTransaction();
blnSave = false;
MessageBox.Show(ex.Message);
}
finally
{
_db.Disconnect();
}
return blnSave;
}
悔说话的哑巴 2009-12-09
  • 打赏
  • 举报
回复
一般来说 都是close(),然后Dispose().就行了
zetee 2009-12-09
  • 打赏
  • 举报
回复
using扩起来 本人强烈要求不要

要应该这样
try{
..
}
catch()
{...}
fin..{...}

原因方便写日记,和处理






dabendano 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 stning 的回复:]
using后,出了{}就销毁了。那么你其他地方用到这个对象就会出现问题。
你应该在SqlDataReader调用完了后,确认是都调用完了。在close(),然后Dispose().就行了。
[/Quote]
using不是相当于close了么?

using(datareader=helper.exreader(sql)){
while(..){
..
}
}
这个样子不对么?如果错着呢,正确的如怎么写?能给写个小例子么
stning 2009-12-09
  • 打赏
  • 举报
回复
using就是标示出了这个方法体,该对象标示为要销毁。如果被销毁了,那你其他地方调用到的肯定就有问题。
加载更多回复(1)

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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