现在我正在尝试创建一个动态处理数据库的数据库处理程序。假设我有一类fieldtypes“String,int,bool,String”,并希望将此类转换为表格,并将所有字段类型转换为数据集的“字段”?
我该怎么做?
另外,我可以创建一些继承的类:“System.Data.DataSet”,“System.Data.DataTable”,“System.Data.DataRow”,以及某种处理它的适配器。
我知道当你进入设计模式并创建数据集时,代码很难看出来。但是不应该通过使用这些对象并创建处理它们的类来实现动态“创建”数据库。它不会获得“Designer视图”,但是Database.AddTable(新表(“Field1”,“Field2”,“Field3”))应该与在Designer模式下以图形方式执行相同的操作。
有什么想法吗?
主要思想是它很灵活,我可以使用任何类并将其转换为行表,该类的每个对象的字段值都作为数据库字段。
更新
这只是我在过去一小时内所做的一个简单课程,我是否正确思考? 仍然需要能够将DataSet添加到* .mdf / * .sdf文件中,我该怎么做?
public class DataAccess
{
SqlConnection connection;
DataSet dataSet;
public DataAccess(String databaseName, String connectionStr)
{
dataSet = new DataSet(databaseName);
connection = new SqlConnection(connectionStr);
}
public void AddTable<T>(String tableName)
{
dataSet.Tables.Add(new DBTable<T>(tableName));
}
public void AddRow<T>(String tableName, T row)
{
((DBTable<T>)dataSet.Tables[tableName]).AddRow<T>(row);
}
public List<C> GetRows<T, C>(String tableName, String columnName)
{
return ((DBTable<T>)dataSet.Tables[tableName]).GetRow<C>(columnName);
}
public String GetXML()
{
return dataSet.GetXml();
}
#region METHOD PROPERTIES
public int ColumnCount(String tableName)
{
for (int i = 0; i < dataSet.Tables.Count; i++)
{
if (dataSet.Tables[i].TableName == tableName)
{
return dataSet.Tables[i].Columns.Count;
}
}
return 0;
}
#endregion
}
public class DBTable<T> : System.Data.DataTable
{
public DBTable(String tableName) : base(tableName)
{
PropertyInfo[] properties = typeof(T).GetProperties();
for (int i = 0; i < properties.Length; i++)
{
try
{
AddColumn(properties[i].Name, properties[i].PropertyType);
}
catch { }
}
}
private void AddColumn(String name, Type t)
{
this.Columns.Add(new DataColumn(name, t, null, MappingType.Attribute));
}
public void AddRow<T>(T obj)
{
PropertyInfo[] properties = typeof(T).GetProperties();
if (properties.Length == this.Columns.Count)
{
bool valid = true;
for (int i = 0; i < properties.Length; i++)
{
if (properties[i].PropertyType != this.Columns[i].DataType)
{
valid = false;
}
}
if (valid)
{
object[] p = new object[this.Columns.Count];
for (int i = 0; i < properties.Length; i++)
{
p[i] = properties[i].GetValue(obj, null);
}
this.Rows.Add(p);
}
}
}
public List<T> GetRow<T>(String columnName)
{
List<T> objects = new List<T>();
for (int i = 0; i < this.Rows.Count; i++)
{
objects.Add((T)this.Rows[i][this.Columns[columnName]]);
}
return objects;
}
}
答案 0 :(得分:4)
您正在寻找Petapoco库。您可以非常轻松地将数据从数据库保存和检索到POCO对象,反之亦然。
您可能需要查看泛型列表和LINQ的一些内容:Petapoco方法不使用DataSet
或DataTable
个对象。
正如leppie所说,这不是问题的答案。因此,创建与类匹配的DataTable对象可以通过以下方式实现:
public static DataTable CreateDataTable<T>()
{
var dt = new DataTable();
var propList = typeof(T).GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach(MemberInfo info in propList)
{
if(info is PropertyInfo)
dt.Columns.Add(new DataColumn(info.Name, (info as PropertyInfo).PropertyType));
else if(info is FieldInfo)
dt.Columns.Add(new DataColumn(info.Name, (info as FieldInfo).FieldType));
}
return dt;
}
如果您希望之后填写此表:
public static void FillDataTable<T>(DataTable dt, List<T> items)
{
var propList = typeof(T).GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach(T t in items)
{
var row = dt.NewRow();
foreach(MemberInfo info in propList)
{
if (info is PropertyInfo)
row[info.Name] = (info as PropertyInfo).GetValue(t, null);
else if (info is FieldInfo)
row[info.Name] = (info as FieldInfo).GetValue(t);
}
dt.Rows.Add(row);
}
}
如果您希望在同一时间创建和填充DataTable
对象,也可以在单个函数中混合使用这两个功能。