在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,就能高效地异步调用存储过程,避免阻塞线程,提升应用响应能力。
