📜  功能<IDataRecord, T>c# (1)

📅  最后修改于: 2023-12-03 15:36:58.285000             🧑  作者: Mango

功能介绍

C#中的IDataRecord是一个接口,可以将数据行以任意顺序读取,以获取查询的结果集中的所有列的值,类似于ADO.NET中的DataReader对象。但是,使用IDataRecord对象的好处是,您可以在遍历结果集中的各个数据行时,将每个数据行封装为一个初始强类型实例。

IDataRecord通常与泛型方法结合使用,为程序员提供了更完整的数据抽象和更好的类型安全性。

使用示例
C# 代码
public List<T> MapToList<T>(IDataReader dr) where T : new()
{
    var list = new List<T>();
    var props = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);
    var columnMap = new Dictionary<string, PropertyInfo>(StringComparer.OrdinalIgnoreCase);

    for (var i = 0; i < dr.FieldCount; i++)
    {
        var columnName = dr.GetName(i);
        if (props.Any(n => string.Equals(n.Name, columnName, StringComparison.Ordinal)))
        {
            var prop = props.First(n => string.Equals(n.Name, columnName, StringComparison.Ordinal));
            columnMap[columnName] = prop;
        }
    }

    while (dr.Read())
    {
        var obj = new T();

        for (var i = 0; i < dr.FieldCount; i++)
        {
            var columnName = dr.GetName(i);
            if (!columnMap.ContainsKey(columnName)) continue;

            var prop = columnMap[columnName];
            if (prop.CanWrite)
            {
                var value = dr.GetValue(i);
                if (value != DBNull.Value)
                {
                    prop.SetValue(obj, value, null);
                }
            }
        }

        list.Add(obj);
    }

    return list;
}
示例解释

以上示例代码演示了如何使用IDataRecord和泛型方法,将IDataReader中的数据转换成强类型实例列表。

首先,通过反射获取实例的公共属性; 然后,通过IDataRecord接口读取数据行中的列名,并将其映射到公共属性对象中; 最后,创建强类型实例并将其添加到列表中。

这样,您就可以使用这种方法处理各种数据源,并且可以保持类型安全性。