如何获取存储过程的返回值

cor*_*ore 34 sql t-sql ado.net stored-procedures

可能是一个容易回答的问题.我有这个程序:

CREATE PROCEDURE [dbo].[AccountExists]
    @UserName nvarchar(16)
AS
IF EXISTS (SELECT Id FROM Account WHERE UserName=@UserName)
SELECT 1
ELSE SELECT 0 
Run Code Online (Sandbox Code Playgroud)

当我有调用此过程的ADO.NET代码并执行此操作时:

return Convert.ToBoolean(sproc.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)

返回true或false.

当我将存储过程更改为RETURN 1或0而不是SELECT时:

ALTER PROCEDURE [dbo].[AccountExists]
    @UserName nvarchar(16)
AS
IF EXISTS (SELECT Id FROM Account WHERE UserName=@UserName)
RETURN 1
ELSE RETURN 0 
Run Code Online (Sandbox Code Playgroud)

sproc.ExecuteScalar()返回null.如果我尝试使用sproc.ExecuteNonQuery(),则返回-1.

如何在ADO.NET中使用RETURN获取存储过程的结果?

我需要AccountExists来RETURN而不是SELECT,所以我可以让另一个存储过程调用它:

--another procedure to insert or update account

DECLARE @exists bit

EXEC @exists = [dbo].[AccountExists] @UserName 

IF @exists=1
--update account
ELSE
 --insert acocunt
Run Code Online (Sandbox Code Playgroud)

Joh*_*ers 43

使用添加参数ParameterDirection.ReturnValue.执行后,返回值将出现在参数中.

  • 在我发现ReturnValue必须是第一个参数之前,这在我的VBA中不起作用.http://stackoverflow.com/a/25528645/2559297 (5认同)

eri*_*len 10

此外,要从ADO.NET检索结果(或任何其他输出参数),您必须首先遍历所有返回的结果集(或使用NextResult跳过它们)

这意味着如果您有一个这样定义的过程:

CREATE PROC Test(@x INT OUT) AS
    SELECT * From TestTable
    SELECT @x = 1
Run Code Online (Sandbox Code Playgroud)

并尝试这样做:

SqlCommand cmd = connection.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Test"
cmd.Parameters.Add("@x", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.Parameters.Add("@retval", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

cmd.Execute();
int? x = cmd.Parameters["@x"].Value is DBNull ? null : (int?)cmd.Parameters["@x"].Value;
Run Code Online (Sandbox Code Playgroud)

然后x将包含null.要使其工作,您必须执行以下过程:

using (var rdr = cmd.ExecuteReader()) {
    while (rdr.Read())
        MaybeDoSomething;
}
int? x = cmd.Parameters["@x"].Value is DBNull ? null : (int?)cmd.Parameters["@x"].Value;
Run Code Online (Sandbox Code Playgroud)

在后一种情况下,x将按预期包含1.