2009-07-09 44 views
0

我正在使用C#+ .Net 3.5 + VSTS 2008 + ADO.Net + SQL Server 2008.我正在共享一个单独的SQL连接对象(TestDBConnection变量,在下面的示例中)在我的应用程序。ADO.Net DataReader错误:已打开DataReader

我遇到的例外情况是“已经有一个打开的DataReader与这个Command关联,必须先关闭它......”任何想法有什么问题?

我正在使用的应用程序中的模式都是这样的,即共享单个数据库连接对象TestDBConnection,并使用单个TestDBConnection变量在其上创建命令并执行存储过程。

 using (SqlCommand testCommand = new SqlCommand()) 
     { 
      testCommand.Connection = TestDBConnection; 
      testCommand.CommandType = CommandType.StoredProcedure; 
      testCommand.CommandText = "prc_AddOrderStatus"; 
      testCommand.Parameters.Add("@orderID", SqlDbType.NVarChar).Value = orderID; 
      testCommand.ExecuteNonQuery(); 
     } 

由于事先 乔治

回答

7

不要共享连接,使用connection pooling instead。如果您在连接上同时执行两项操作,则可能需要查看MARS

对于测试,请将此内容添加到您的连接字符串:;MultipleActiveResultSets=True;,看看这是否“修复”错误。很多人相信你应该avoid using MARS,所以这是要考虑的事情。

+0

感谢RichardOD,共享连接对象是我的问题的根源?是否有任何提到一个连接的文档用于查询命令A,我们不能将它用于命令B? – George2 2009-07-09 08:21:49

+0

那么从你在John的回答评论中描述的情况来看,它看起来像你有一些严重的多线程问题。您可以使用同一个连接与多个命令(在同一个线程中),但推荐的方法是使用连接池。如果您一次使用多个SQL Server命令,则需要考虑使用MARS。首先解决线程/共享连接问题,您的问题可能会消失。在你的情况下,我不认为你需要MARS。 HTH。 – RichardOD 2009-07-09 08:30:13

1

乔治,这个例外是否有可能告诉你事实真相?是否还有其他命令已经启动但尚未完成?

+0

“有没有其他的命令,你已经开始但尚未完成?” - 我认为这是根本原因,因为我的应用程序是多线程的,每个线程可以使用我提到的模式执行查询。任何想法或解决方案? – George2 2009-07-09 07:53:21

2
using (sqlConnection theconnection = new sqlconnection(initialise it)) 
{ 
using (SqlCommand testCommand = new SqlCommand()) 
     { 
      testCommand.Connection = theConnection 
      testCommand.CommandType = CommandType.StoredProcedure; 
      testCommand.CommandText = "prc_AddOrderStatus"; 
      testCommand.Parameters.Add("@orderID", SqlDbType.NVarChar).Value = orderID; 
      testCommand.ExecuteNonQuery(); 
     } 
} 

是我在多线程情况下使用的模式,根本没有问题。

这是连接池。