代码之家  ›  专栏  ›  技术社区  ›  this. __curious_geek

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

  •  0
  • this. __curious_geek  · 技术社区  · 17 年前

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

    它应该创造。。。

    1.)XSD文件。

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

    4.)每个表的表适配器。

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

    3 回复  |  直到 17 年前
        1
  •  2
  •   Arjan Einbu    17 年前

    你可能需要 XSD.EXE . 从你的程序中启动它。。。

        2
  •  2
  •   Serapth    17 年前

    我倾向于同意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。

    或者我误解了你的要求。

        3
  •  1
  •   jcollum    17 年前

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