我有一条例外消息:
形式参数“@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()。
答案 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();