C# 使用.NET数据集的正确方法是什么?

C# 使用.NET数据集的正确方法是什么?,c#,.net,ado.net,dataset,C#,.net,Ado.net,Dataset,我正在试图找出使用.NET数据集的正确方法。您是否应该为数据库中的每个表创建一个DataTable,并在数据集中创建关系?在我看来,在数据集中重建整个数据库结构是疯狂的 我将使用我的数据库的一个简化示例。 假设我有一个CompanyEquipment表。每件设备都属于一个成本中心,成本中心数据存储在成本中心表中,并与公司设备表相关。假设我有一个存储过程,它返回已与CostCenter表连接的CompanyEquipment数据,以在一个查询中返回所有信息。我可以使用存储过程来填充数据表,但是如何

我正在试图找出使用.NET数据集的正确方法。您是否应该为数据库中的每个表创建一个DataTable,并在数据集中创建关系?在我看来,在数据集中重建整个数据库结构是疯狂的

我将使用我的数据库的一个简化示例。 假设我有一个
CompanyEquipment
表。每件设备都属于一个成本中心,成本中心数据存储在
成本中心
表中,并与
公司设备
表相关。假设我有一个存储过程,它返回已与
CostCenter
表连接的
CompanyEquipment
数据,以在一个查询中返回所有信息。我可以使用存储过程来填充
数据表
,但是如何将这个非规范化的结果表保存回数据库?我不知道这是不是一个好办法。我认为,查询使用关联(桥接)表的多对多关系无论如何都需要多个查询。例如,我有一个
EquipmentRole
表,其中存储了不同的设备用途,还有一个
equipmentroleasignment
表,其中可以为设备分配多个角色

或者,如果我有模拟数据库的DataTables,我必须在每个表上分别使用DataAdapter.Fill()查询每个表,以便将相关数据放入每个
DataTable
。因此,我将使用类似于
select*from CompanyEquipment,其中equipID=1234
,我将使用适配器填充
CompanyEquipment数据表
,然后我必须使用另一个查询
select*from CostCenter,其中costCenterID=
并填充
CostCenter数据表
。使用这种方法,我必须两次访问数据库,并且我失去了DBMS执行连接的能力


我不熟悉数据驱动的应用程序,所以不熟悉工作流;特别是我应该点击数据库多少次才能得到一个数据表示。感谢您的帮助。我在C#工作。

一点也不?从.NET1.0开始,我就没有使用过数据集。使用ORM,游戏结束。数据集在报表应用程序之外没有任何实际用途,报表应用程序允许用户完全动态地组合查询,即使在这种情况下,大多数情况下也有更好的解决方案。

我过去使用过数据集(虽然很久以前),根据我的经验,这是我的0.02美元

关于如何使用数据集,选项1和选项2都是有效的方案

对于检索场景:- 这取决于您如何使用数据

例如,在您知道所有主表+相关表数据都将立即显示给用户的场景中,选项1可能更可取

但是,在一个场景中,您可能会显示一个包含主表数据的表,并且只需单击一行即可显示相关的表信息,因此最好使用选项2,因为它允许您根据请求获取数据

用于插入/更新场景

选项2在内存结构模仿数据库的情况下效果最好。因此,使用适配器甚至commandbuilder对象和datarow状态(插入/更新/删除),您可以轻松地插入/更新/删除适当的数据,而无需太多麻烦。如果要使用选项1,则需要编写逻辑以将其拆分并保存到单独的表中

希望这是有用的。然而,就像大多数现实生活场景一样,这取决于


注意:我完全避免使用数据集/数据表,因为它们是非常重的对象,所以有一段时间我不得不使用它们,因此往往会消耗一些资源。如果您确实使用了它们,请确保您根据您的性能要求进行性能测试,以确保它们不会最终不适合长期使用

我建议将POCO与实体框架结合使用。使用EF,您可以使用它为现有数据库生成POCO类、派生DbContext和代码优先映射。这将减少您自己创建类的工作量。您现在有了可以与EF一起使用的类来解决您在问题中描述的问题。

您不知道您使用的是什么版本的.Net,但看看“实体框架”,您应该朝着正确的方向前进。我查看了EF,但遇到了继承问题。数据库混合了每个层次结构的表和每个类型的表继承,EF不支持混合继承方案。所以,假设所有设备都继承自一个应该是抽象的基本实体项,我必须使其非抽象,并查询类型作为基本类型,而它们应该是强类型子类型。例如,如果我查询一台计算机,而计算机没有子类型实体,我将接收Item类型的对象。如果你觉得正确的话,也许我应该用EF?“这对我来说似乎很奇怪。”布鲁奇比:对不起。使用.NET4。谢谢你的推荐。请看一下我对TomTom关于EF问题的回复。也许我可以听听你的意见。如果你需要关于这个问题的更多信息,请告诉我。从未使用过EF-如果我需要状态跟踪,现在可能从4.5开始。我用BlToolkit做大部分工作,但我们的工作有点特殊——我们使用数据库作为序列化存储,所有事务都发生在内存中。好的,90%是这样。一开始创建一些类来表示数据可能是个好主意,因为您希望在应用程序中使用这些类。依赖DataTable和DataSet确实会将您锁定在数据库的结构中,最终会失去灵活性。此外,当涉及序列化和/或缓存的任务时,某些内置结构(尤其是DataSet)会带来额外的问题