2

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

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

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

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

... // other code

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

4

4 回答 4

3

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

于 2008-09-17T20:50:33.267 回答
0

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

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

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

于 2008-09-17T20:55:46.267 回答
0

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

  1. 您多久使用一次代码中的数据?
  2. 数据是否会改变(你是否关心它是否改变)?
  3. 与您的代码所做的其他事情相比,再次获取数据的相对(时间)成本是多少?
  4. 开发人员的工作量/时间(对于这个特定的应用程序)相比,您对性能有多少重视?

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

对于您为自己运行的“开始,完成它的事情并结束”的简单实用程序,它可能不值得付出努力。

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

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

于 2008-09-17T21:01:48.637 回答
0

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

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

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

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

于 2008-09-18T02:05:22.217 回答