在Using语句中从DataLayer返回DataReader

2024-02-09

我们有很多数据层代码都遵循这个非常通用的模式:

public DataTable GetSomeData(string filter)
{
    string sql = "SELECT * FROM [SomeTable] WHERE SomeColumn= @Filter";

    DataTable result = new DataTable();
    using (SqlConnection cn = new SqlConnection(GetConnectionString()))
    using (SqlCommand cmd = new SqlCommand(sql, cn))
    {
        cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;

        result.Load(cmd.ExecuteReader());
    }
    return result;
}

我想我们可以做得更好一点。我现在主要的抱怨是它强制将所有记录加载到内存中,即使对于大型记录也是如此。我希望能够利用 DataReader 一次只在 RAM 中保留一条记录的能力,但如果我直接返回 DataReader,则在离开 using 块时连接将被切断。

我该如何改进它以允许一次返回一行?


再一次,我对这个问题的思考的行为揭示了答案。具体来说,最后一句我写的是“一次一行”。我意识到我并不真正关心它是一个数据读取器,只要我可以逐行枚举它即可。这让我想到了这一点:

public IEnumerable<IDataRecord> GetSomeData(string filter)
{
    string sql = "SELECT * FROM [SomeTable] WHERE SomeColumn= @Filter";

    using (SqlConnection cn = new SqlConnection(GetConnectionString()))
    using (SqlCommand cmd = new SqlCommand(sql, cn))
    {
        cmd.Parameters.Add("@Filter", SqlDbType.NVarChar, 255).Value = filter;
        cn.Open();

        using (IDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                yield return (IDataRecord)rdr;
            }
        }
    }
}

一旦我们迁移到 3.5,并且可以开始在结果上使用其他 linq 运算符,这将工作得更好,我喜欢它,因为它让我们开始思考每层之间的“管道”,用于返回大量的查询结果。

缺点是读者持有多个结果集会很尴尬,但这种情况极为罕见。

Update
自从 2009 年我第一次开始使用这个模式以来,我了解到最好也将其设为通用模式IEnumerable<T>返回类型并添加Func<IDataRecord, T>参数将 DataReader 状态转换为循环中的业务对象。否则,惰性迭代可能会出现问题,例如您每次都会看到查询中的最后一个对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Using语句中从DataLayer返回DataReader 的相关文章

