Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该在我的C#应用程序中使用多少DataTable对象?_C#_.net_Sql Server_Datatable_Dataset - Fatal编程技术网

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

我应该在我的C#应用程序中使用多少DataTable对象?,c#,.net,sql-server,datatable,dataset,C#,.net,Sql Server,Datatable,Dataset,我是一名经验丰富的程序员,使用传统的(但面向对象的)开发工具,并切换到C#/.Net。我正在使用SQLServerCE3.5编写一个小的单用户应用程序。我已经阅读了概念数据集和相关文档,我的代码运行正常 现在,我想确保我做得“正确”,从经验丰富的.Net/SQL Server程序员那里得到一些反馈,这是阅读文档时得不到的 我注意到在一些地方有这样的代码: var myTableDataTable = new MyDataSet.MyTableDataTable(); myTableTableAd

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

现在,我想确保我做得“正确”,从经验丰富的.Net/SQL Server程序员那里得到一些反馈,这是阅读文档时得不到的

我注意到在一些地方有这样的代码:

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

... // other code

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

对于CE来说,这可能不是问题。如果你把这个应用推给成千上万的用户,而他们都访问了一个集中的数据库,那么你可能需要花一些时间进行优化。在像CE这样的单用户DB实例中,除非有数据表明需要优化,否则我不会花时间担心它。过早优化等。

决定两件主要事情之间差异的方法 1.数据是否会不断被访问 2.有很多数据吗

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


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

选择实际上并不取决于C本身。这归结为以下两个方面的平衡:

  • 您多久在代码中使用一次数据
  • 数据是否曾经发生过变化(如果发生了变化,你会在意吗)
  • 与代码所做的其他事情相比,再次获取数据的相对(时间)成本是多少
  • 相对于开发人员的努力/时间(对于这个特定的应用程序),您对性能的重视程度如何
  • 作为一般规则:对于数据不经常更改的生产应用程序,我可能会创建一次DataTable,然后保留您提到的引用。我也会考虑将数据放在类型化的集合/列表/字典中,而不是泛型DATABATE类,如果没有别的原因,因为编译器更容易捕获我的输入错误。

    对于一个你自己运行的简单实用程序来说,“开始,完成它的事情,然后结束”,它可能不值得付出努力

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


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

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

  • 数据的最新程度如何?您总是需要最新的数据,还是数据库不会经常更改
  • 您将数据用于什么?如果您只是将其用于报告,那么您可以轻松地填充数据集,运行报告,然后扔掉数据集,下次只需制作一个新的数据集。无论如何,这将为您提供更多的最新数据
  • 我们讨论的数据量是多少?您说过您使用的是一个相对较小的数据集,因此如果您将数据集全部加载到内存中并将其永久保存,则不会对内存造成重大影响
  • 既然你说它是一个没有大量数据的单用户应用程序,我认为你一开始就可以安全地加载所有内容,在数据集中使用它,然后在关闭时更新


    在这个场景中,您需要关注的主要问题是:如果由于崩溃、断电等原因导致应用程序异常退出,该怎么办。?用户是否会丢失所有工作?但实际上,数据集非常容易序列化,因此您可以相当容易地实现“每隔一段时间保存一次”将数据集内容序列化到磁盘的过程,这样用户就不会损失很多工作。

    如果您要迁移到.NET,我建议跳过ADO并查看Linq。您的意思是我可以使用Linq作为整个应用程序的数据提供者?您可以使用Linq获取数据并根据结果绑定,而不是使用数据集和TableAdapaters。这是一个更加顺畅的工作流程,伊姆霍。谢谢威尔,我正在查看。我假设这也是这类代码的发展方向。