Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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#中的泛型FillDataSet方法中映射强类型数据集?_C#_Sql_Oop_N Tier Architecture - Fatal编程技术网

在C#中的泛型FillDataSet方法中映射强类型数据集?

在C#中的泛型FillDataSet方法中映射强类型数据集?,c#,sql,oop,n-tier-architecture,C#,Sql,Oop,N Tier Architecture,编辑:我正在使用SqlDataAdapters填充数据集。对不起,我应该说得更清楚些 我正在从事一个项目,需要用存储过程中的信息填充许多强类型数据集。现在,我的数据访问层中有一个通用方法: public static DataSet FillDataSet(DataSet dataSet, string storedProcedureName, Dictionary<string, string> parameters); 公共静态数据集FillDataSet(数据集数据集、字符串

编辑:我正在使用SqlDataAdapters填充数据集。对不起,我应该说得更清楚些

我正在从事一个项目,需要用存储过程中的信息填充许多强类型数据集。现在,我的数据访问层中有一个通用方法:

public static DataSet FillDataSet(DataSet dataSet, string storedProcedureName, Dictionary<string, string> parameters);
公共静态数据集FillDataSet(数据集数据集、字符串存储过程名称、字典参数);
问题是,我需要在存储过程返回的记录集和数据集中的表之间建立映射。为此,我提出了两种选择:

  • 向我的
    FillDataSet
    方法(
    KeyValuePair[]mappings
    )添加一个新的形式化方法,该方法将提供表映射的信息
  • 创建一个将数据集作为参数的
    DataSetMappingFactory
    ,然后根据其类型添加适当的映射。如果它是未知类型,则不会添加任何映射。然后,它会将
    DataSet
    返回到
    FillDataSet
    方法

对于我如何处理这个问题,你们有其他想法吗?还有,是否有人想在面向对象设计方面考虑一种最好的方法?

我要问的第一个问题是:我真的需要这样做吗?类型化数据集设计器已经为您提供了定义存储过程和数据表之间映射的工具。如果谨慎地设计数据集,那么每个数据表都已经有了填充方法。重新发明那个轮子有意义吗

我想可能吧。有一种维护映射的方法真的很酷,但映射中的所有内容都在编译时冻结。如果要更改映射,则需要重新生成部件。此外,类型化数据集设计不处理返回多个结果集的存储过程。如果您想要通用地映射参数和值,那么必须使用反射从Fill方法获取参数列表。如果你看看这些因素(以及我没有想到的其他因素),那么使用现有的工具就不是一条出路

在这种情况下,在我看来,您的目标是能够使用尽可能不了解实现细节的代码从一系列存储过程中填充数据集。这是一个由元数据驱动的过程。当您有一个由元数据驱动的流程时,从长远来看,对您来说最重要的是维护流程使用的元数据有多容易。一旦你让代码运行起来,你可能就不会经常碰它了。但您将不断调整元数据

如果我从这个角度来看问题,我想做的第一件事就是设计一个类型化数据集来包含元数据。这给了我们一系列我们必须解决的问题:

  • 持久化格式
  • 构建绑定UI的简单方法
  • 如果我们决定沿着这条路走下去,将元数据持久化到数据库中的同样简单的方法
  • 用于导航数据的对象模型
在这个数据集中,您将拥有一个DataSetType表,该表键入您希望能够填充的每个类型化数据集的类型。它将有一个子StoredProcedures表,每个被调用的SP都有一行。这将有两个子表,Parameter和DataTableType。对于SP预期返回的每个结果集,将有一个按序号位置排序的DataTableType行。DataTableType表将有一个子ColumnMapping表。在该表中,您将维护结果集中的列与正在填充的表中的列之间的映射

确保所有的数据关系都是嵌套的,并且已经为这些关系指定了合理的名称。(我喜欢
FK\u childtablename\u parenttablename

一旦有了这些,类设计就变得非常简单了。该类具有对元数据数据集、连接等的引用,并公开了具有以下签名的方法:

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

公共数据集(DataSet targetDs,Dictionary我要问的第一个问题是:我真的需要这样做吗?类型化数据集设计器已经为您提供了一个工具,用于定义存储过程和数据表之间的映射。如果您谨慎地设计数据集,那么您已经为每个数据表都提供了一个填充方法。重新创建这种方法有意义吗轮子

< P> >我想可能。很酷的是保持映射的方式,但是映射中的每一个都在编译时被冻结。如果你想改变映射,你需要重建你的程序集。类型化的数据集设计也不涉及返回多个结果集的存储过程。参数和值,您必须使用反射从Fill方法获取参数列表。可能是,如果您查看这些因素(以及我没有想到的其他因素),使用现有工具不是一条可行之路

在这种情况下,在我看来,您的目标是能够使用尽可能不了解实现细节的代码从一系列存储过程中填充数据集。因此,这是一个由元数据驱动的流程。当您有一个由元数据驱动的流程时,在lo中对您来说最重要的是什么ng run是维护流程使用的元数据的简单程度。一旦代码正常工作,您可能不会太多地接触它。但您将不断调整元数据

如果我从这个角度来看这个问题,我想做的第一件事就是设计一个类型化的数据集来包含元数据