2009-11-23 52 views
0

你能解釋一下爲什麼我不能在程序中使用兩個datareader?爲什麼我不能在一個程序中使用兩個datareader?

下面是示例代碼:

Private Sub Do_Execute() 

    Dim conx as SqlConnection 
    Dim cmd1 as SqlCommand 
    Dim cmd2 as SqlCommand 

    Dim drd1 as SqlDataReader 
    Dim drd2 as SqlDataReader 

    conx = new SqlConnection("connection string") 
    conx.Open() 

    cmd1 = new SqlCommand("SELECT * FROM Category" , conx) 
    drd1 = cmd1.ExecuteReader() 

    While (drd1.Read()) 
    { 
     Reading Data From drd1 
    } 

    cmd2 = new SqlCommand("SELECT * FROM Stock" , conx) 
    drd2 = cmd2.ExecuteReader() 

    While (drd2.Read()) 
    { 
     Reading Data From drd2 
    } 

End Sub 

當我執行該程序時,它拋出的異常消息:「已經有一個打開DataReader的同夥與此命令必須先關閉」

當我在drd2初始化之前關閉drd1時。有用。

爲什麼我不能像上面的代碼一樣使用?請解釋我。提前致謝!

+1

總是關閉/處置您的SqlDataReaders。你應該爲你的SqlConnection做同樣的事情 – Brannon 2009-11-23 09:22:17

+0

是的Brannon!感謝您的建議!我最後關閉所有連接和閱讀器對象。 – RedsDevils 2009-11-23 09:35:21

回答

1

我以前沒有嘗試過,但應該可以。

閱讀Using Multiple Active Result Sets,並在MSDN


Enabling Multiple Active Result Sets請注意,這是SQL2005及以上。從文章的一個

摘錄:

要訪問使用 SqlDataReader的對象的SQL Server 以前版本的多個結果集,單獨 SqlConnection對象必須 每個SqlCommand對象使用。

+0

謝謝!我現在可以通過在我的連接中啓用MARS來使用它。 – RedsDevils 2009-11-23 09:27:37

1

This文章解釋了問題所在,並介紹瞭解決方案(如果您使用的是SQL Server)。該解決方案稱爲MARS或多個活動記錄集,並且可用於SQL Server 2005和更高版本。

+1

謝謝!你的回答對我的問題也很有用! – RedsDevils 2009-11-23 09:28:11

4

這是因爲你實際上共享相同的連接。

您可能需要:
1)用於每個SqlCommand的,這是你曾經有過這樣做

2)使用MARS(多個活動結果集的原始的方式不同的連接)here

+0

我用你的第二種方式!現在感謝它的工作! :) 非常感謝你!如果我使用不同的連接,那麼在使用不同連接和使用MARS之間的性能如何?你能回答我嗎? – RedsDevils 2009-11-23 09:29:54

+0

由於MARS是爲此目的而引入的,所以這就是我們要做的。採用多種連接方式,每個連接都需要db服務器資源,因此每個連接都會有一定的開銷。 另請參閱http://stackoverflow.com/questions/510899/multipleactiveresultsetstrue-or-multiple-connections – AdaTheDev 2009-11-23 09:37:51

相關問題