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

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

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

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

... // other code

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

有帮助吗?

解决方案

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

其他提示

决定不同的几件事之间的不同方法1。数据将不断访问2。有很多数据吗

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

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

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

  1. 您在代码中使用数据的频率如何?
  2. 数据是否发生过变化(您是否关心它是否发生变化)?
  3. 与代码执行的其他操作相比,再次获取数据的相对(时间)成本是多少?
  4. 你赋予多少价值 表现, , 相对 开发人员的精力/时间 (对于这个特定的应用程序)?

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

对于您自己运行的一个简单实用程序来说,“启动、执行其操作并结束”,可能不值得付出努力。

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

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

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

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

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

在这种情况下,您需要关心的主要问题是:如果应用程序因崩溃、断电等原因异常退出怎么办?用户会丢失所有工作吗?但事实上,数据集非常容易序列化,因此您可以相当轻松地实现“经常保存”过程,将数据集内容序列化到磁盘,这样用户就不会丢失大量工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top