一个线程跑的时候没有任何问题 一开多线程就会报:已有打开的与此命令相关联的 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 的问题。。但我不知道该怎么改了 新手 。。学习中。。请大虾指点下。。给出代码 。。谢谢
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 的问题。。但我不知道该怎么改了 新手 。。学习中。。请大虾指点下。。给出代码 。。谢谢
另外,这种情况下只能每次new SqlConnection(),而不是共享,DataReader是不能共享connection的
private static SqlConnection connection;
这里不要存变量了,每次都new SqlConnection(connectionString);2.
多线程加锁个人见解,未经实践,可能不对。
/// 互斥体
/// </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();
}
}
打一个比方
假如 有一个房子有很多人进出,如果只有把钥匙怎么办?
解决办法自然就是门不锁,就好比你上面的 connection.close() 不关闭。或者给每一个人配一个把钥匙,有人进来自己开门,==>即每次都实例化一个ado.net 因为线程在某种意义上是独立的。或者并行进行的
所以建议楼主将DataReader更改为DataTable或者DataSet。
另外就如9楼所言,不要关闭数据库连接。