已有打开的与此命令相关联的 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()方法
...全文
3264 17 打赏 收藏 转发到动态 举报
写回复
用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,025

社区成员

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

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

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

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