我需要在运行时为用户首选目标数据库创建强类型数据集。 Visual Studio为创建类型化数据集提供了大量的设计时间支持。我需要在运行时自动生成目标数据库的类型化数据集。
它应该创造......
1。)XSD文件。
2.。)重新命名数据库
的类型化数据集3.。)为表中的所有数据库表和列键入包装。
4。)每个表的TableAdapters。
所以我需要在运行时生成相同类型的数据集,这通常是在设计时使用Visual Studio的Typed数据集设计器创建的。
答案 0 :(得分:2)
您可以使用XSD.EXE
。从你的程序中解雇它......
答案 1 :(得分:2)
我倾向于同意jcollum,在运行时使用Typed Dataset可能是错误的方法。另一方面,如果您希望能够在运行时从数据库获取结构化数据(也称为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 :(得分:1)
鉴于我过去使用类型化数据集的经验 - 以及所有相关的失败和问题 - 我强烈建议您使用ORM映射器进行调查。换句话说,远离Typed Datasets。