随机推荐

  • 将 .db 文件导入 R

    我正在尝试使用下面的代码导入 db 文件 该代码与包的示例相同 并且显示找不到函数 有人知道如何导入 db 文件吗 library ProjectTemplate db reader c3 db Users xxx Documents c3
  • 在 Startup.cs .net core 2.1 中加载程序集

    我在名为 nuqkgs 的文件夹中有块包 在项目启动时我想将这些包 有 dll 加载到项目中以在运行时使用 我使用下面的代码来加载它们 当我调试时 我可以看到信息 并且找到并打开了 dll 但是当应该使用它们时 我收到错误 找不到 dll
  • TEdgeBrowser 模态打印对话框?

    TEdge浏览器有替换了 TWebBrowser https docwiki embarcadero com RADStudio Alexandria en Using TEdgeBrowser Component and Changes
  • 更改默认图标工具栏(传单)

    我如何将默认工具栏图标更改为传单上的其他图标 上面的图片显示了图标的默认视图 我想自定义图标并将其更改为其他图标 例如我希望第一个图标看起来像桥梁和第二个文本图标等等 我已经尝试了几种方法但没有成功 这是我的代码 var electricp
  • 在 lapply 函数中访问和保留列表名称

    我需要访问 lapply 函数内的列表名称 我在网上找到了一些线程 据说我应该迭代列表的名称 以便能够获取函数中的每个列表元素名称 gt n names mylist gt mynewlist lapply n function namei
  • 在另一个视图控制器中更改标签的文本

    我有一个名为 FirstViewController 的视图控制器 还有一个名为 SecondViewController 的视图控制器 我提出第二个视图控制器 UIViewController controller self storyb
  • 在 C 中声明和修改字符串

    我最近开始尝试学习C语言 在我的第一个程序 简单的 hello world 事情 中 在我意识到我不能这样做之后 我遇到了声明字符串的不同方法variable name string data char variable name data
  • Solr 和 MySQL,如何保持更新的索引,以及,如果很简单,是否还需要数据库?

    我是 Solr 的初学者 所以请耐心等待 在我当前的项目中 我有一个非常简单的数据库 只有 1 个表 其中包含 4 个字段 id name subject msg 据我了解 每次添加 或删除 新记录时 我都需要将该记录添加到索引中 本质上执
  • 如何计算具有三角形面的网格的质心?

    我想根据以下描述计算网格的新质心 但我不想使用 Blender 的内置函数来计算质心 如所解释的here https blender stackexchange com questions 14294 how to recenter an
  • 如何保存pip包

    我们有一个基于 python django 的 Web 应用程序 其中许多组件都是使用 pip 安装的 所以我想问是否有一种方法可以保存或下载并保存我们正在 pip install 的特定 python 包 例如 pip install d
  • 将 md5 哈希字节数组转换为字符串

    如何将哈希结果 字节数组 转换为字符串 byte bytePassword Encoding UTF8 GetBytes password using MD5 md5 MD5 Create byte byteHashedPassword m
  • 在Java中像表格一样打印二维数组[重复]

    这个问题在这里已经有答案了 我想像表格一样打印输入的二维数组 也就是说 如果出于某种原因他们全都输入 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 就像上面一样 但在 Java Eclipse 的控制台中 没有花哨的按
  • “404 重定向”是合法的重定向吗?

    我遇到的情况是 某些用户可能会通过链接等进入错误输入的页面 在大多数情况下 我可以确定应显示的正确页面 因此我想重定向到正确的 URL 301 重定向适合这种情况吗 301 的意思是 永久移动 但在这种情况下 该文档一开始就不存在 设置 4
  • 实体框架核心:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“关系”中插入标识列的显式值

    我正在构建一个应用程序 当我想将表单插入表单表时 出现以下错误 无法在表 关系 中插入标识列的显式值 当 IDENTITY INSERT 设置为 OFF 时 这些是我的模型 表格型号 DatabaseGenerated DatabaseGe
  • 如何向 OpenDayLight Karaf 添加新功能?

    如何将新功能添加到 ODL Oxygen SR3 0 8 3 作为 Karaf 模块 例如 我从以下位置下载了预构建的 ODL 官方网站 https nexus opendaylight org content repositories p
  • 是否可以反转具有恒定额外空间的数组?

    假设我有一个数组A with n系列中的独特元素 0 n 换句话说 我有整数 0 n 的排列 是否可以转型A into B使用 O 1 额外空间 又名就地 这样B A i 我 例如 A B 3 1 0 2 4 gt 2 1 3 0 4 是的
  • PhoneGap 是慢还是有 bug?

    在我编译演示应用程序并将其部署到我的 Samsung Galaxy S II 后 我注意到 PhoneGap 附带的示例 PhoneGap 应用程序在按下按钮和滚动时响应不太灵敏 我还使用 PhoneGap 和 jQuery Mobile
  • 开源 ETL 框架 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在第一个空格出现处分割字符串

    我没有得到一个优化的正则表达式 它将我的字符串拆分为第一个空白出现的位置 var str 72 tocirah sneab 我需要得到 72 tocirah sneab 如果您只关心空格字符 而不是制表符或其他空白字符 并且只关心第一个空格
  • 在Using语句中从DataLayer返回DataReader

    我们有很多数据层代码都遵循这个非常通用的模式 public DataTable GetSomeData string filter string sql SELECT FROM SomeTable WHERE SomeColumn Filt