【问题标题】:C# Dataset or not? [closed]C# 数据集与否? [关闭]
【发布时间】:2013-09-03 19:06:12
【问题描述】:

我对 C# 中的数据集概念有些困惑(编码 ASP.NET 网站,这并不重要)。在我的阅读中,我理解它们(基本上)用作我的应用程序和我的数据(或数据库)之间的接口。我明白了。我不明白的是,有些文章将数据集称为“离线存储”,其中更新(插入等)被批量应用或从不应用,而其他文章则更多地涉及“接口”方面,即读取和更新(插入等...)立即应用于下划线数据库。

有人可以用简单的术语解释数据集吗?我真的想使用它们吗?也许一些简短的例子可能会让我明白。否则,我不明白为什么我不能只创建一个简单的类来从我的数据库中选择、插入、更新,我为什么要关心一些 XML 层?

感谢您的智慧。

【问题讨论】:

  • 除非您解释项目的需求,否则这有点像在黑暗中刺伤。您已经考虑并拒绝了实体框架,并且需要直接处理数据集的额外麻烦,对吧?
  • FWIW,我使用 DataSets 作为表格的方便集合......仅此而已。 DataSet 中内置了许多功能,但大多数需求更适合 ORM 和/或更简单的数据访问(例如 ExecuteScalar、ExecuteNonQuery、DataReader)。
  • 我现在明白了。大多数回复都为我澄清了这一点,所以我不能将任何一个标记为答案。我知道我的问题很模糊,但我的理解也是如此。很好的答案。

标签: c# asp.net


【解决方案1】:

它是一个工具,它有一些方便的功能——有时它们很好,但坦率地说,我个人很少使用它们——通常更喜欢简单的 POCO,比如 dapper(或者你自己喜欢的 ORM / micro-ORM——随便)。

DataSet / DataTable 的主要用处是,如果您要创建的东西本身就是动态的 - 例如,像Stack Exchange Data Explorer - 基本上是架构的工具回来是用户定义的。

在大多数业务线软件中,情况并非如此 - 所以DataTable 不是 IMO 的首选工具。

【讨论】:

  • +1,但即使现在使用 dynamic 类型也可以解决,是吗?不过,我不确定性能影响。
  • @neoistheone 我很乐意使用dynamic 如果有数据/使用局部性 - 即,如果 DAL 方法请求两列,然后在本地使用这些列 - 那就太好了。如果它将数据暴露在 DAL 之外,那么我会使用 POCO。对于“动态模式”场景,坦率地说,不值得重新发明轮子 - DataTable 工作并得到了大部分正确
  • @MarcGravell - 我注意到 Dapper 的动态版本实际上比静态版本快,这是 GitHub 页面上的拼写错误吗?
  • @Karl 需要更多上下文和非常具体的测试——在大多数情况下它会非常相似。我的主要观点实际上是关于正确性(编译器检查等)和发现(存在哪些成员?)。
  • @Karl 不要忘记我们在这里测量物化成本;它不包括任何下游成员解析开销,但动态的开销会比静态的稍高。但动态实际上是经过大量优化的。
【解决方案2】:

从一个角度来看,DataSet 是一个内存数据库。 DataSet 对象当然有它的用途,可以用来提高性能、使某些任务更简单等。是否使用它取决于具体情况。它是一种在某些情况下效果很好但在其他情况下效果不佳的工具。

DataSet 可大幅提高性能的一个示例是在您需要对一组数据进行多次计算的情况下。 I/O 仍然是性能的主要瓶颈,在这种情况下,将数据集加载到内存中,并使用 DataTable.Compute 执行 Sum()、Avg() 等函数在性能方面远优于执行针对真实数据库的多个类似语句,每次计算都需要往返数据库服务器。

这只是一种情况。在实际应用程序中,我必须修改以前的开发人员编写的程序,该程序连接到 Sybase SQL Anywhere 函数以对销售数据集执行多项计算。

我将它重构为一次加载数据并在内存中进行所有计算。我根本无法保证这种类型的性能提升,但程序从字面上需要超过 24 小时来执行一批计算减少到不到 5 分钟。

【讨论】:

    【解决方案3】:

    您可以使用ORM Tool,例如NHibernateEntity Framework。使用这种方法,您只需将您的域对象(例如:CustomerProduct)发送到 ORM 工具的某些对象,它将保存在数据库中给您。您无需编写 SQL 命令即可,ORM 工具为您轻松完成。使用 ORM,您只需将域对象映射到一个类中,它就会在数据库中为您管理,就像这个 imagem(我知道它是在 java 中,但 ORM 工具的概念是相同的):

    另一方面,你内部有 ADO.NET,你可以自己写,你需要写一些代码,但这并不难。

    在 .net 上不使用 Dataset 的原因有很多,看看这篇文章: http://www.4guysfromrolla.com/articles/050405-1.aspx

    【讨论】:

      【解决方案4】:

      我不会使用DataSet。一般来说,我处理 POCO(普通旧 CLR 对象)并使用像 DapperSELECTINSERTUPDATEDELETE 数据库中的数据的库。使用一个模仿我的数据库的基本对象(如果你愿意的话,一个域模型)并做我需要的事情要容易得多。

      Dapper 网站上有许多示例向您展示如何将 POCO 与 Dapper 一起使用。

      对于简单的项目,我只是利用标准 SqlCommand 对象之外的 ADO.NET 功能(例如 ExecuteNonQueryExecuteScalarExecuteReader)。这也不需要DataSet

      【讨论】:

      • "POCO" = "普通旧 CLR 对象"
      • @JoeEnos,哈哈,这些年来我一直在使用错误的首字母缩写词!
      • 让我想起了那个说服他们的父母/祖父母 LOL 的意思是“Lots of Love”的城市传奇(谁知道是不是真的),当他们开始在 Facebook 上用它作为慰问时某人的家人去世了。
      【解决方案5】:

      一个简单的答案是

      数据集是断开连接的,因此意味着您在内存中有一个类似表的结构。

      【讨论】:

        猜你喜欢
        • 2023-04-11
        • 1970-01-01
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-27
        • 1970-01-01
        • 2017-07-15
        相关资源
        最近更新 更多