代码之家  ›  专栏  ›  技术社区  ›  Jamie Taylor

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

  •  0
  • Jamie Taylor  · 技术社区  · 14 年前

    我有两个查询,一个需要运行到链接服务器,另一个不需要这样

        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.
    

    3 回复  |  直到 14 年前
        1
  •  1
  •   tucaz    14 年前

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

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

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

        2
  •  0
  •   Shiv Kumar    14 年前
        3
  •  0
  •   Waleed Al-Balooshi    14 年前

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