我应该在我的 C# 应用程序中使用多少个 DataTable 对象?

Posted

技术标签:

【中文标题】我应该在我的 C# 应用程序中使用多少个 DataTable 对象?【英文标题】:How many DataTable objects should I use in my C# app? 【发布时间】:2010-09-10 09:25:29 【问题描述】:

我是一位经验丰富的程序员,使用传统(但面向对象)开发工具,并正在切换到 C#/.Net。我正在使用 SQL Server CE 3.5 编写一个小型单用户应用程序。我已经阅读了概念数据集和相关文档,并且我的代码有效。

现在我想确保我做的“正确”,从经验丰富的 .Net/SQL Server 编码人员那里获得一些反馈,这是阅读文档时无法获得的反馈。

我注意到我在几个地方有这样的代码:

var myTableDataTable = new MyDataSet.MyTableDataTable();
myTableTableAdapter.Fill(MyTableDataTable);

... // other code

在单用户应用程序中,您是否通常只在应用程序启动时执行此操作,为每个表实例化一个 DataTable 对象,然后为其存储一个引用,以便您只使用已填充数据的单个对象?这样,您将只能从数据库中读取一次数据,而不是可能多次读取数据。或者这个开销太小以至于无关紧要(加上大表可能会适得其反)?

【问题讨论】:

如果您要迁移到 .NET,我建议您跳过 ADO 并查看 Linq。 你的意思是我可以使用 LINQ 作为整个应用程序的数据提供者? 您可以使用 LINQ 获取数据并绑定结果,而不是使用 DataSet 和 TableAdapaters。恕我直言,它的工作流程更加顺畅。 谢谢威尔,我正在检查。我认为这也是此类代码的发展方向。 【参考方案1】:

对于 CE,这可能不是问题。如果您将此应用程序推送给成千上万的用户并且他们都在访问一个集中式数据库,那么您可能需要花一些时间进行优化。在像 CE 这样的单用户实例数据库中,除非您有需要优化的数据,否则我不会花任何时间担心它。过早的优化等。

【讨论】:

【参考方案2】:

决定的方式在两个主要的几件事之间有所不同 1. 数据是否会不断被访问 2. 数据量大吗

如果您经常使用表中的数据,请在首次使用时加载它们。 如果您只是偶尔使用数据,请在需要时填写表格,然后将其丢弃。

例如,如果您有 10 个 gui 屏幕并且只在其中 1 个屏幕上使用 myTableDataTable,则只能在该屏幕上读取它。

【讨论】:

【参考方案3】:

选择真的不取决于 C# 本身。它归结为以下两者之间的平衡:

    您在代码中使用数据的频率如何? 数据是否会发生变化(您是否关心)? 与您的代码所做的其他事情相比,再次获取数据的相对(时间)成本是多少? 相对于开发人员的工作量/时间(对于此特定应用程序),您对 性能 的价值有多大?

作为一般规则:对于数据不经常更改的生产应用程序,我可能会创建一次 DataTable,然后按照您提到的那样保留参考。我还会考虑将数据放在类型化的集合/列表/字典中,而不是通用的 DataTable 类,如果没有别的,因为它更容易让编译器捕获我的键入错误。

对于一个你自己运行的简单实用程序,它“开始、做事和结束”,它可能不值得付出努力。

您在询问有关 Windows CE 的问题。出于这种特殊考虑,我很可能只进行一次查询并保留结果。移动操作系统在电池和空间方面有桌面软件所没有的额外限制。基本上,移动操作系统使第 4 条更加重要。

每次您从 SQL 中添加另一个检索调用时,都会更频繁地调用外部库,这意味着您可能会运行更长时间,更频繁地分配和释放内存(这会增加碎片),并可能导致数据库重新- 从闪存中读取。假设您可以(参见第 2 条),一旦拥有数据,最好保留数据。

【讨论】:

【参考方案4】:

当您将数据集视为数据的“会话”时,更容易找出这个问题的答案。您填写数据集;你和他们一起工作;然后在完成后将数据放回或丢弃。所以你需要问这样的问题:

    数据需要保持多长时间?您是否总是需要最新的数据,还是数据库不会经常更改? 您将数据用于什么目的?如果您只是将其用于报告,那么您可以轻松填充数据集,运行报告,然后丢弃数据集,下次只需制作新的一。无论如何,这将为您提供更多最新数据。 我们讨论了多少数据?您已经说过您正在使用一个相对较小的数据集,因此如果您将其全部加载到内存中并永久保存,则不会对内存产生重大影响。

既然你说它是一个没有大量数据的单用户应用程序,我认为你可以安全地在开始时加载所有内容,在数据集中使用它,然后在关闭时更新。

在这种情况下您需要关心的主要是:如果应用程序由于崩溃、断电等原因异常退出怎么办?用户会失去所有工作吗?但是碰巧的是,数据集非常容易序列化,因此您可以相当轻松地实现“每隔一段时间保存一次”过程来将数据集内容序列化到磁盘,这样用户就不会丢失很多工作。

【讨论】:

以上是关于我应该在我的 C# 应用程序中使用多少个 DataTable 对象?的主要内容,如果未能解决你的问题,请参考以下文章

我的 Django 应用程序应该有多少个单独的应用程序

在 SQL 中使用视图是不是更好,或者我应该只在我的 C# 代码中使用查询[关闭]

我应该在我的 winform c# 应用程序中实现啥形式的身份验证才能访问 SharePoint 站点中的文件夹?

在我的 C# 应用程序中使用外部 .exe [重复]

Firestore 的子集合中每秒可以创建多少个文档?

C# 后台工作人员 - 我应该同时使用多少?