使用异步方法调用数据库存储过程需通过ExecuteReaderAsync、ExecuteNonQueryAsync或ExecuteScalarAsync配合SqlCommand,确保方法返回Task或Task,并用await实现非阻塞操作。1. 设置异步环境:定义async Task方法,使用SqlConnection.OpenAsync建立连接,SqlCommand配置存储过程名及参数类型;2. 处理输出参数和返回值:为输出参数创建SqlParameter并设置Direction为Output,ReturnValue接收返回值,执行ExecuteNonQueryAsync后读取结果;3. 读取结果集:对查询类存储过程使用ExecuteReaderAsync与SqlDataReader.ReadAsync逐行解析数据填充实体列表;4. ASP.NET Core中直接在控制器Action内await调用异步方法返回Ok结果。正确使用异步API可提升应用响应性能。

在C#中调用数据库存储过程并实现异步操作,完全可以使用 await 和异步方法来完成。关键在于使用支持异步的 ADO.NET 方法,如 ExecuteReaderAsync、ExecuteNonQueryAsync 或 ExecuteScalarAsync,配合 SqlCommand 调用存储过程。
1. 设置异步调用环境
确保你的方法是异步的,并返回 Task 或 Task。例如:
public async Task 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 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> GetUsersFromStoredProcedureAsync(){ var users = new List(); 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 GetUsers(){ var users = await _repository.GetUsersFromStoredProcedureAsync(); return Ok(users);}
基本上就这些。只要使用正确的异步 ADO.NET 方法,配合 await,就能高效地异步调用存储过程,避免阻塞线程,提升应用响应能力。
以上就是如何用C#实现数据库的存储过程异步调用?使用await?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1439885.html
微信扫一扫
支付宝扫一扫