【问题标题】:How to return output parameter from stored procedure and catch/handle in C#?如何从存储过程返回输出参数并在 C# 中捕获/处理?
【发布时间】:2017-06-02 10:40:55
【问题描述】:

我在 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 运行存储过程时,它工作正常,但是当我在 ExecuteScalar 的帮助下从 C# 调用存储过程时,它没有按预期工作。 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

【问题讨论】:

  • 你试过这个cmd.ExecuteNonQuery然后cmd.Parameters["@Error"].Value吗?
  • 是的,Afnan,我已经做到了。
  • 这个能用吗?
  • 如何从您的 c# 代码中调用 sp? Recordsaffected msdn 状态:插入或删除的行数。您正在计数,没有插入或删除。受影响的记录不是获取您的计数的方法。
  • ExecuteScalar 被定义为返回选择的第一个数据集的第一个结果值。它不返回输出参数(其中可能有多个)。所以这种行为(空结果)是预期的。

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


【解决方案1】:

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

cmd.Parameters["@Error"].Value

【讨论】:

  • 可能需要在执行命令前定义参数,将Direction设置为Output
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多