我根据列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;
}
问题是我只看到方法GetString
,GetInt32
等。有没有办法根据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);
答案 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));