我有几个查询需要运行一个链接服务器,一个不喜欢这个
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中选择值。
答案 0 :(得分:1)
默认情况下,不可能同时打开两个SqlDataReader,共享同一个SqlConnection对象。您应该在调用第二个(queryPasswordCheck)之前关闭第一个(queryInvestorLookup)。
从设计和性能的角度来看,这是好的,因为对.NET的建议是尽可能晚地打开每个非托管资源(如数据库访问)并尽可能早地关闭。
另一种方法是启用MARS但是afaik只适用于Sql2005及以上版本。
第三种解决方案是使用相同的SqlDataReader发出两个查询,然后使用NextResults()方法导航。
答案 1 :(得分:0)
默认情况下,您无需在同一连接上打开dataReaders。所以你可以得到一个结果,把它放在DataTable中,然后得到另一个结果。或者你可以打开MARS
答案 2 :(得分:0)
如果您使用的提供程序支持它,则可以通过将MultipleActiveResultSets = True添加到您正在使用的连接字符串来启用MARS(多个活动结果集)。