首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dapper -“ConnectionString属性尚未初始化”时,“缓冲区”为'false‘

Dapper -“ConnectionString属性尚未初始化”时,“缓冲区”为'false‘
EN

Stack Overflow用户
提问于 2021-09-13 10:24:54
回答 1查看 314关注 0票数 4

我正在试用Dapper,我偶然发现了这个例外:

代码语言:javascript
运行
复制
System.InvalidOperationException: The ConnectionString property has not been initialized.
...

以下是代码:

代码语言:javascript
运行
复制
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参数时,一切正常。

代码语言:javascript
运行
复制
var result = db.Query<T>(sql, parameters, commandType: commandType, commandTimeout: COMMAND_TIMEOUT);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-13 10:35:30

我怀疑这里真正的问题是返回一个打开的可查询,这意味着您将离开using块的作用域并处理仍在使用的连接。这里真正的问题是一个物体处理得太快了,但它以一种不寻常的方式表现出来。

基本上,在处理完需要连接的数据之前,不需要释放连接。这样做的一种懒散方式是:

代码语言:javascript
运行
复制
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的作用域将被扩展,直到最后一个数据被消耗(或者循环以某种方式退出)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69161093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档