代码之家  ›  专栏  ›  技术社区  ›  ihsancemil

如何在Mono Data SQL中获取DataTable

  •  0
  • ihsancemil  · 技术社区  · 7 年前

    我编写了一个函数来获取数据库中对象的列表

    public List<T> GetList<T>() where T: new()
    {
        IDbCommand dbCmd = dbcon.CreateCommand();
        dbCmd.CommandText = "SELECT * FROM " + typeof(T).FullName;
        IDataReader reader = dbCmd.ExecuteReader();
        DataTable schemaTable = reader.GetSchemaTable();
    
        List<T> returnList = new List<T>();
        foreach (DataRow row in schemaTable.Rows)
        {
            T obj = new T();
            foreach(var prop in obj.GetType().GetProperties())
            {
                prop.SetValue(obj, row[prop.Name], null);
            }
            returnList.Add(obj);
        }
    
        return returnList;
    }
    

    不过,如果我为我的武器类运行这个

    public int ID { get; set;}
    public int Cost { get; set; }
    public int Power { get; set; }
    public int Distance { get; set; }
    

    我得到25列,如果我运行的怪物类,我得到相同的25列,这是由“列名称”,“列序号”,“列大小”,“数字精度”等。。。

    因此,我无法设置“Cost”属性,因为此数据集没有Cost列名。

    我怎样才能得到正确的计划?

    1 回复  |  直到 7 年前
        1
  •  0
  •   ihsancemil    7 年前

    我不用SchemaTable解决我的问题

    public List<T> GetList<T>() where T: new()
    {
        IDbCommand dbCmd = dbcon.CreateCommand();
        dbCmd.CommandText = String.Format("SELECT * FROM {0}", typeof(T).FullName);
        IDataReader reader = dbCmd.ExecuteReader();
    
        List<T> returnList = new List<T>();
        while (reader.Read())
        {
            T obj = new T();
            foreach(var prop in obj.GetType().GetProperties())
            {
                prop.SetValue(obj, Convert.ChangeType(reader[prop.Name], prop.PropertyType), null);
            }
            returnList.Add(obj);
        }
    
        return returnList;
    }
    

    此脚本成功获取给定表中的所有项。