我有一个使用Dapper查询数据库的Azure函数,并且有时会抛出此异常:
System.InvalidOperationException:无效的操作。连接已关闭。
System.InvalidOperationException:由于连接已断开,无法完成请求的操作。
这是我的代码正在做的事情:
using (var conn = new SqlConnection(_dbConnectionString))
{
await conn.OpenAsync();
List<Guid> ids = await conn.QueryAsync<Guid>("SELECT Id From Table1;");
var tasksRelations = ids.Select(id => conn.QueryAsync<CsvExport>(
@"SELECT Field1, Field2, ... Field25
FROM Table2
WHERE Table1Id = @Id;",
new { id }));
var relations = await Task.WhenAll(tasksRelations);
}
当id的数量很少时,这种方法很好,但是当它变大时,我有以上例外情况。
您是否有任何想法或事情可以使此代码更加健壮?
答案 0 :(得分:2)
您尝试同时针对同一连接触发多个查询。这是一个坏主意,并且可能存在一个初始错误,您在此处未报告该错误说明在同一连接上打开多个结果集不受支持。
简化代码以获取单个查询中所需的结果,而不是运行这么多查询:
using (var conn = new SqlConnection(_dbConnectionString))
{
await conn.OpenAsync();
var relations = conn.QueryAsync<CsvExport>(
@"SELECT Field1, Field2, ... Field25
FROM Table2
WHERE Table1Id IN (SELECT Id From Table1);");
}
现在您不必处理“大数”任务,并且您只在连接上运行一个查询,因此不应生成错误。