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