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
.执行后,返回值将出现在参数中.
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.