SQLは

2011-06-24 3 views
0

が、私はこのSQLを持って選択します。しかし、私は結果からフィールドを抽出するのが難しいです。このエラーの原因となっているSQLは

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")) 

:vb.netでは、私は、このコードの断片を使用しています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

EDITr.NextResult()代わりr.ReadNext()の、r.ReadNext()はあなたが一度に全体のSQL文を呼び出していると仮定すると、DataTableReader

用で、問題があることr.Read()電子メールなどのフィールドを含まない最初の文(SELECT count (1) FROM users AS total_drafts WHERE version_replace = @sid)に対して返される最初のデータテーブルを使用します。

あなたは、これは私の知る限り、あなたが右、複数のステートメントを実行しようとしている理解できるようSELECT * FROM users WHERE id = @sid ORDER By ID DESC

+0

最初のr.Read whileループまたはその中のr.ReadNextを呼び出しますか? – YsoL8

+0

最初に、編集を参照してください –

+0

乾杯、それは素晴らしい作品 – YsoL8

0

からのデータが含まれています第三データセットにDataReaderを移動する、二回r.NextResult()を呼び出す必要がありますか?
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

3つのデータセットを返します。 "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")) 

もう一つの可能​​な説明(再び、不明瞭では)あなたが最初の列名(「Eメール」)を台無しに、これも範囲例外のうちを与えるだろうということです。