Я представляю 3 способа получения данных из процедуры:
Вот sp, который возвращает значение
CREATE PROCEDURE x AS
BEGIN
return 1
END
Вы должны получить это 1 в своем c# добавив параметр с направлением ReturnValue
и типом int (это может быть только int), и прочитав параметр .Value
после вас ExecuteNonQuery
Обычно мы используем returnvalue, чтобы указать состояние операция, а НЕ некоторые данные в таблице. Например, AddUser pro c, который возвращает 0 для успеха, 1 для сбоя, потому что пользователь существует, 2 для сбоя, потому что пароль слишком слаб и т. Д. c, мы не будем использовать returnvalue для возврата идентификатора пользователя только что добавленного пользователя
Вот sp, имеющий выходной параметр
CREATE PROCEDURE x
@y INT OUTPUT
AS BEGIN
SET @y = 1
END
Вы должны получить это 1 в c#, добавив параметр с именем @y
и direction Output
и прочитайте значение параметра после ExecuteNonQuery
. Если вы также используете параметр для ввода, объявите направление как InputOutput
Вот sp, который возвращает набор результатов
CREATE PROCEDURE x
AS BEGIN
SELECT 1 AS y
END
Вы должны получить это 1 выполнение ExecuteScalar
или ExecuteReader
ExecuteScalar
возвращает верхнюю левую ячейку набора результатов; хорошо для этого примера. Если вы планируете возвращать больше строк и столбцов, чем просто одно значение, используйте ExecuteReader
Похоже, вы что-то путаете; решить, как ваш sp будет возвращать свои значения, и соответствующим образом кодировать c#.
Вы можете смешивать и сопоставлять их и иметь spro c, который имеет выходной параметр, возвращаемое значение и выбирает набор результатов, но вы должно быть ясно, какие биты c# собирают какие данные, из каких битов spro c