Как вернуть выходное значение varchar из хранимой процедуры SQL - PullRequest
0 голосов
/ 15 марта 2020

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

@ результат

в качестве выходного значения

CREATE PROCEDURE [dbo].[RolValidation]
@UserID int,
@result varchar(50) output

AS
BEGIN
Select @result=role from LogUser where  UserID=@UserID


end

А вот функция в C#

            if (sqlCon.State == ConnectionState.Closed)
                sqlCon.Open();
            SqlCommand sqlcmd = new SqlCommand("RolValidation", sqlCon);
            sqlcmd.CommandType = CommandType.StoredProcedure;

            sqlcmd.Parameters.AddWithValue("@UrunID", SqlDbType.Int);
            sqlcmd.Parameters.Add("@result", SqlDbType.NVarChar,50).Direction = ParameterDirection.Output;
            string rol = Convert.ToString(sqlcmd.Parameters["@UrunID"].Value);
            sqlcmd.ExecuteNonQuery();
            returnValue = rol;

1 Ответ

0 голосов
/ 15 марта 2020

Похоже, что код из вашего вопроса не является реальным кодом, над которым вы работаете, поэтому могут быть и другие причины, по которым вы не вернете свою ценность.

Однако, судя по тому, что я вижу, если вы немного измените SP:

CREATE PROCEDURE [dbo].[RolValidation]
      @UserID INT;
AS
BEGIN
      SET NOCOUNT ON;

      DECLARE @result varchar(50);

      SET @result = Select role from LogUser where  UserID=@UserID;

      RETURN @result;
END

А в вашем C# коде:

if (sqlCon.State == ConnectionState.Closed)
{
    sqlCon.Open();
}

SqlCommand sqlcmd = new SqlCommand("RolValidation", sqlCon);
sqlcmd.CommandType = CommandType.StoredProcedure;

sqlcmd.Parameters.AddWithValue("@UserID", SqlDbType.Int);
sqlcmd.Parameters["@UserID"].Value = userID;

var rol = cmd.Parameters.Add("@result", SqlDbType.NVarChar, 50);
rol.Direction = ParameterDirection.ReturnValue


sqlcmd.ExecuteNonQuery();
returnValue = rol.Value;

В основном были две основные проблемы с вашим исходным кодом 1 - вы должны SET значение и затем «ВЕРНУТЬ» его. Вы можете установить его в строке запроса SELECT, как вы сделали, но мне больше нравится этот явный подход 2 - вы пытались получить значение перед выполнением запроса:

string rol = Convert.ToString(sqlcmd.Parameters["@UrunID"].Value);
sqlcmd.ExecuteNonQuery();

, что неправильно, все должно быть наоборот - сначала выполните запрос, затем попытайтесь получить .Value

Кроме этого, я не знаю всего кода, но это хорошая практика, чтобы обернуть соединение и команда в using операторах. Если у вас нет веских причин не делать этого, я предлагаю изменить его.

PS Теперь я вижу, что вы не передаете значение UserID, по крайней мере в коде из исходного вопроса. Поэтому обязательно добавьте это, в моем ответе это строка: sqlcmd.Parameters["@UserID"].Value = userID;

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