我的C#应用程序中应该使用几个DataTable对象?
我是一位经验丰富的程序员,曾经使用过遗留(但仍面向对象)开发工具,并且切换到C#/。Net。我正在使用SQL Server CE 3.5编写一个小型的单用户应用程序。我已经阅读了概念性的DataSet和相关文档,并且我的代码有效。
现在,我想确保自己做的正确,请从经验丰富的.Net / SQL Server编码人员那里获得一些反馈,这是我们从阅读文档中无法获得的。
我注意到我在一些地方有这样的代码:
var myTableDataTable = new MyDataSet.MyTableDataTable(); myTableTableAdapter.Fill(MyTableDataTable); ... // other code
在单个用户应用程序中,我们通常会在应用程序启动时只执行一次此操作,为每个表实例化一个DataTable对象,然后存储对其的引用,以便仅使用已经充满数据的单个对象吗?这样,我们将只能从数据库读取一次数据,而不是可能多次读取数据。还是这个开销如此之小以至于没关系(加上大表可能适得其反)?
解决方案
回答
对于CE,这可能不是问题。如果我们要将这个应用程序推向成千上万的用户,而他们都使用了集中式数据库,那么我们可能需要花一些时间进行优化。在像CE这样的单用户实例数据库中,除非我们有需要优化的数据,否则我不会花时间担心它。过早优化等
回答
决定的方式在2个主要的几件事之间有所不同
1.数据是否将不断被访问
2.是否有大量数据
如果我们经常使用表中的数据,请在首次使用时加载它们。
如果仅偶尔使用数据,请在需要时填写表格,然后将其丢弃。
例如,如果我们有10个gui屏幕,并且仅在其中1个屏幕上使用myTableDataTable,则仅在该屏幕上读取它。
回答
选择实际上并不取决于Citself。它归结为以下两者之间的平衡:
- 我们多久使用一次代码中的数据?
- 数据是否会更改(并且我们是否会更改)?
- 与代码所执行的其他所有操作相比,再次获取数据的相对(时间)成本是多少?
- 与开发人员的工作量/时间(对于此特定应用程序)相比,我们赋予性能多少价值?
通常的规则是:对于生产应用程序,数据不经常更改,我可能会创建一次DataTable,然后像我们提到的那样保留引用。我还要考虑将数据放在类型化的collection / list / dictionary中,而不是在通用的DataTable类中,否则就别无选择了,因为这样更容易让编译器捕获我的输入错误。
对于一个简单的实用程序,我们自己运行"开始,完成并结束",可能不值得付出努力。
我们在询问Windows CE。在这种情况下,我很可能只查询一次并保留结果。移动操作系统在电池和空间上有额外的限制,而台式机软件则没有。基本上,移动操作系统使4号项目符号变得更加重要。
每次我们从SQL添加另一个检索调用时,我们都会更频繁地调用外部库,这意味着我们可能运行时间更长,更频繁地分配和释放更多的内存(这会增加碎片),并可能导致从数据库中重新读取数据库。闪存。假设可以的话,保留数据后最好保留数据(请参见项目符号2)。
回答
当我们将数据集视为数据的"会话"时,更容易找出该问题的答案。我们填充数据集;我们与他们合作;然后将数据放回去或者完成后将其丢弃。所以你需要问这样的问题:
- 数据需要保持最新状态?我们是否总是需要非常最新的信息,还是数据库不会经常更改?
- 我们将数据用于什么?如果仅将其用于报告,则可以轻松填充数据集,运行报告,然后将数据集扔掉,下次再创建一个新的数据集。无论如何,这将为我们提供更多当前数据。
- 我们正在谈论多少数据?我们已经说过我们正在使用相对较小的数据集,因此,如果将其全部加载到内存中并永久保存在那里,则不会对内存造成重大影响。
由于我们说它是一个没有大量数据的单用户应用程序,因此我认为我们一开始就可以安全地加载所有内容,并在数据集中使用它,然后在关闭时进行更新。
在这种情况下,我们需要关注的主要事情是:如果由于崩溃,断电等原因导致应用程序异常退出怎么办?用户会失去所有工作吗?但是碰巧的是,数据集非常容易序列化,因此我们可以很容易地实现"每隔一段时间保存一次"的过程,即可将数据集内容序列化到磁盘上,这样用户就不会浪费很多工作。