ExecuteReader возвращает только 1 значение

#c# #asp.net #return #executereader

#c# #asp.net #Возврат #executereader

Вопрос:

Я использую ExecuteReader для возврата значений questionText, когда QuestionnaireID совпадает с моим запросом. (См. Дизайн базы данных)

Однако моя проблема в том, что при запуске проекта мой ExecuteReader возвращает только последнее введенное значение. Например, если бы я должен был создать 3 вопроса (A, B, C) под идентификатором вопросника, равным 1. ExecuteReader вернул бы только вопрос C.

Как я могу вернуть все значения в столбце questionText, которые имеют один и тот же Questionnairid?

Дизайн базы данных

введите описание изображения здесь

****.cs**

 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;        

        }
  

Хранимая процедура

    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
  

Заранее спасибо.

Комментарии:

1. Это реальный код? вы не просто перезаписываете returnvalue в цикле, возвращая таким образом его последнее присвоенное значение?

Ответ №1:

Ваш reader возвращает все значения, кроме кода —

 returnvalue = test.GetString(0);
  

будет продолжать перезаписывать returnvalue переменную следующим значением, возвращенным из datareader, так что у вас останется только последнее значение.

Вы могли бы создать список строк —

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

затем добавьте каждое возвращенное значение в список —

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

затем верните список из вашей функции вместо строки.

Комментарии:

1. Спасибо. Очень хорошее объяснение. Я вернул список, используя returnValue = string.Join("n", list.ToArray()); return returnValue;

Ответ №2:

Используя средство чтения данных, вы получаете только одно название вопроса и переопределяете его значение при каждом чтении — затем вы возвращаете этот последний элемент. Вместо этого просто используйте List<string> для хранения всех ваших значений и возврата этого:

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

Ответ №3:

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

В этом ваша проблема. Вы повторяете это несколько раз, каждый раз перезаписывая его последним значением, а затем возвращаете один раз.

Вместо этого вам нужен список и .add().