尝试运行两个查询时,DataReader已经打开错误

时间:2010-11-10 11:37:01

标签: asp.net sqldatareader

我有几个查询需要运行一个链接服务器,一个不喜欢这个

    Dim InvestorLookup As String = "DECLARE @investor varchar(10), @linkedserver varchar(25), @sql varchar(1000) "
    InvestorLookup += "SELECT @investor = '" & investor & "', @linkedserver = '" & db & "', "
    InvestorLookup += "@sql = 'SELECT * FROM OPENQUERY(' +@linkedserver + ', ''SELECT * FROM db WHERE investor = ' + @investor + ' '')' EXEC(@sql)"
    Dim queryInvestorLookup  As SqlCommand = New SqlCommand(InvestorLookup , conn)

    Dim BondNoDR As SqlDataReader = queryInvestorLookup.ExecuteReader()

    Dim PasswordCheck As String = "DECLARE @investor varchar(10), @password varchar(20), @linkedserver varchar(25), @sql varchar(1000) "
    PasswordCheck += "SELECT @investor = '" + investor + "', @password = '" + password + "', @server = '" + db2 + "', "
    PasswordCheck += "@sql = 'SELECT * FROM @server WHERE investor = @investor AND password = ' + @password + ' '' EXEC(@sql)"
    Dim queryPasswordCheck As SqlCommand = New SqlCommand(PasswordCheck, conn)

    Dim PasswordDR As SqlDataReader = queryPasswordCheck.ExecuteReader()

据我所知,调试时查询都按预期运行,但我收到错误

There is already an open DataReader associated with this Command which must be closed first.

是否可以在两个不同的DataReader中运行两个查询。我需要稍后引用每个DataReader并从每个DataReader中选择值。

3 个答案:

答案 0 :(得分:1)

默认情况下,不可能同时打开两个SqlDataReader,共享同一个SqlConnection对象。您应该在调用第二个(queryPasswordCheck)之前关闭第一个(queryInvestorLookup)。

从设计和性能的角度来看,这是好的,因为对.NET的建议是尽可能晚地打开每个非托管资源(如数据库访问)并尽可能早地关闭。

另一种方法是启用MARS但是afaik只适用于Sql2005及以上版本。

第三种解决方案是使用相同的SqlDataReader发出两个查询,然后使用NextResults()方法导航。

答案 1 :(得分:0)

默认情况下,您无需在同一连接上打开dataReaders。所以你可以得到一个结果,把它放在DataTable中,然后得到另一个结果。或者你可以打开MARS

ADO.NET Multiple Active Resut Sets

答案 2 :(得分:0)

如果您使用的提供程序支持它,则可以通过将MultipleActiveResultSets = True添加到您正在使用的连接字符串来启用MARS(多个活动结果集)。