我正在试用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);
发布于 2021-09-13 10:35:30
我怀疑这里真正的问题是返回一个打开的可查询,这意味着您将离开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
的作用域将被扩展,直到最后一个数据被消耗(或者循环以某种方式退出)。
https://stackoverflow.com/questions/69161093
复制相似问题