【问题标题】:How do I create strongly typed dataset during runtime using C#?如何在运行时使用 C# 创建强类型数据集?
【发布时间】:2009-05-07 17:34:56
【问题描述】:

我需要在运行时为用户首选的目标数据库创建一个强类型数据集。 Visual Studio 为创建类型化数据集提供了大量设计时支持。我需要在运行时自动化为目标数据库生成类型化数据集的过程。

它应该创建...

1.) XSD 文件。

2.) 代表数据库的类型化数据集

3.) 所有数据库表和表中列的类型化包装器。

4.) 每个表的 TableAdapter。

所以我需要在运行时生成相同的类型化数据集,这通常是在设计时使用 Visual Studio 的类型化数据集设计器创建的。

【问题讨论】:

    标签: c# code-generation strongly-typed-dataset


    【解决方案1】:

    我倾向于同意 jcollum 的观点,在运行时使用类型化数据集可能是错误的方法。另一方面,如果您只想在运行时从数据库中获取结构化数据(也称为 DataTable),则可以使用反射从任意数据结果创建 TableAdapter。

    var results = (from data in db.SomeTable select data).ToArray();
    DataTable dt = ObjectArrayToDataTable(results);
    // At this point you have a properly structure DataTable.
    
    // Here is your XSD, if absolutely needed.
    dt.WriteXMLSchema("c:\somepath\somefilename.xsd");
    
    private static System.Data.DataTable ObjectArrayToDataTable(object[] data)
    {
        System.Data.DataTable dt = new System.Data.DataTable();
        // if data is empty, return an empty table
        if (data.Length == 0) return dt;
    
        Type t = data[0].GetType();
        System.Reflection.PropertyInfo[] piList = t.GetProperties();
    
        foreach (System.Reflection.PropertyInfo p in piList)
        {
            dt.Columns.Add(new System.Data.DataColumn(p.Name, p.PropertyType));
        }
    
        object[] row = new object[piList.Length];
    
        foreach (object obj in data)
        {
            int i = 0;
            foreach (System.Reflection.PropertyInfo pi in piList)
            {
                row[i++] = pi.GetValue(obj, null);
            }
            dt.Rows.Add(row);
        }
    
        return dt;
    }
    

    您可以应用相同的主体来创建结构化 DataSet 并轻松为其创建 DataAdapter。

    或者我可能误读了您的要求。

    【讨论】:

      【解决方案2】:

      您或许可以使用XSD.EXE。从您的程序中启动它...

      【讨论】:

      • xsd.exe 将从现有的 XSD defi 生成类文件。文件。我还需要生成 XSD。我还需要创建表格适配器。
      • 您也可以直接与 XsdTool.Xsd 类甚至 System.Data.Design.TypedDataSetGenerator 和 System.Xml.Serialization.XmlReflectionImporter/XmlSchemaExporter 对话,而不是启动 XSD.EXE。
      【解决方案3】:

      鉴于我过去使用类型化数据集的经验 - 以及随之而来的所有失败和问题 - 我强烈建议您使用 ORM 映射器进行调查。换句话说,远离类型化数据集。

      【讨论】:

      • +1 他们做自己很痛苦,而且经常失败,其他人已经完成了解决这些问题的工作,这些人是制作 ORM 的人。
      • 是的,你是对的。我们在类型化数据集之上拥有自己的 ORM。我们只是将类型化数据集用作数据模型,并且我们并不严重依赖它们。但是我们仍然需要在运行时以某种方式创建它!任何想法。
      • 我不明白为什么你有一个在运行时生成的 ORM 和类型化数据集。请更新问题以详细说明。此外,LINQ 似乎能够解决这个问题。只是一种预感。
      • 看起来 LINQ 或您的 ORM 解决方案应该有一个 API,可以为设计时未知的数据库动态生成类。
      猜你喜欢
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      相关资源
      最近更新 更多