编辑: 我使用SqlDataAdapters填补数据集。对不起,我应该已经更加清楚。

我工作上的一个项目,在那里,我需要填补的一些强类型的数据集的信息存储程序。现在,我有一个通用的方法在我的数据访问层:

public static DataSet FillDataSet(DataSet dataSet, string storedProcedureName, Dictionary<string, string> parameters);

这个问题是,我需要建立之间的映射的返回的记录集来自所存储的过程和表格在我的数据集。我已经想出了两个选项这样做:

  • 添加一个新的正式要我 FillDataSet 方法(KeyValuePair<string, string>[] mappings)提供的信息表映射。
  • 创建一个 DataSetMappingFactory 这将需要一个数据集作为一个参数,然后再添加适当的映射根据其类型。如果它是一个未知的类型,那么它就不添加任何映射。然后,它会回来的 DataSet 来的 FillDataSet 法。

做任何你有其他想法如何,我可以处理这个问题?此外,没有任何人想要在权衡的一个方法,这将是最好的面向对象的设计?

有帮助吗?

解决方案

第一个问题我想问的是:我真的需要这样做呢?输入的数据集的设计师已经给你一个工具用于定义的映射之间存储的过程和一个数据表。如果你设计的数据集与照顾,你已经有一个填补方法为每个数据表。它是有意义的重新发明轮子?

我认为这可能。它真的很酷,有一个方法,维持这映,但一切都在这映射是冻结在编制时间。如果你想改变的映射,需要重建大会。也类型化数据集的设计并不处理与储存程序,返回多个结果集。如果你想要一般地图的参数和价值观,你有使用反映获得的参数,列出了从填补方法。它可能是,如果您看看那些因素(以及其他人我不想的),与现有的工具是不是要走的路。

在这种情况下,在我看来,你的目标是为了能够填充数据集的一系列的存储程序的代码知道尽可能少的执行情况的详细信息。因此,这是一个进程,将被驱动的元数据。当你有一个过程驱动的元数据,有什么要问题的最你在长期是多么容易将是以维持的元数据的过程使用。一旦你得到了代码的工作时,你可能不会碰它非常多。但是你将可以调整的元数据。

如果我看一下这个问题从这个角度看,第一件事我想做的是设计一个输入数据集包含的元数据。这使我们有一堆事情,我们另有图出:

  • 持久性格式
  • 一个直接的途径来建立一个开UI
  • 同样直接的途径来持续存在的元数据数据库中,如果我们决定走这条路
  • 一个目用于导航模型的数据。

在这个数据集,你会有一个DataSetType表键类型的每一类型的数据集,你打算以能够填充。它会有一个孩子StoredProcedures表,用行为的每一个SP,被称为。这将有两个孩子表、参数和DataTableType.会有一个DataTableType行,下令通过的序号的位置,对于每一个的结果集SP的预期回报。该DataTableType表将有一个孩子ColumnMapping表。这是在该表中,你会保持映射列之间在结果设置和列表中你填充.

确保所有的DataRelations是嵌套的,那你已经给出理性的名称来的关系。(我喜欢 FK_childtablename_parenttablename.)

一旦你有了这类设计变得非常简单的。这类具有参考数据集的元数据,连接等,, 和它公开一个方法,与此签署:

public void FillDataSet(DataSet targetDs, Dictionary<string, Dictionary<string, KeyValuePair<string, string>> parameterMap);

你开始通过使用targetDs的类型,以找到顶级DataSetType行。然后所有的私人迭代方法,通过列表的DataRows返回的数据表。GetChildRows().并添加一个事件或两种类的设计,以便为它执行的操作它可能引发事件,为我们调用的应用程序知道它是如何取得进展。

可能是第一个地方,我希望重构这种设计是在给我更细化的控制填补的过程。例如,为设计的,只有一个组SPs每类型的数据集。什么如果我只要填一个子集的数据集?作为设计,我不能。但是你可以很容易地使主键的DataSetType表两个部分,部分是数据集类型和一串钥匙(一个名字就像SPSetName,或OperationName),并加入第二部分的关键FillDataSet参数清单。

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