首页 > 解决方案 > 如何在 Mono Data SQL 中获取 DataTable

问题描述

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

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;
}

但是,如果我为我的 Weapon 类运行它,它有

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

我得到 25 列,如果为 Monster 类运行,我得到相同的 25 列,分别为“ColumnName”、“ColumnOrdinal”、“ColumnSize”、“NumericPrecision”等...

所以我不能设置我的“成本”属性,因为这个数据集没有成本列名称。

如何正确获取 SchemaTable?

标签: databasesqlitemono

解决方案


我在不使用 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;
}

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


推荐阅读