如何用C#实现数据库的存储过程异步调用?使用await?

来源:这里教程网 时间:2026-02-21 17:26:26 作者:

在C#中调用数据库存储过程并实现异步操作,完全可以使用 await 和异步方法来完成。关键在于使用支持异步的 ADO.NET 方法,如

ExecuteReaderAsync
ExecuteNonQueryAsync
ExecuteScalarAsync
,配合
SqlCommand
调用存储过程。

1. 设置异步调用环境

确保你的方法是异步的,并返回

Task
Task<t></t>
。例如:

public async Task<int> CallStoredProcedureAsync(int userId)
{
    string connectionString = "your_connection_string";
    
    using (var connection = new SqlConnection(connectionString))
    {
        await connection.OpenAsync();
        using (var command = new SqlCommand("YourStoredProcedureName", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            // 添加参数
            command.Parameters.AddWithValue("@UserId", userId);
            command.Parameters.AddWithValue("@OtherParam", "value");
            // 执行并返回影响行数
            int result = await command.ExecuteNonQueryAsync();
            return result;
        }
    }
}

2. 获取返回值或输出参数

如果存储过程有输出参数或返回值,需要显式定义:

public async Task<int> CallStoredProcedureWithOutputAsync(int input, out string outputValue)
{
    outputValue = string.Empty;
    string connectionString = "your_connection_string";
    using (var connection = new SqlConnection(connectionString))
    {
        await connection.OpenAsync();
        using (var command = new SqlCommand("ProcWithOutput", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            // 输入参数
            command.Parameters.AddWithValue("@InputParam", input);
            // 输出参数
            var outputParam = new SqlParameter("@OutputParam", SqlDbType.VarChar, 50)
            {
                Direction = ParameterDirection.Output
            };
            command.Parameters.Add(outputParam);
            // 返回值参数
            var returnParam = new SqlParameter("@ReturnVal", SqlDbType.Int)
            {
                Direction = ParameterDirection.ReturnValue
            };
            command.Parameters.Add(returnParam);
            await command.ExecuteNonQueryAsync();
            outputValue = outputParam.Value?.ToString();
            return (int)returnParam.Value;
        }
    }
}

3. 读取结果集(如查询类存储过程)

若存储过程返回数据,使用

ExecuteReaderAsync

public async Task<List<User>> GetUsersFromStoredProcedureAsync()
{
    var users = new List<User>();
    string connectionString = "your_connection_string";
    using (var connection = new SqlConnection(connectionString))
    {
        await connection.OpenAsync();
        using (var command = new SqlCommand("GetUsers", connection))
        {
            command.CommandType = CommandType.StoredProcedure;
            using (var reader = await command.ExecuteReaderAsync())
            {
                while (await reader.ReadAsync())
                {
                    users.Add(new User
                    {
                        Id = reader.GetInt32("Id"),
                        Name = reader.GetString("Name")
                    });
                }
            }
        }
    }
    return users;
}

4. 在 ASP.NET Core 中调用示例

控制器中可以直接 await 异步方法:

[HttpGet]
public async Task<IActionResult> GetUsers()
{
    var users = await _repository.GetUsersFromStoredProcedureAsync();
    return Ok(users);
}

基本上就这些。只要使用正确的异步 ADO.NET 方法,配合 await,就能高效地异步调用存储过程,避免阻塞线程,提升应用响应能力。

相关推荐