将SqlDataReader结果映射到对象

时间:2015-01-15 12:53:04

标签: c# reflection sqldatareader

我尝试创建一个通用方法,根据属性名称将结果从SqlDataReader转换为POCO object。这是我到目前为止所得到的:

POCO对象:

public class Order
{
    [DbField]
    public int OrderId { get; set; }
    [DbField]
    public string OrderName { get; set; }
    [DbField]
    public DateTime OrderDate { get; set; }

    public int NonDbProperty { get; set; }
}

属性定义:

public class DbFieldAttribute : Attribute { }

使用对象的DbField属性检索所有属性的方法:

public static IEnumerable<string> GetPropertiesWithDbAttribute<T>()
{
    var allProps = typeof(T).GetProperties();
    var props = allProps.Where(p => Attribute.IsDefined(p, typeof(DbFieldAttribute))).Select(n => n.Name);
        return props.ToList();
}

和实际的SELECT操作:

public object GetFirstOrder()
    {
        try
        {
            Order temp = new Order();
            using (SqlConnection con = new SqlConnection(GetConnection()))
            using (var cmd = con.CreateCommand())
            {
                con.Open();
                cmd.CommandText = "SELECT * FROM [Order] WHERE OrderId = 1";

                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    if (sdr.HasRows)
                    {
                        var props = Utils.GetPropertiesWithDbAttribute<Order>();
                        while (sdr.Read())
                        {

                            foreach (string item in props)
                            {
                                temp.GetType().GetProperty(item).SetValue(temp, sdr[item]);
                            }
                        }
                    }
                }
            }
            return temp;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

这在我到目前为止所做的测试中有效,但是我想知道在object中检索到的sdr[item]之间的自动转换是否足够,或者我是否应该使用基于的显式转换属性的类型,例如:

//DateTime? property:
temp.GetType().GetProperty(item).SetValue(temp, sdr[item] == DBNull.Value? null: (DateTime?)sdr[item]);

0 个答案:

没有答案