Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 多个DataReader错误,尽管有单独的连接_.net_Sql Server - Fatal编程技术网

.net 多个DataReader错误,尽管有单独的连接

.net 多个DataReader错误,尽管有单独的连接,.net,sql-server,.net,Sql Server,我在尝试连接到SQL Server Express数据库时收到错误“已经有一个与此命令关联的打开的DataReader,必须先关闭它” 这似乎是一个直截了当的解决办法是在火星上,但我不相信我的情况是合适的-特别是因为(我认为)我使用了两个独立的连接 下面是我用来复制该问题的最低代码。我认为,因为我有两个独立的连接(conn1和conn2),conn1上任何打开的读取器都不会影响conn2,但是当我尝试调用conn2.open()时,我得到了错误 Dim constr As String

我在尝试连接到SQL Server Express数据库时收到错误“已经有一个与此命令关联的打开的DataReader,必须先关闭它”

这似乎是一个直截了当的解决办法是在火星上,但我不相信我的情况是合适的-特别是因为(我认为)我使用了两个独立的连接

下面是我用来复制该问题的最低代码。我认为,因为我有两个独立的连接(conn1和conn2),conn1上任何打开的读取器都不会影响conn2,但是当我尝试调用conn2.open()时,我得到了错误

    Dim constr As String = "Initial Catalog=myDB;Data Source=(local);User ID=XXXX;Password=XXXX"

    Using conn1 = New SqlConnection(constr)
        Dim cmd1 As New SqlCommand("GetApprovals", conn1)
        cmd1.CommandType = CommandType.StoredProcedure
        cmd1.Parameters.AddWithValue("jobID", jobID)
        conn1.Open()
        Using reader1 = cmd1.ExecuteReader()
            Do While reader1.Read()
                Using conn2 = New SqlConnection(constr)
                    conn2.Open()
                End Using
            Loop
        End Using

    End Using
如有任何见解,将不胜感激


Cheers

默认情况下,SqlConnection对象将尝试将您的连接集合为相同的连接字符串

发件人:

第一次打开连接时,将根据将连接池与连接中的连接字符串相关联的精确匹配算法创建连接池。每个连接池都与一个不同的连接字符串相关联。打开新连接时,如果连接字符串与现有池不完全匹配,则会创建一个新池


您可以尝试将设置添加到连接字符串中,以强制为第二条语句打开新连接。

因此,问题与事务有关。我没有注意到的一个重要问题(我认为这与此无关)是,所讨论的代码是从MBUnit单元测试内部运行的

测试设置了Rollback()修饰符,从而运行事务中的所有内容。似乎在这个场景中,即使我显式地创建了一个新的SQLConnection,因为它在事务中,它也会重新使用连接,从而导致错误

    Dim constr As String = "Initial Catalog=myDB;Data Source=(local);User ID=XXXX;Password=XXXX"

    Using conn1 = New SqlConnection(constr)
        Dim cmd1 As New SqlCommand("GetApprovals", conn1)
        cmd1.CommandType = CommandType.StoredProcedure
        cmd1.Parameters.AddWithValue("jobID", jobID)
        conn1.Open()
        Using reader1 = cmd1.ExecuteReader()
            Do While reader1.Read()
                Using conn2 = New SqlConnection(constr)
                    conn2.Open()
                End Using
            Loop
        End Using

    End Using

修复方法是通过在用于初始化它的连接字符串的末尾追加“
;enst=false;
”来指示辅助/内部连接不在事务中登记。

设置
最大池大小=1
似乎只会导致等待可用连接的超时。然而,在测试这一点时,它让我走上了一条发现实际问题的道路。谢谢