2011-11-12 14 views
1

QuestionnaireIDがクエリと一致するときにExecuteReaderを使用してQuestionTextの値を返しています。 (データベース設計を参照してください)ExecuteReaderが1つの値だけを返しています

しかし私の問題は、私がExecuteReaderプロジェクトを実行するときに入力された最後の値を返します。たとえば、questionnaireID 1の下に3つの質問(A、B、C)を作成する場合、ExecuteReaderは質問Cのみを返します。

同じQuestionnaireIDを持つQuestionText列のすべての値を返すにはどうすればよいですか?

データベース設計

enter image description here

****。CS **

USE [devworks_oscar] 
    GO 
    /****** Object: StoredProcedure [hbo].[GetQuestion] Script Date: 11/12/2011 13:12:36 ******/ 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    ALTER PROCEDURE [hgomez].[GetQuestion] 
     (
     @QUEST_ID int 
     ) 
    AS 
     /*SET NOCOUNT ON;*/ 
     SELECT QuestionText FROM [Questions] WHERE QuestionnaireID = @QUEST_ID 
     RETURN 

おかげでストアド・プロシージャ

public string GetQuestionName(int QuestionnaireID) 
     { 
      string returnvalue = string.Empty; 
      SqlCommand myCommand = new SqlCommand("GetQuestion", _productConn); 
      myCommand.CommandType = CommandType.StoredProcedure; 
      myCommand.Parameters.Add(new SqlParameter("@QUEST_ID", SqlDbType.Int)); 
      myCommand.Parameters[0].Value = QuestionnaireID; 
      _productConn.Open(); 
      SqlDataReader test = myCommand.ExecuteReader(); 
      while (test.Read()) 
      { 
       returnvalue = test.GetString(0); 
      } 
      _productConn.Close(); 
      return returnvalue;   

     } 

dvance。

returnvalue = test.GetString(0); 

あなたが最後の値だけが残されますので、DataReaderオブジェクトから返された次の値を持つreturnvalue変数を上書きしていきます -

+1

これは実際のコードですか?ループ内で 'returnvalue'を上書きするだけでなく、最後に割り当てられた値を返しますか? –

答えて

6

あなたの読者は、すべての値が、コードを返しています。

あなたは文字列のリストを作成することができます - そして、それぞれの値を追加

List<string> list = new List<string>(); 

はリストに戻った -

while (test.Read()) 
{ 
    list.Add(test.GetString(0)); 
} 

は、文字列の代わりに、あなたの関数からリストを返します。

+0

+1。問題と解決策の両方の良い説明。 –

+0

ありがとうございます。非常に良い説明。 私は 'returnValue = string.Join(" \ n "、list.ToArray())を使ってリストを返しました。 return returnValue; ' – HGomez90

2
while (test.Read()) 
     { 
      returnvalue = test.GetString(0); 
     } 

問題があります。これを複数回ループしています。たびに、最後の値で上書きしてから、一度戻ってきます。

代わりにリストと.add()が必要です。

3

データリーダーを使用すると、1つの質問名のみを選択し、読み取りごとにその値を上書きします。次に、その最後の項目を返します。代わりにList<string>を使用してすべての値を保持し、それを返します:

List<string> questionNames = new List<string>(); 
while (test.Read()) 
{ 
    questionNames.Add(GetString(0)); 
} 
+0

+1。修正のための良いサンプルコード。 –

関連する問題