2011-06-24 49 views
0

我有這樣的SQL:SQL從多個一份聲明中檢索值選擇

SELECT count (1) FROM users AS total_drafts WHERE version_replace = @sid 
SELECT count (1) AS unpublished_drafts FROM users WHERE version_replace = @sid AND moderated = 0 
SELECT * FROM users WHERE id = @sid ORDER By ID DESC 

這似乎是正確的。不過,我很難從結果中提取字段。在vb.net我使用這個代碼片段:

While r.Read() 
        Dim o_email As String = CStr(r("email")) 
        Dim o_first_name As String = CStr(r("first_name")) 
        Dim o_last_name As String = CStr(r("last_name")) 

這是造成此錯誤:System.IndexOutOfRangeException:電子郵件 我已經檢查了SQL被正確exucuted。我發佈的SQL只是簡單地替換了一個簡單的語句,它完美地提供給代碼片段。

這是爲什麼?如何糾正?

正確的方法:

While r.Read() 
        total_drafts = CInt(r("total_drafts")) 
       End While 

       r.NextResult() 
       While r.Read() 
        unpublished_drafts = CInt(r("unpublished_drafts")) 
       End While 

       error_status.Text = total_drafts & " " & unpublished_drafts 

       r.NextResult() 
       While r.Read() 
        Dim o_email As String = CStr(r("email")) 
        Dim o_first_name As String = CStr(r("first_name")) 
        Dim o_last_name As String = CStr(r("last_name")) 
+0

爲什麼你不試一試列索引而不是列名,這可能會幫助你。 –

+0

你能發佈一個示例輸出(來自SQL)嗎? – StevieG

回答

1

編輯:中r.NextResult()代替r.ReadNext()r.ReadNext()是一個DataTableReader

假設你正在呼籲整個SQL語句一氣呵成,問題是r.Read()將使用爲第一個語句返回的第一個數據表(SELECT count (1) FROM users AS total_drafts WHERE version_replace = @sid),該表不包含電子郵件等字段。

你必須調用r.NextResult()兩次,這將移動的DataReader到第3集將從SELECT * FROM users WHERE id = @sid ORDER By ID DESC

+0

我是否在第一個r.Read while循環中調用r.ReadNext或不在? – YsoL8

+0

之前第一次,看編輯 –

+0

乾杯,它很棒 – YsoL8

0

包含的數據據我可以理解你想執行多個語句,對不對?
您應該用分號分隔SQL語句,並在完成之前的one時更改閱讀器。

UPDATE:

我通常使用存儲過程和計數器返回參數。 類似這樣的:

CREATE PROCEDURE usp_GetUsers (@sid INT, @unpublished INT OUTPUT) 

AS 
BEGIN 

DECLARE @total_drafts INT 
DECLARE @unpublished_drafts INT; 

SELECT @total_drafts = count (1) FROM users WHERE version_replace = @sid 
SELECT @unpublished_drafts = count (1) FROM users WHERE version_replace = @sid AND moderated = 0 

SELECT * FROM users WHERE id = @sid ORDER By ID DESC 

    RETURN(@total_drafts) 

END 
0

您正在返回三個數據集。如果「r」是一個DataReader(不清楚你的問題),那麼你需要打電話;

r.NextResult

你的代碼行之間,像這樣;

While r.Read()      
    Dim o_email As String = CStr(r("email"))  
    r.NextResult()    
    Dim o_first_name As String = CStr(r("first_name")) 
    r.NextResult()     
    Dim o_last_name As String = CStr(r("last_name")) 

另外一個可能的解釋(再次,不清楚)就是你搞砸了你的第一個列名(「郵件」),這也給了超出範圍的異常。