首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类到DataSet / DataSet到类

类到DataSet / DataSet到类
EN

Stack Overflow用户
提问于 2012-05-03 10:07:34
回答 1查看 20.5K关注 0票数 2

现在,我正在尝试创建一个动态处理数据库的数据库处理程序。假设我有一个字段类型"String,int,bool,String“的类,并希望将这个类转换为表,并将所有字段类型转换为dataset的”字段“?

我怎么能这么做?

另外,我可以创建一些继承的类:"System.Data.DataSet“、"System.Data.DataTable”、"System.Data.DataRow",以及某种类型的适配器来处理它。

我知道当您进入设计模式并创建一个数据集时,当您查看它时,代码是很难理解的。但是,不应该通过使用这些对象并创建处理这些对象的类来动态地“创建”数据库。它不会获得"Designer视图“,但是,Database.AddTable(新表(”Field1“、"Field2”、“Field3”)应该与您在设计模式下所做的一样。

有什么想法吗?

其主要思想是,它是灵活的,我可以接受任何类,并将其转换为一个行表,该类的每个对象的字段值都作为数据库字段。

更新

这只是我在最后一小时做的一个简单的类,我是否认为是正确的?仍然需要能够将DataSet添加到*.mdf / *.sdf文件中,我如何做到这一点?

代码语言:javascript
复制
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;

    }
}
EN

回答 1

Stack Overflow用户

发布于 2012-05-03 10:11:29

佩塔波科库是您要寻找的内容。您可以将数据从数据库保存和检索到POCO对象,反之亦然。

您可能需要查看一下泛型列表和一些LINQ : Petapoco方法不使用DataSetDataTable对象。

正如莱皮所言,这并不是问题的答案。因此,可以通过以下方式创建与类匹配的DataTable对象:

代码语言:javascript
复制
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;
}

如果你想在以后填满这张桌子:

代码语言:javascript
复制
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对象,也可以将这两个特性混合在一个函数中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10429220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档