c# - Dapper 异常 - 当 'buffered' 为 'false' 时,“ConnectionString 属性尚未初始化”
问题描述
我正在尝试 Dapper,但偶然发现了这个异常:
System.InvalidOperationException: The ConnectionString property has not been initialized.
...
这是代码:
public IEnumerable<T> GetAll<T>(string sql, DynamicParameters parameters, string connectionString, CommandType commandType = CommandType.StoredProcedure)
{
using IDbConnection db = new SqlConnection(connectionString);
var result = db.Query<T>(sql, parameters, commandType: commandType, commandTimeout: COMMAND_TIMEOUT, buffered: false);
return result;
}
当我删除buffered
参数时,一切正常。
var result = db.Query<T>(sql, parameters, commandType: commandType, commandTimeout: COMMAND_TIMEOUT);
解决方案
我怀疑这里真正的问题是您正在返回一个open queryable,这意味着您正在离开using
块的范围并处理仍在使用的连接。这里真正的问题是过早处置的对象,但它以一种不寻常的方式显现。
基本上,在完成需要连接的数据之前,您不需要释放连接。一种懒惰的做法是:
using IDbConnection db = new SqlConnection(connectionString);
foreach (var row in db.Query<T>(sql, parameters, commandType: commandType, commandTimeout: COMMAND_TIMEOUT, buffered: false)
{
yield return row;
}
这仅在不缓冲数据时发生,因为缓冲意味着“在返回给调用者之前获取所有数据”,而不是返回打开的查询。通过切换到“迭代器块”(通过yield return
),using
可以扩展 的范围,直到最后一个数据被消耗(或循环以其他方式退出)。
推荐阅读
- ruby-on-rails - 如何在 Rails 中正确处理 AM/PM 时间?
- f# - 在 F# 中使用 %A 格式时是否可以配置显示的列表项的数量?
- c - 在 const 表达式中声明指向结构的指针
- nuxt.js - 似乎无法让基于动态文件系统的路由与 Nuxt.js 一起使用
- javascript - 如何手动修改 Unix TimeStamp 使其比 UTC 晚 5 小时?
- python - 如何计算列表中特定项目的数量?Python3
- python - 我如何使用另一个 CSV 名称列表搜索 CSV 并在它使用 python 找到特定单词时返回
- angular - 如何在 HTML 中声明指向默认插座中路由的链接,在 Angular 中保留命名插座中的路由
- excel - Excel宏根据匹配两个值(行/列)查找单元格并替换单元格中的值
- python - 发生异常:KeyError