繁体   English   中英

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

[英]How many DataTable objects should I use in my C# app?

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

现在我想确保我做的是“正确的”,从有经验的 .Net/SQL Server 编码人员那里得到一些反馈,那种你从阅读文档中得不到的反馈。

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

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

... // other code

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

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

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

如果您经常使用表中的数据,则在第一次使用时加载它们。 如果只是偶尔使用数据,需要的时候填表,然后丢弃。

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

选择实际上并不取决于 C# 本身。 它归结为以下之间的平衡:

  1. 您多久使用一次代码中的数据?
  2. 数据是否会改变(你是否关心它是否会改变)?
  3. 与您的代码所做的一切相比,再次获取数据的相对(时间)成本是多少?
  4. 开发人员的努力/时间(对于此特定应用程序)相比,您对性能的重视程度如何?

作为一般规则:对于数据不经常更改的生产应用程序,我可能会创建一次 DataTable,然后像您提到的那样保留引​​用。 我还会考虑将数据放在类型化集合/列表/字典中,而不是通用 DataTable 类中,因为这样更容易让编译器发现我的输入错误。

对于您自己运行的一个简单实用程序,它“开始、完成任务并结束”,这可能不值得付出努力。

您正在询问 Windows CE。 在这种特殊情况下,我很可能只执行一次查询并保留结果。 移动操作系统在电池和空间方面具有桌面软件所没有的额外限制。 基本上,移动操作系统使第 4 项要点变得更加重要。

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

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

  1. 数据需要多长时间? 您是否总是需要最新的,或者数据库不会经常更改?
  2. 你用这些数据做什么? 如果您只是将它用于报告,那么您可以轻松地填充数据集,运行您的报告,然后将数据集扔掉,下次只需创建一个新数据集即可。 无论如何,这将为您提供更多当前数据。
  3. 我们在谈论多少数据? 你说过你正在处理一个相对较小的数据集,所以如果你将它全部加载到内存中并永远保存在那里,不会对内存产生重大影响。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM