无法从存储过程中获取输出

时间:2013-08-26 16:31:24

标签: ado.net

我有一条例外消息:

  

形式参数“@LoginHash”未声明为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 (Identifier=@LoginHash and Passphrase=@PasswordHash))>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()。

1 个答案:

答案 0 :(得分:2)

您将错误的参数标记为输出。最后改变

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();