Хранимая процедура с возвращаемым значением - PullRequest
2 голосов
/ 12 марта 2012

У меня есть хранимая процедура, которая выглядит следующим образом:

ALTER PROCEDURE [dbo].[AuthenticateUser]    
    @AzUserName varchar(20),
    @Hash varchar(32),
    @UserId bigint output,
    @Authorized bit output
    ...

и отлично работает в Management Studio. Вот мой код C #:

SqlConnection scon = new SqlConnection(connectionString);
SqlCommand authCmd = new SqlCommand("AuthenticateUser", scon);
authCmd.CommandType = System.Data.CommandType.StoredProcedure;

SqlParameter userNameParam = authCmd.Parameters.Add("@AzUserName", System.Data.SqlDbType.VarChar, 20);
                        userNameParam.Value = username;
string hashed = Md5Hash.ComputeHash(username);

SqlParameter hashedParam = authCmd.Parameters.Add("@Hash", System.Data.SqlDbType.VarChar, 32);
hashedParam.Value = hashed;

SqlParameter userIdParam = authCmd.Parameters.Add("@UserId", System.Data.SqlDbType.Int);
userIdParam.Direction = System.Data.ParameterDirection.ReturnValue;

SqlParameter authorizedParam = authCmd.Parameters.Add("@Authorized", System.Data.SqlDbType.Bit);
authorizedParam.Direction = System.Data.ParameterDirection.ReturnValue;

scon.Open();
authCmd.ExecuteNonQuery();
scon.Close();

Когда я запускаю его, я получаю следующую ошибку:

{"Procedure or function 'AuthenticateUser' expects parameter '@UserId', which was not supplied."}   System.Exception {System.Data.SqlClient.SqlException}

Когда я заменяю ParameterDirection.ReturnValue на ParameterDirection.Output, я не получаю сообщение об ошибке, но никогда не получаю значение процедуры.

UPDATE: Спасибо за вашу помощь. Ошибка была более тривиальной, чем вы могли подумать, и я описал этот вопрос. Я менял взад и вперед ReturnValue на Output довольно давно сегодня безрезультатно. Затем мне пришлось опубликовать свой вопрос на SO, чтобы понять, что я принимаю хэш-значение ... username..Выйду на улицу, чтобы получить немного кислорода.

Ответы [ 3 ]

4 голосов
/ 12 марта 2012

Вам нужно будет использовать ParameterDirection.Output для каждого параметра, который был помечен output в T-SQL. Вы можете получить доступ к значениям, после вызова

authCmd.ExecuteNonQuery();

, получая значения параметров следующим образом:

authCmd.Parametes["@UserId"].Value
3 голосов
/ 12 марта 2012

Вы путаете понятия значений ВЫХОД и ВОЗВРАТ.

Значение RETURN из хранимой процедуры - это одно целочисленное значение для каждой хранимой процедуры, которое определяется в вашем proc с помощью инструкции RETURN, например,

RETURN 1  

Хранимая процедура может иметь от нуля до многих параметров, из которых от нуля до многих можно определить как ВЫХОД.

В вашем случае вы не показываете какое-либо использование оператора RETURN, но используете параметры OUTPUT. В SQL Server это больше похоже на параметры ввода / вывода, и вам нужно указать значение.

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

authCmd.Parameters[2].Value

или

userIdParam.Value

Как и в других ответах, вам нужно использовать направление выходного параметра для достижения этого

1 голос
/ 12 марта 2012

После выполнения команды вы можете получить доступ к значениям authorParam.Value и userIdParam.Value.

SqlConnection scon = new SqlConnection(connectionString);
SqlCommand authCmd = new SqlCommand("AuthenticateUser", scon);
authCmd.CommandType = System.Data.CommandType.StoredProcedure;

SqlParameter userNameParam = authCmd.Parameters.Add("@AzUserName", System.Data.SqlDbType.VarChar, 20);
                        userNameParam.Value = username;
string hashed = Zonal.Pie.Core.Common.Utils.Md5Hash.ComputeHash(username);

SqlParameter hashedParam = authCmd.Parameters.Add("@Hash", System.Data.SqlDbType.VarChar, 32);
hashedParam.Value = hashed;

SqlParameter userIdParam = authCmd.Parameters.Add("@UserId", System.Data.SqlDbType.Int);
userIdParam.Direction = System.Data.ParameterDirection.Output;

SqlParameter authorizedParam = authCmd.Parameters.Add("@Authorized", System.Data.SqlDbType.Bit);
authorizedParam.Direction = System.Data.ParameterDirection.Output;

scon.Open();
authCmd.ExecuteNonQuery();
//Access authorizedParam.Value and userIdParam.Value here
scon.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...