C# ADO.Net DataReader错误:已打开DataReader

C# ADO.Net DataReader错误:已打开DataReader,c#,.net,visual-studio-2008,sql-server-2008,ado.net,C#,.net,Visual Studio 2008,Sql Server 2008,Ado.net,我使用的是C++.NET3.5+VSTS2008+ADO.Net+SQLServer2008。我在应用程序中共享一个SQL连接对象(下面的示例中为TestDBConnection变量) 我遇到的一个例外是,“已经有一个与此命令相关联的打开的DataReader,必须先关闭它…”有什么问题吗 我正在使用的应用程序中的模式都是这样的,即共享单个db连接对象TestDBConnection,并使用单个TestDBConnection变量在其上创建命令并执行存储过程 using (Sql

我使用的是C++.NET3.5+VSTS2008+ADO.Net+SQLServer2008。我在应用程序中共享一个SQL连接对象(下面的示例中为TestDBConnection变量)

我遇到的一个例外是,“已经有一个与此命令相关联的打开的DataReader,必须先关闭它…”有什么问题吗

我正在使用的应用程序中的模式都是这样的,即共享单个db连接对象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();
        }
提前感谢,,
George

不要共享连接,请使用。如果您在连接上同时做两件事,您可能需要查看


对于测试,请将其添加到连接字符串:
;MultipleActiveResultSets=True
并查看此操作是否“修复”了错误。很多人认为你应该这样做,所以这是一个值得考虑的问题。乔治,有没有例外告诉你真相?是否有其他命令已启动但尚未完成

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();
        }
}
是我在多线程情况下使用的模式,没有任何问题


顺便说一句,这是连接池。

“是否还有其他命令已启动但尚未完成?”--我认为这是根本原因,因为我的应用程序是多线程的,每个线程都可能使用我提到的模式执行查询。有什么想法或解决办法吗?有。“不要那样做!”你可能甚至不需要多线程!请为每个命令执行创建一个新的SqlConnection对象。连接池将处理所有事情。@在多线程环境中共享相同的ADO.NET对象是危险的。您需要为每个多线程操作创建一个新的。快速查看文档将确认“任何实例成员都不能保证线程安全。”谢谢@RichardOD!所以你认为根本原因是线程安全问题,对吗?你的意思是(不是线程安全的)我正在以非线程安全的方式使用哪种方法?跨多个线程共享连接不是线程安全的。看看这个-它可能会有帮助:谢谢RichardOD,共享连接对象是我的问题的根本原因?是否有任何文档提到一个连接用于查询命令A,我们不能将其用于命令B?从John的回答评论中描述的情况来看,您似乎有一些严重的多线程问题。您可以将同一连接用于多个命令(在同一线程中),但建议使用连接池。如果您在SQL Server中一次使用多个命令,则需要研究如何使用MARS。首先修复线程/共享连接问题,您的问题可能会消失。就你而言,我认为你不需要火星。谢谢乌龟先生!1.在您的代码中,除了每次创建一个新的连接对象外,我们如何知道使用了连接池?我希望避免每次都创建连接对象。2.“草签”的意思是?乔治。默认情况下,SQL Server连接就是这样工作的。George,如果您在理解连接池的实际工作方式时遇到问题,请查看Reflector中的SqlConnection类。如果启用了连接池(默认情况下是这样),创建新的SqlConnection实例并不一定意味着您正在创建新的基础连接。只有在连接字符串不同的情况下禁用连接池,才能使用连接池。您可以通过查看ADO.NET性能计数器来检查这一点。我使用了initialise,因为我记不起构造函数是什么(我现在经常使用linq,因此ADO.NET正在衰退…我认为基本上是连接字符串)当您创建像这样的新连接时,.net将转到连接池并尝试重用现有连接。默认情况下,您使用此方法使用池,因此,除非richard指出您禁用了它,否则它都是为您管理的。我想如果conenction池已满,那么这将创建一个新连接。限制因素通常是查询执行+我发现的发送数据时间。