2013-08-26 2 views
0

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

The formal parameter "@LoginHash" was not declared as an OUTPUT parameter, but the actual parameter passed in requested output.

Мой код базы данных:

 create table Account 
     (
     Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,   
     Identifier INT NOT NULL, 
     Passphrase INT NOT NULL 
     ); 

     GO 
      CREATE PROCEDURE Authenticate (@LoginHash INT, @PasswordHash INT, @Result BIT OUTPUT) 
     AS 
     BEGIN TRANSACTION 
    if ((select count(Identifier) from Account where ([email protected] and [email protected]))>0) 
     set @Result=1 
    else 
     set @Result=0; 

     COMMIT 
     GO 

Мой код ado.net приложение:

 SqlCommand cmd = new SqlCommand("Authenticate", SqlCon); 
     cmd.CommandType = CommandType.StoredProcedure; 
     SqlParameter par = cmd.Parameters.Add("LoginHash", SqlDbType.Int); 
     par.Direction = ParameterDirection.Input; 
     SqlParameter par1 = cmd.Parameters.Add("PasswordHash", SqlDbType.Int); 
     par.Direction = ParameterDirection.Input; 
     SqlParameter par2 = cmd.Parameters.Add("Result", SqlDbType.Bit); 
     par.Direction = ParameterDirection.Output;    
     var result = (bool)cmd.ExecuteScalar();//exception there 

Как почини это ? я изменил код на следующее:

 SqlCommand cmd = new SqlCommand(Text, SqlCon); 
     cmd.CommandType = CommandType.StoredProcedure; 
     SqlParameter par = cmd.Parameters.AddWithValue("@LoginHash", (SqlInt32)loginHash);    
     SqlParameter par1 = cmd.Parameters.AddWithValue("@PasswordHash", (SqlInt32)passwordHash);    
     SqlParameter par2 = cmd.Parameters.Add("@Result",SqlDbType.Bit); 
     par2.Direction = ParameterDirection.Output; 

И теперь у меня есть NullReferenceException ошибки() произошедший в одной и той же линии.

ответ

2

Вы отмечаете неправильный параметр как Output. Последнее

par.Direction = ParameterDirection.Output; 

Для

par2.Direction = ParameterDirection.Output; 

И вы не должны отмечать другие как вход, это по умолчанию.

Кроме того, я не вижу, где вы на самом деле передать фактические значения этих параметров, возможно, это в другом месте, но только в том случае, вот сокращенный вариант кода, который включает в себя проходящие иллюстративные значения, а также:

SqlCommand cmd = new SqlCommand("Authenticate", SqlCon); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.AddWithValue("LoginHash", 123); // example value for LoginHash 
cmd.Parameters.AddWithValue("PasswordHash", 456); // example value for PasswordHash 
cmd.Parameters.Add("Result", SqlDbType.Bit).Direction = ParameterDirection.Output; 
var result = (bool)cmd.ExecuteScalar(); 
+0

Stink to copy & paste;) – Gonzix

+0

@Gonzix Случается лучшим из нас –

+1

Yup, не пытаясь быть критиком ... par.Direction задано 3 раза ... Просто – Gonzix

Смежные вопросы