如何在运行时使用 C# 创建强类型数据集?

Posted

技术标签:

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

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

它应该创建...

1.) XSD 文件。

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

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

4.) 每个表的 TableAdapter。

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

【问题讨论】:

【参考方案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,可以为设计时未知的数据库动态生成类。

以上是关于如何在运行时使用 C# 创建强类型数据集?的主要内容,如果未能解决你的问题,请参考以下文章

创建强命名托管 (/clr) C++ 程序集

C# 运行的时候 报这个错误

C# 特性

在运行时动态生成 DLL 程序集

C# 特性详解

苹果推出全新开源项目 方便密码管理 App 创建强密码