如何从存储过程返回输出参数和C#中的catch / handle?

时间:2017-01-18 06:38:06

标签: sql asp.net stored-procedures sql-server-2012

我在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

1 个答案:

答案 0 :(得分:2)

cmd.ExecuteNonQuery之后,你可以得到这样的输出参数:

cmd.Parameters["@Error"].Value