我在SQL Server 2012中创建了一个存储过程。存储过程的输出参数类型为varchar(15)
:
CREATE PROCEDURE [dbo].[Proc_Authenticate]
(@username int,
@password varchar(25),
@Error varchar(15) output)
AS
BEGIN
DECLARE @count INT
SET @count = (SELECT COUNT(*)
FROM loginmaster
WHERE userid = @userid AND password = @password)
IF (@count = 0)
BEGIN
SET @Error = 'Error1'
END
END
当我从SSMS运行存储过程时,它正常工作,但是当我从C#调用存储过程时,在ExecuteScalar的帮助下,它无法按预期工作。 ExecuteScalar
始终返回null。如果我对ExecuteNonQuery
做同样的事情,它就能正常工作。 ExecuteNonQuery
用于插入/更新。 ExeuteNonQuery
将行受影响的行数返回为int值:
Int rowaffected = cmd.ExecuteNonQuery()
通常我检查rowaffected
是否大于0,取值输出参数。
if(rowaffected > 0)
{
string s = sqlparameterError.value.Tostring()
}
我在哪里查看? rowaffected
始终为-1。是检查它的正确方法吗?
我已经改变了我的代码。我删除了输出参数。我创建了一个变量并选择了。在ExecuteScalar
的帮助下,我能够获得它的价值。
修改后的存储过程如下:
CREATE PROCEDURE [dbo].[Proc_Authenticate]
(@username int,
@password varchar(25))
AS
BEGIN
DECLARE @count INT
DECLARE @Error VARCHAR(15)
SET @count = (SELECT COUNT(*)
FROM loginmaster
WHERE userid = @userid and password = @password)
IF (@count = 0)
BEGIN
SET @Error = 'Error1'
END
SELECT @Error AS Error
END
答案 0 :(得分:2)
在cmd.ExecuteNonQuery
之后,你可以得到这样的输出参数:
cmd.Parameters["@Error"].Value