如何在运行时使用 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# 创建强类型数据集?的主要内容,如果未能解决你的问题,请参考以下文章