#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().