Dapper异常 - 当'buffered'为'false'时,“ConnectionString属性未初始化”

5

我正在尝试使用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);
1个回答

3
我怀疑真正的问题在于你返回了一个“可查询的开放”结果,这意味着你离开了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的范围会延伸到最后一个数据被消耗完(或循环以其他方式退出)。

谢谢!这个异常确实让我感到困惑,因为它没有提到处理。 - lijevosmetalo
1
最终,引发异常的是 ADO.NET 提供程序,这使得我们在库层面很难处理;我宁愿不开始尝试检测“魔术字符串”,因为这会涉及到区域设置问题。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接