C#多线程 报:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。

q65817758 2011-07-07 03:22:59
一个线程跑的时候没有任何问题 。。。一开多线程就会报:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。


private static SqlConnection connection;

public static SqlConnection Connection
{
get
{
string connectionString = con;
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;
}


我知道是static SqlConnection connection 的问题。。

但我不知道该怎么改了 新手 。。学习中。。请大虾指点下。。给出代码 。。谢谢
...全文
410 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
遇到同样问题 求解 QQ:457100097
DENQH 2011-11-11
  • 打赏
  • 举报
回复
我认为这样多线程DataReader读取并不是很好,给数据库增加太大压力,建议使用Dataset
黄亮 2011-11-11
  • 打赏
  • 举报
回复
SqlServer默认不开始多事务模式,一次只能有一个DataReader,而多事务模式并非很完美容易出错,我们一般也不用,所以建议你多线程就开多个connection,用完后close,因为有线程池的缘故并不会影响性能。
a1156025449 2011-11-11
  • 打赏
  • 举报
回复
使用多线程时,最好对资源进行加锁,这样就不会同时操作资源的冲突了
zhqiao87 2011-11-11
  • 打赏
  • 举报
回复
建议楼主将你用的DataReader替换为DataTable或者Dataset,因为DataReader读取数据时,是不能关闭数据库连接的,假如,你另一个进程中取完数据以后,关闭了数据库连接,此时datareder就会直接报不能读的错误,这样的情况下,可能导致你的整个exe崩溃,我最近遇到这样的问题,Datareader明明是好的,但是主进程读取数据和其他线程读取数据关闭数据连接会发生冲突。
所以建议楼主将DataReader更改为DataTable或者DataSet。
另外就如9楼所言,不要关闭数据库连接。
sharpdevelop110 2011-07-07
  • 打赏
  • 举报
回复
多线程最近写的比较多,异步 同步 共享 独享 等待
打一个比方
假如 有一个房子有很多人进出,如果只有把钥匙怎么办?
解决办法自然就是门不锁,就好比你上面的 connection.close() 不关闭。

或者给每一个人配一个把钥匙,有人进来自己开门,==>即每次都实例化一个ado.net

因为线程在某种意义上是独立的。或者并行进行的
风之影子 2011-07-07
  • 打赏
  • 举报
回复
简单的说:就是每个线程用新的链接(用连接字符串New一个Connection使用);
孟子E章 2011-07-07
  • 打赏
  • 举报
回复
不关闭connection能行么

你试试不就知道了?
扑通 2011-07-07
  • 打赏
  • 举报
回复
/// <summary>
/// 互斥体
/// </summary>
private static System.Threading.Mutex mutex;


public void 执行reader的方法()
{
if (mutex == null)
mutex = new System.Threading.Mutex(false, "MutexLog");
mutex.WaitOne();
try
{
//执行reader的代码
}
catch(System.Exception ex)
{
throw ex;
}
finally
{
mutex.ReleaseMutex();
}
}
pvirusy 2011-07-07
  • 打赏
  • 举报
回复
两种方法:

1.
private static SqlConnection connection;
这里不要存变量了,每次都new SqlConnection(connectionString);

2.
多线程加锁

个人见解,未经实践,可能不对。
q65817758 2011-07-07
  • 打赏
  • 举报
回复
就没人回答么 在线继续急等
q65817758 2011-07-07
  • 打赏
  • 举报
回复
..原来是孟老师啊啊。。 我该怎么改。。。不关闭connection能行么
孟子E章 2011-07-07
  • 打赏
  • 举报
回复
connection是共享的,不能connection.Close
另外,这种情况下只能每次new SqlConnection(),而不是共享,DataReader是不能共享connection的
q65817758 2011-07-07
  • 打赏
  • 举报
回复
求各位高手。。。在线等。。急用。。

110,538

社区成员

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

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

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