C#获取存储过程返回值和输出参数值的方法


在C#中,获取存储过程的返回值和输出参数值通常涉及到使用`SqlCommand`对象来执行存储过程,并通过其`Parameters`集合来设置和获取参数值。以下是一个简单的示例,展示了如何做到这一点。

首先,假设你有一个存储过程,它有一个返回值(比如是一个整数)和一个输出参数(比如是一个字符串)。

存储过程示例(假设SQL Server):


CREATE PROCEDURE GetUserDetails
    @UserID INT,
    @UserName NVARCHAR(100) OUTPUT,
    @Success INT OUTPUT
AS
BEGIN
    -- 假设的逻辑,根据UserID获取用户名
    SELECT @UserName = Name FROM Users WHERE ID = @UserID
    
    -- 假设总是成功,所以返回1
    SET @Success = 1
    
    -- 假设还有一个返回值,比如影响的行数(这里简化为固定返回1)
    RETURN 1
END

接下来是C#中的代码,用于调用这个存储过程并获取返回值和输出参数:


using System;
using System.Data;
using System.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = "你的数据库连接字符串";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand("GetUserDetails", connection);
            command.CommandType = CommandType.StoredProcedure;

            // 添加输入参数
            SqlParameter userIdParam = new SqlParameter("@UserID", SqlDbType.Int);
            userIdParam.Value = 1; // 假设我们要查询的UserID是1
            command.Parameters.Add(userIdParam);

            // 添加输出参数
            SqlParameter userNameParam = new SqlParameter("@UserName", SqlDbType.NVarChar, 100);
            userNameParam.Direction = ParameterDirection.Output;
            command.Parameters.Add(userNameParam);

            SqlParameter successParam = new SqlParameter("@Success", SqlDbType.Int);
            successParam.Direction = ParameterDirection.Output;
            command.Parameters.Add(successParam);

            try
            {
                connection.Open();
                // 执行存储过程
                int returnValue = command.ExecuteNonQuery(); // 注意:ExecuteNonQuery 对于有返回值的存储过程不会返回存储过程的RETURN值

                // 获取输出参数值
                string userName = userNameParam.Value.ToString();
                int success = (int)successParam.Value;

                // 注意:要获取存储过程的RETURN值,需要使用ExecuteScalar
                SqlCommand cmdReturn = new SqlCommand("GetUserDetails", connection);
                cmdReturn.CommandType = CommandType.StoredProcedure;
                cmdReturn.Parameters.Add(userIdParam);
                cmdReturn.Parameters.Add(userNameParam);
                cmdReturn.Parameters.Add(successParam);
                cmdReturn.Parameters.Add(new SqlParameter { Direction = ParameterDirection.ReturnValue });
                cmdReturn.ExecuteNonQuery(); // 重新执行以获取RETURN值
                int returnCode = (int)cmdReturn.Parameters["ReturnValue"].Value;

                Console.WriteLine($"用户名: {userName}, 成功标志: {success}, 存储过程返回码: {returnCode}");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

**注意**:上面的示例中,为了获取存储过程的RETURN值,我实际上再次执行了存储过程(这通常不是最佳实践,因为它可能导致不必要的数据库负载)。在实践中,如果存储过程只是用来返回一个状态码,并且你已经有了足够的输出参数来获取所需的数据,那么可能不需要使用RETURN值。另外,如果存储过程不返回任何数据集(即不需要`ExecuteReader`),则`ExecuteNonQuery`是合适的,但请注意它不会返回存储过程的RETURN值。要获取RETURN值,你需要像上面示例中那样添加一个额外的`ReturnValue`参数,并在执行后读取它。

另外,如果存储过程确实返回了数据集(例如,通过SELECT语句),你可能需要使用`SqlDataReader`或`ExecuteScalar`(对于单个返回值)来获取这些数据。但在这个例子中,我们假设存储过程只通过输出参数和RETURN值返回数据。