在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值返回数据。