1
yhj
2024-07-24 5e5d945e91568b973faa27d8ab0bcef99fc4a6c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
using System;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Reflection;
 
namespace CSFramework.DB
{
    /// <summary>
    /// 数据转换工具,DbDataReader/DataRow转实体对象
    /// </summary>
    public static class DbTools
    {
        private static void SetValue(object obj, PropertyInfo p, string fname,
            object fvalue, Type fType)
        {
            object tv;
 
            //处理byte数组转日期,如SqlServer的Timestamp类型
            //数据类型是byte[],且对象属性类型是DateTime
            if (p.PropertyType == typeof(DateTime) && fType == typeof(byte[]))
            {
                var lo = Math.Abs(BitConverter.ToInt64((byte[])fvalue, 0));
                var rt = DateTime.FromBinary(lo);
                p.SetValue(obj, rt, null);
            }
            //数组类型,单独处理
            else if (p.PropertyType.IsArray)
            {
                if (fvalue == DBNull.Value) //特殊处理DBNull类型
                    p.SetValue(obj, null, null);
                else
                    p.SetValue(obj, fvalue, null);
            }
            //bool类型,特殊处理
            else if (p.PropertyType == typeof(bool))
            {
                var bTrue = "YES,Y,T,1,TRUE".Split(',');
                var bFalse = "NO,N,F,0,FALSE".Split(',');
 
                var o = bTrue
                    .Where(e =>
                        e.ToUpper() == fvalue.ToString().Trim().ToUpper())
                    .FirstOrDefault();
                if (!string.IsNullOrEmpty(o))
                    p.SetValue(obj, true, null);
                else
                    p.SetValue(obj, false, null);
            }
            //处理对象数据类型
            else if (p.PropertyType == typeof(object))
            {
                p.SetValue(obj, fvalue, null);
            }
            else
            {
                //普通数据类型,赋值操作
                if (fvalue == null ||
                    string.IsNullOrWhiteSpace(fvalue.ToString())) //空值
                    tv = p.PropertyType.IsValueType
                        ? Activator.CreateInstance(p.PropertyType)
                        : null; //值类型
                else
                    tv = System.ComponentModel.TypeDescriptor
                        .GetConverter(p.PropertyType)
                        .ConvertFromString(fvalue.ToString()); //创建对象
                p.SetValue(obj, tv, null);
            }
        }
 
        /// <summary>
        /// DbDataReader转换为对象实例,(字段名称优先)
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="row">DbDataReader实例</param>
        /// <returns></returns>
        public static T Convert2Object<T>(DbDataReader row) where T : new()
        {
            var obj = new T();
            var type = typeof(T);
 
            string fname;
            object fvalue;
            Type fType;
 
            //循环记录的字段名称
            for (var i = 0; i < row.FieldCount; i++)
            {
                fname = row.GetName(i); //字段名
                fvalue = row.GetValue(i); //字段的值
                fType = row.GetFieldType(i); //字段的数据类型
 
                //根据字段名称获取对象的属性
                var p = type.GetProperty(fname,
                    BindingFlags.Public | BindingFlags.Instance |
                    BindingFlags.IgnoreCase);
 
                if (p != null) SetValue(obj, p, fname, fvalue, fType);
            }
 
            return obj;
        }
 
        /// <summary>
        /// DataRow转换为对象实例
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="row">DataRow实例</param>
        /// <returns></returns>
        public static T Convert2Object<T>(DataRow row) where T : new()
        {
            var obj = new T();
            var type = typeof(T);
 
            string fname;
            object fvalue;
            Type fType;
 
            for (var i = 0; i < row.Table.Columns.Count; i++)
            {
                fname = row.Table.Columns[i].ColumnName; //字段名
                fvalue = row[fname]; //值
                fType = row.Table.Columns[i].DataType; //字段数据类型
 
                var p = type.GetProperty(fname,
                    BindingFlags.Public | BindingFlags.Instance |
                    BindingFlags.IgnoreCase);
 
                if (p != null) SetValue(obj, p, fname, fvalue, fType);
            }
 
            return obj;
        }
    }
}