Dapper 异常 - "The ConnectionString property has not been initialized" 当 'buffered' 是 'false'

Dapper Exception - "The ConnectionString property has not been initialized" when 'buffered' is 'false'

我正在试用 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 的范围被扩展,直到最后一个数据被消耗(或者循环以其他方式退出)。