从C#中的存储过程获取返回值

Gur*_*epS 65 c# sql sql-server

我有以下查询:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[Validate]
@a varchar(50),
@b varchar(50) output

AS

SET @Password = 
(SELECT Password
FROM dbo.tblUser
WHERE Login = @a)

RETURN @b
GO
Run Code Online (Sandbox Code Playgroud)

这个编译完全没问题.

在C#中,我想执行此查询并获取返回值.

我的代码如下:

  SqlConnection SqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyLocalSQLServer"].ConnectionString.ToString());
        System.Data.SqlClient.SqlCommand sqlcomm = new System.Data.SqlClient.SqlCommand("Validate", SqlConn);

        string returnValue = string.Empty;

        try
        {
            SqlConn.Open();
            sqlcomm.CommandType = CommandType.StoredProcedure;

            SqlParameter param = new SqlParameter("@a", SqlDbType.VarChar);
            param.Direction = ParameterDirection.Input;
            param.Value = Username;
            sqlcomm.Parameters.Add(param);



            SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);
            retval.Direction = ParameterDirection.ReturnValue;


            string retunvalue = (string)sqlcomm.Parameters["@b"].Value;
Run Code Online (Sandbox Code Playgroud)

注意:异常处理会缩短以保持代码简短.每当我到达最后一行时,返回null.这段代码的逻辑错误是什么?

谢谢

Joe*_*orn 87

Mehrdad提出了一些好处,但我注意到的主要问题是你从未运行过查询 ......

SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);
retval.Direction = ParameterDirection.ReturnValue;
sqlcomm.ExecuteNonQuery(); // MISSING
string retunvalue = (string)sqlcomm.Parameters["@b"].Value;
Run Code Online (Sandbox Code Playgroud)

  • 在最后一行中,您是否可以将`sqlcomm.Parameters [“ @ b”]`替换为`retval`? (2认同)
  • 我不是在问有关我正在处理的代码的问题,我正在努力帮助您改善对未来读者的回答。 (2认同)

Meh*_*ari 62

retval.Direction = ParameterDirection.Output;
Run Code Online (Sandbox Code Playgroud)

ParameterDirection.ReturnValue应该用于程序的"返回值",而不是输出参数.它获取SQL RETURN语句返回的值(名称为参数@RETURN_VALUE).

而不是RETURN @b你应该SET @b = something

顺便说一句,返回值参数总是int,而不是字符串.


Ala*_*son 11

我在返回值方面遇到了很多麻烦,所以我最后只选择了一些东西.

解决方案只是在结尾处选择结果并在您的功能中返回查询结果.

在我的情况下,我正在进行存在检查:

IF (EXISTS (SELECT RoleName FROM dbo.Roles WHERE @RoleName = RoleName)) 
    SELECT 1
ELSE
    SELECT 0
Run Code Online (Sandbox Code Playgroud)

然后

using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
    SqlCommand cmd = cnn.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "RoleExists";
    return (int) cmd.ExecuteScalar()
}
Run Code Online (Sandbox Code Playgroud)

您应该能够使用字符串值而不是int来执行相同的操作.


Man*_*rin 5

这是建立在JoelMehrdad的答案上的:你永远不会将参数绑定retvalsqlcommand.你需要一个

sqlcomm.Parameters.Add(retval);
Run Code Online (Sandbox Code Playgroud)

并确保您正在运行该命令

sqlcomm.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

我也不确定为什么你有2个返回值字符串(returnValueretunvalue).