SqlDataReader не возвращает строки / заполняющий список

#c# #sql-server

#c# #sql-сервер

Вопрос:

Я пытаюсь вернуть все строки одного столбца в моей базе данных для заполнения списка. Когда я выполняю хранимую процедуру в SQL, она работает нормально, но ничего не возвращается, когда я пытаюсь сделать это на C #.

 public static List<string> GetRows(string filter_one, string filter_two)
{
    var retrievedRows = new List<string>();
    var storedProc = "dbo.MyStoredProc";

    using (SqlConnection connection = new SqlConnection(MY_CONNECTION_STRING))
    using (SqlCommand command = new SqlCommand(storedProc, connection))
    {
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add("@FilterOne", SqlDbType.VarChar).Value = filter_one;
        command.Parameters.Add("@FilterTwo", SqlDbType.VarChar).Value = filter_two;
        connection.Open();

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                retrievedRows.Add(reader.GetString(0));
            }
        }
    }
    return retrievedRows;
}
  

Есть идеи? Я не получаю никаких ошибок ни в консоли, ни при запуске ее в IIS Express. Когда я просматриваю retrievedRows, размер остается равным 0, хотя, когда я запускаю тот же запрос в SQL с теми же переданными параметрами, он возвращает результаты для меня.

РЕДАКТИРОВАТЬ: Пожалуйста, извините меня, мой мозг, должно быть, сегодня работает немного медленно. Один из передаваемых мной параметров указывал на (пустое) значение неправильного webcontrol. Я не знаю, как я это пропустил.

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

1. Используете ли вы те же значения для filter_one и filter_two , которые используются в хранимой процедуре, для возврата записей?

2. Кроме того, если вы поставите точку останова в строке, где она добавляет records ( retrievedRows.Add(reader.GetString(0)); ) , останавливает ли она выполнение там?

3. Вам нужно показать нам свое определение SP, по крайней мере, параметры и возвращаемую часть.

4. вы пробовали указывать направление параметра? параметр. Направление = Параметрdirection. Ввод;

Ответ №1:

Я вижу только одну проблему с вашим опубликованным фрагментом, которая может представлять проблему:

 command.Parameters.Add("@FilterOne", SqlDbType.VarChar).Value = filter_one;
command.Parameters.Add("@FilterTwo", SqlDbType.VarChar).Value = filter_two;
  

В этом разделе вы добавляете два VARCHAR параметра, но не указываете для них длину. Попробуйте изменить свой код, чтобы добавить спецификацию длины:

 var filterOne = new SqlParameter("FilterOne", System.Data.SqlDbType.VarChar, 50);
  

Используемый здесь конструктор SqlParameter(string, SqlDbType, int) :

Параметры —

ParameterName (строка): имя параметра для сопоставления.

DbType (SqlDbType): одно из значений SqlDbType .

размер (Int32): длина параметра.

При работе с VARCHAR вы должны указать длину или что-либо за пределами длины по умолчанию (которая составляет 1 байт для определений и переменных и 30 байт для CAST и CONVERT ) будет усечена:

Когда n не указано в операторе определения данных или объявления переменной, длина по умолчанию равна 1. Если n не указано при использовании функций ПРИВЕДЕНИЯ и преобразования, длина по умолчанию равна 30.

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

1. Отредактировал мой пост, хотя спасибо за ответ! Я не знал, что вам нужно указать длину для добавляемых вами параметров. Полезно знать!

2. @BryanTran рад быть полезным и помочь коллеге-разработчику! Приношу свои извинения, если мое первоначальное высказывание прозвучало немного грубо или негативно, это совсем не так. Кроме того, добро пожаловать в Stack Overflow! 🙋