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

如何在运行时使用C#创建强类型数据集?,c#,code-generation,strongly-typed-dataset,C#,Code Generation,Strongly Typed Dataset,我需要在运行时为用户首选的目标数据库创建一个强类型数据集。VisualStudio在创建类型化数据集时提供了大量的设计时支持。我需要在运行时自动为目标数据库生成类型化数据集 它应该创造 1.)XSD文件 2.)表示数据库的类型化数据集 3.)为表中的所有数据库表和列键入包装器 4.)每个表的表适配器 因此,我需要在运行时生成相同的类型化数据集,这通常是在设计时使用Visual Studio的类型化数据集设计器创建的。您可能可以使用XSD.EXE。从程序中启动它…您可能会使用XSD.EXE。从您的

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

它应该创造

1.)XSD文件

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

3.)为表中的所有数据库表和列键入包装器

4.)每个表的表适配器


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

您可能可以使用
XSD.EXE
。从程序中启动它…

您可能会使用
XSD.EXE
。从您的程序中启动它…

鉴于我过去使用类型化数据集的经验——以及所有伴随的故障和问题——我强烈建议您使用ORM映射器进行研究。换句话说,远离类型化数据集。

鉴于我过去使用类型化数据集的经验——以及所有伴随而来的故障和问题——我强烈建议您使用ORM映射器进行研究。换句话说,远离类型化数据集。

我倾向于同意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;
}
您可以应用相同的主体来创建结构化数据集,并轻松地为其创建DataAdapter


或者可能我误解了您的需求。

我倾向于同意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;
}
您可以应用相同的主体来创建结构化数据集,并轻松地为其创建DataAdapter


或者也许我误解了你的要求。

+1你自己做这些工作很痛苦,而且经常失败,其他人已经完成了解决这些问题的工作,这些人是制定ORM的人。是的,你是对的。我们在类型化数据集上有自己的ORM。我们使用类型化数据集只是作为一个数据模型,我们并不严重依赖它们。但我们仍然需要以某种方式在运行时创建它!任何想法。我不明白为什么你有一个ORM和类型化的数据集,你会在运行时生成。请更新问题以详细说明。而且,林克似乎能够解决这个问题。只是一种预感。似乎LINQ或您的ORM解决方案应该有一个API,可以在设计时动态地为未知数据库生成类。+1他们自己做很痛苦,而且经常失败,其他人已经完成了解决这些问题的工作,这些人就是制造ORM的人。是的,你是对的。我们在类型化数据集上有自己的ORM。我们使用类型化数据集只是作为一个数据模型,我们并不严重依赖它们。但我们仍然需要以某种方式在运行时创建它!任何想法。我不明白为什么你有一个ORM和类型化的数据集,你会在运行时生成。请更新问题以详细说明。而且,林克似乎能够解决这个问题。这只是一个预感。似乎LINQ或您的ORM解决方案应该有一个API,可以在设计时动态为未知数据库生成类。xsd.exe将从现有的xsd定义生成类文件。文件我还需要生成XSD。我还需要创建表适配器。您也可以直接与XsdTool.XSD类,甚至System.Data.Design.TypedDataSetGenerator和System.Xml.Serialization.XmlReflectionImporter/XmlSchemaExporter.XSD.EXE对话,而不必启动XSD.EXE,它将从现有的XSD定义生成类文件。文件我还需要生成XSD。我还需要创建表适配器。您也可以直接与XsdTool.XSD类甚至System.Data.Design.TypedDataSetGenerator和System.Xml.Serialization.XmlReflectionImporter/XmlSchemaExporter对话,而不必启动XSD.EXE。