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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
///*************************************************************************/
///*
///* 文件名    :GenerateSqlCmdByObjectClass.cs    
///*
///* 程序说明  : 由对象实体类模型创建SQL命令生成器
///* 原创作者  :孙中吕 
///* 
///* Copyright 2006-2021 C/S框架网 www.csframework.com
///*
///**************************************************************************/
 
using System;
using System.Collections;
using System.Data;
using System.Data.Common;
using System.Reflection;
 
namespace CSFrameworkV5.Core.CodeGenerator
{
    /// <summary>
    /// 由对象实体类模型创建SQL命令生成器
    /// </summary>
    public class GenerateSqlCmdByObjectClass : GenerateSqlCmdBase
    {
        /// <summary>
        /// 构造器
        /// </summary>
        /// <param name="ORM_Model">表结构字段定义类</param>
        public GenerateSqlCmdByObjectClass(Type ORM_Model, DataTable ORM_Table,
            ICommandFactory factory)
            : base(factory)
        {
            GenerateSQL(ORM_Model, ORM_Table);
        }
 
        /// <summary>
        /// 构造器
        /// </summary>
        /// <param name="ORM_Model">表结构字段定义类</param>
        public GenerateSqlCmdByObjectClass(Type ORM_Model, DataTable ORM_Table,
            ICommandFactory factory, GeneratedSQLEventHandle eventHandle)
            : base(factory)
        {
            GenerateSQL(ORM_Model, ORM_Table);
 
            //触发事件
            if (eventHandle != null)
                eventHandle(_sqlInsert, _sqlDelete, _sqlUpdate);
        }
 
        /// <summary>
        /// 构造器
        /// </summary>
        /// <param name="ORM_Model">ORM类的类型,如:typeof(tb_PO),typeof(tb_SO)</param>
        public void GenerateSQL(Type ORM_Model, DataTable ORM_Table)
        {
            object[] attrClass;
 
            //查找ORM的属性定义
            ORM_TableAttribute classAttribute = null;
            attrClass =
                ORM_Model.GetCustomAttributes(typeof(ORM_TableAttribute),
                    false);
            if (attrClass != null && attrClass.Length == 0)
                throw new Exception("ORM_ObjectClassAttribute未定义!");
            classAttribute = attrClass[0] as ORM_TableAttribute;
 
            //查找ORM控制并发的属性定义
            ORM_ConcurrentAttribute concurrentAttribute = null;
            attrClass =
                ORM_Model.GetCustomAttributes(typeof(ORM_ConcurrentAttribute),
                    false);
            if (attrClass != null && attrClass.Length > 0 &&
                classAttribute.IsSummaryTable) //仅主表控制并发
            {
                concurrentAttribute = attrClass[0] as ORM_ConcurrentAttribute;
                _ConcurrentAttribute = concurrentAttribute;
            }
 
            //是否主表属性            
            _IsSummary = classAttribute.IsSummaryTable;
            _PrimaryFieldName =
                classAttribute.PrimaryKey; //主键,复合主键盘用";"分开            
 
            //生成一个新的对象
            var obj = ORM_Model.Assembly.CreateInstance(ORM_Model.FullName);
 
            //获取类中的所有属性
            var infosSelf = ORM_Model.GetProperties();
            var infosBase = ORM_Model.BaseType.GetProperties();
 
            PropertyInfo[] infos = null;
            if (infosBase.Length == 0)
            {
                infos = infosSelf;
            }
            else
            {
                var iLength = infosBase.Length;
                Array.Resize<PropertyInfo>(ref infosBase,
                    infosBase.Length + infosSelf.Length); //相加两数组
                infosSelf.CopyTo(infosBase, iLength);
                infos = infosBase;
            }
 
            var fieldArr = new ArrayList();
 
            _cmdInsert = _Factory.CreateCommand();
            _cmdUpdate = _Factory.CreateCommand();
            _cmdDelete = _Factory.CreateCommand();
 
            var paramSymbol = _Factory.ParamSymboName;
            DbParameter p;
 
            foreach (var info in infos)
            {
                //取字段属性定义
                var attrField =
                    info.GetCustomAttributes(typeof(ORM_FieldAttribute), false);
                if (attrField == null || attrField.Length == 0) continue;
 
                var fieldName = info.Name;
                var fieldAttr = attrField[0] as ORM_FieldAttribute;
                if (ORM_Table.Columns[fieldName] == null) continue;
 
                //构造SQL命令带参数的SQL语句
                if (fieldAttr.IsAddOrUpdate)
                {
                    //构造带参数的Insert命令的SQL语句
                    if (!_cmdInsert.Parameters.Contains(paramSymbol +
                            fieldName))
                    {
                        p = _Factory.CreateParameter(paramSymbol + fieldName,
                            fieldAttr.Type, fieldAttr.Size, fieldName);
                        _cmdInsert.Parameters.Add(p);
                    }
 
                    //构造带参数的Update命令的SQL语句
                    if (!_cmdUpdate.Parameters.Contains(paramSymbol +
                            fieldName))
                    {
                        p = _Factory.CreateParameter(paramSymbol + fieldName,
                            fieldAttr.Type, fieldAttr.Size, fieldName);
                        _cmdUpdate.Parameters.Add(p);
                    }
 
                    var colProper = new ColumnProperty(fieldName,
                        fieldAttr.IsPrimaryKey ? true : false);
                    fieldArr.Add(colProper);
                }
 
                //生成主键的参数
                if (fieldAttr.IsPrimaryKey)
                {
                    if (!_cmdUpdate.Parameters.Contains(paramSymbol +
                            fieldName))
                    {
                        p = _Factory.CreateParameter(paramSymbol + fieldName,
                            fieldAttr.Type, fieldAttr.Size, fieldName);
                        _cmdUpdate.Parameters.Add(p);
                    }
 
                    if (!_cmdDelete.Parameters.Contains(paramSymbol +
                            fieldName))
                    {
                        p = _Factory.CreateParameter(paramSymbol + fieldName,
                            fieldAttr.Type, fieldAttr.Size, fieldName);
                        _cmdDelete.Parameters.Add(p);
                    }
                }
 
                //控制并发的字段名
                if (concurrentAttribute != null &&
                    concurrentAttribute.TimestampFieldName == fieldName)
                    if (!_cmdUpdate.Parameters.Contains(paramSymbol +
                            fieldName))
                    {
                        p = _Factory.CreateParameter(paramSymbol + fieldName,
                            fieldAttr.Type, fieldAttr.Size, fieldName);
                        _cmdUpdate.Parameters.Add(p);
                    }
 
 
                //流水号字段名
                if (fieldAttr.IsDocFieldName) _DocNoFieldName = fieldName;
 
                //外键字段名                
                if (fieldAttr.IsForeignKey)
                    _ForeignFieldName =
                        (string.IsNullOrEmpty(_ForeignFieldName)
                            ? ""
                            : _ForeignFieldName + ";") + fieldName; //组合外键
            }
 
            _sqlInsert = GenerateInsertSql(classAttribute.TableName,
                classAttribute.PrimaryKey, fieldArr); //新增的SQL
            _sqlUpdate = GenerateUpdateSql(classAttribute.TableName,
                classAttribute.PrimaryKey, fieldArr); //修改的SQL
            _sqlDelete = GenerateDeleteSql(classAttribute.TableName,
                classAttribute.PrimaryKey); //删除的SQL
        }
    }
}