已有打开的与此命令相关联的 DataReader,必须首先将它关闭

j805440805 2010-12-30 03:28:50
public class SqlDB
{
private static SqlConnection connection; //构建连接字符串
public static SqlConnection Connection
{
get
{
string connectionString = ConfigurationManager.ConnectionStrings["sql"].ToString();//读取配置文件
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;
}
}
public static DataTable GetDataSet(string safeSql)
{
DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand(safeSql, Connection);
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds); //到这里是 报错 “已有打开的与此命令相关联的 DataReader,必须首先将它关闭 ” return ds.Tables[0];

}
//执行(增、删、改)返回受影响的行数
public static int ExecuteCommand(string safeSql)
{
SqlCommand cmd = new SqlCommand(safeSql, Connection);
int result = cmd.ExecuteNonQuery();
return result;
}
}

web.config 是这样写的 <add name="sql" connectionString="server=.;database=ProjectManage;uid=sa;pwd=webtba;Max Pool Size=512"/>
我用的 是 SqlServer 2000 vs2005 我所有 的查询都用这个方法完成GetDataSet(string safeSql) safeSql是sql语句
我在同一台电脑上运行 当一个用户在查询大量数据时 后面的人在查询就报“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。 两个用户都是调用 GetDataSet()方法
...全文
3288 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengpei99 2010-12-30
  • 打赏
  • 举报
回复
问题解决就好!
j805440805 2010-12-30
  • 打赏
  • 举报
回复
问题解决了 呵呵 贴出来 大家 分享 呵呵

using System;
using System.Collections.Generic;
using System.Text;

using System.Data.SqlClient;
using System.Configuration;
using System.Data;

namespace Pj_DAL.Conn
{
public class SqlDB
{
// public static SqlConnection conn; //隐藏这一行
public static SqlConnection Connection
{
get
{

string connectionString = ConfigurationManager.ConnectionStrings["sql"].ToString();

SqlConnection conn = new SqlConnection(connectionString);//在这里新建一个
if (conn.State == System.Data.ConnectionState.Closed)//增加一个判断语句
{
conn.Close();
conn.Open();
}
if (conn == null)
{
conn.Open();
}
else if (conn.State == System.Data.ConnectionState.Closed)
{
conn.Open();
}
else if (conn.State == System.Data.ConnectionState.Broken)
{
conn.Close();
conn.Open();
}
return conn;
}
}
public static DataTable GetDataSet(string safeSql)
{
DataSet ds = new DataSet();
using (SqlCommand cmd = new SqlCommand(safeSql, Connection))
{
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds);
}
return ds.Tables[0];

}
//执行(增、删、改)返回受影响的行数
public static int ExecuteCommand(string safeSql)
{
SqlCommand cmd = new SqlCommand(safeSql, Connection);
int result = cmd.ExecuteNonQuery();
return result;
}
}
}
j805440805 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zx75991 的回复:]
检查代码,datareader使用完必须关闭
[/Quote]如果 关键是我在哪关啊 我这个项目 都没的datareader 假如有一个用户在查询打开了datareader 但还没查询完 另一个用户 也要查该数据 就会如上错误
天下在我心 2010-12-30
  • 打赏
  • 举报
回复
检查代码,datareader使用完必须关闭
Issac25Name 2010-12-30
  • 打赏
  • 举报
回复
用DataSet——》DataTable吧,这个就不会出现那个问题了,以前刚学的时候也老是遇到这个问题,后来了解到用DataTable就不会出现这个问题。楼主用个试试吧!!!
j805440805 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ghost_khz 的回复:]
da.Fill(ds); 这里不一定就是DataReader了, 应该是你的Sqlconnection在其他地方正用着。
[/Quote]
这个肯定 没有 异常就是 在 SqlCommand cmd = new SqlCommand(safeSql, Connection);这段代码报出来的 开始写错了
Ghost_Khz 2010-12-30
  • 打赏
  • 举报
回复
da.Fill(ds); 这里不一定就是DataReader了, 应该是你的Sqlconnection在其他地方正用着。
j805440805 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyq11 的回复:]
SqlDataReader 要先关闭,再执行ExecuteNonQuery操作
using (SqlConnection cn = new SqlConnection(“”))
{
SqlCommand cmd1 = new SqlCommand("", cn);
cn.Open();
using (SqlDataReader dr1 = cmd1.ExecuteRead……
[/Quote]

我这 跟本就没 SqlDataReader
j805440805 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pittroll 的回复:]
用静态SqlConnection会出问题的。写个静态方法返回SqlConnection还是可以的。
[/Quote]这个我也试过没用 一样 报错
j805440805 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 j805440805 的回复:]
public class SqlDB
{
private static SqlConnection connection; //构建连接字符串
public static SqlConnection Connection
{
get
{
string connectionString = ConfigurationManager.ConnectionStr……
[/Quote]

这个 我试过 没有用
wuyq11 2010-12-30
  • 打赏
  • 举报
回复
SqlDataReader 要先关闭,再执行ExecuteNonQuery操作
using (SqlConnection cn = new SqlConnection(“”))
{
SqlCommand cmd1 = new SqlCommand("", cn);
cn.Open();
using (SqlDataReader dr1 = cmd1.ExecuteReader())
{
while (dr1.Read())
{
string sql= "";
SqlConnection conn2 = new SqlConnection("");
SqlCommand cmd2 = new SqlCommand(sql, conn2 );
cmd2.ExecuteNonQuery();
}
}

}
PitTroll 2010-12-30
  • 打赏
  • 举报
回复
用静态SqlConnection会出问题的。写个静态方法返回SqlConnection还是可以的。
mimangshamo 2010-12-30
  • 打赏
  • 举报
回复
路过,打酱油的
ycproc 2010-12-30
  • 打赏
  • 举报
回复
使用后 close() 建议用 datatable
微工程 2010-12-30
  • 打赏
  • 举报
回复
多用户访问DataReader的同一段代码,并不冲突
在一个用户ip访问中,一定要关闭后,再DataReader

检查DataReader打开没关的地方
rwdong2199 2010-12-30
  • 打赏
  • 举报
回复
调用完Close()
rwdong2199 2010-12-30
  • 打赏
  • 举报
回复
sqlDataReader没有关闭吧,你看看这个方法前面哪里有没有用到sqlDataReader
dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
加上CommandBehavior.CloseConnection这个枚举

62,243

社区成员

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

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

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

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