2009-07-09 57 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(); 
     } 
} 

是我在多線程情況下使用的模式,根本沒有問題。

這是連接池。