現在、データベースを動的に処理するデータベース ハンドラーを作成しようとしています。フィールドタイプ「String、int、bool、String」のクラスがあり、このクラスをテーブルに変換し、すべてのフィールドタイプをデータセットの「フィールド」に変換したいとしますか?
どうやってやるの?
また、「System.Data.DataSet」、「System.Data.DataTable」、「System.Data.DataRow」、およびそれを処理するある種のアダプターを継承するいくつかのクラスを作成できますか。
設計モードに入ってデータセットを作成するとき、コードを見たときにコードを理解するのが非常に難しいことを私は知っています。しかし、これらのオブジェクトを使用し、それらを処理するクラスを作成して、データベースを動的に「作成」できるようにすることは可能ではないでしょうか。「デザイナー ビュー」は得られませんが、Database.AddTable(new Table("Field1", "Field2, "Field3")) は、デザイナー モードでグラフィカルに行うのと同じようにする必要があります。
何か案は?
主なアイデアは、柔軟性があり、どのクラスを取得しても、このクラスのフィールド値の各オブジェクトをデータベース フィールドとして持つ行のテーブルに変換できるということです。
アップデート
これは私がこの 1 時間で作成した単純なクラスですが、正しい方法で考えていますか? *.mdf / *.sdf ファイルに DataSet を追加できるようにする必要があります。
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;
}
}