首页 > 解决方案 > 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);

标签: c#connection-stringdappersqlexception

解决方案


我怀疑这里真正的问题是您正在返回一个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可以扩展 的范围,直到最后一个数据被消耗(或循环以其他方式退出)。


推荐阅读