从SqlDataReader填充通用列表

时间:2017-07-13 07:58:48

标签: c# generics

我根据列ID读取SqlDataReader中不同类型的某些字段。我尝试编写一个通用函数来获取List中的字段。

private static List<T> GetSqlFields<T>(SqlDataReader reader, int columnId)
    {
        var fields = new List<T>();
        while (reader.Read())
        {
            T f = reader.Get... // Problem is here
            fields.Add(f);
        }
        return fields;
    }

问题是我只看到方法GetStringGetInt32等。有没有办法根据T获取字段?谢谢。

我这样做是为了能够写:

    int fooColumnId = reader.GetOrdinal("Foo");
    int barColumnId = reader.GetOrdinal("Baar");
    List<string> foos = GetSqlFields<string>(reader, fooColumnId);
    List<int> baars = GetSqlFields<int>(reader, barColumnId);

2 个答案:

答案 0 :(得分:2)

您需要:SqlDataReader.GetFieldValue<T>(int i)

此方法(如链接的文档所示)对列号采用int并返回类型为T的对象。值得注意的是,这并不支持任何 {{1}但它支持的列表(在该页面上)涵盖了您可能希望涵盖的内容(即,看起来像所有类型的.NET等价的SQL数据类型)。

如果您没有感兴趣的列的索引(在这种情况下看起来像你这样做,但我添加了完整性)那么您可以使用T来获取列名称中的列号。

答案 1 :(得分:1)

不知道你在追求什么,但是:

private static List<T> GetSqlFields<T>(SqlDataReader reader, int columnId,
    Func<IDataReader, int, T> accessor)
{
    var fields = new List<T>();
    while (reader.Read())
    {            
        T f = accessor(reader, columnId);
        fields.Add(f);
    }

    return fields;
}

List<int> baars = GetSqlFields<int>(reader, barColumnId, (dr, i) => dr.GetInt32(i));