#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! 🙋