ExecuteReader возвращает только 1 значение - PullRequest
2 голосов
/ 12 ноября 2011

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

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

Как я могу вернуть все значения в столбце QuestionText с одинаковым идентификатором вопросника?

Разработка базы данных

enter image description here

****. 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

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

Ответы [ 3 ]

7 голосов
/ 12 ноября 2011

Ваш читатель возвращает все значения, но код -

returnvalue = test.GetString(0);

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

Вы можете создать список строк -

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

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

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

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

3 голосов
/ 12 ноября 2011

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

 List<string> questionNames = new List<string>();
 while (test.Read())
 { 
    questionNames.Add(GetString(0));
 }
2 голосов
/ 12 ноября 2011
while (test.Read())
        { 
           returnvalue = test.GetString(0);  
        }

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...