在操作数据记录时,对重要的数据,我们需要记录每一次的变更,有没有好的方法呢?
在通用权限管理系统中提供了记录数据表信息变更的方法。
一、先看看效果截图
二、再看看修改记录表的表结构
三、对该表访问的业务类
1 public partial class ModifyRecordManager : BaseManager, IBaseManager 2 { 3 /// <summary> 4 /// 构造函数 5 /// </summary> 6 public ModifyRecordManager() 7 { 8 if (base.dbHelper == null) 9 { 10 base.dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.BusinessDbType, BaseSystemInfo.BusinessDbConnection); 11 } 12 if (string.IsNullOrEmpty(base.CurrentTableName)) 13 { 14 base.CurrentTableName = ZTO_QUOTE_MODIFYRECORDEntity.TableName; 15 } 16 base.PrimaryKey = "Id"; 17 } 18 19 /// <summary> 20 /// 构造函数 21 /// <param name="tableName">指定表名</param> 22 /// </summary> 23 public ModifyRecordManager(string tableName) 24 { 25 base.CurrentTableName = tableName; 26 } 27 28 /// <summary> 29 /// 构造函数 30 /// </summary> 31 /// <param name="dbHelper">数据库连接</param> 32 public ModifyRecordManager(IDbHelper dbHelper) 33 : this() 34 { 35 DbHelper = dbHelper; 36 } 37 38 /// <summary> 39 /// 构造函数 40 /// </summary> 41 /// <param name="userInfo">用户信息</param> 42 public ModifyRecordManager(BaseUserInfo userInfo) 43 : this() 44 { 45 UserInfo = userInfo; 46 } 47 48 /// <summary> 49 /// 构造函数 50 /// </summary> 51 /// <param name="userInfo">用户信息</param> 52 /// <param name="tableName">指定表名</param> 53 public ModifyRecordManager(BaseUserInfo userInfo, string tableName) 54 : this(userInfo) 55 { 56 base.CurrentTableName = tableName; 57 } 58 59 /// <summary> 60 /// 构造函数 61 /// </summary> 62 /// <param name="dbHelper">数据库连接</param> 63 /// <param name="userInfo">用户信息</param> 64 public ModifyRecordManager(IDbHelper dbHelper, BaseUserInfo userInfo) 65 : this(dbHelper) 66 { 67 UserInfo = userInfo; 68 } 69 70 /// <summary> 71 /// 构造函数 72 /// </summary> 73 /// <param name="dbHelper">数据库连接</param> 74 /// <param name="userInfo">用户信息</param> 75 /// <param name="tableName">指定表名</param> 76 public ModifyRecordManager(IDbHelper dbHelper, BaseUserInfo userInfo, string tableName) 77 : this(dbHelper, userInfo) 78 { 79 base.CurrentTableName = tableName; 80 } 81 82 /// <summary> 83 /// 添加, 这里可以人工干预,提高程序的性能 84 /// </summary> 85 /// <param name="entity">实体</param> 86 /// <param name="identity">自增量方式,表主键是否采用自增的策略</param> 87 /// <param name="returnId">返回主键,不返回程序允许速度会快,主要是为了主细表批量插入数据优化用的</param> 88 /// <returns>主键</returns> 89 public string Add(ZTO_QUOTE_MODIFYRECORDEntity entity, bool identity = true, bool returnId = true) 90 { 91 this.Identity = identity; 92 this.ReturnId = returnId; 93 entity.Id = int.Parse(this.AddObject(entity)); 94 return entity.Id.ToString(); 95 } 96 97 /// <summary> 98 /// 更新 99 /// </summary> 100 /// <param name="entity">实体</param> 101 public int Update(ZTO_QUOTE_MODIFYRECORDEntity entity) 102 { 103 return this.UpdateObject(entity); 104 } 105 106 /// <summary> 107 /// 获取实体 108 /// </summary> 109 /// <param name="id">主键</param> 110 public ZTO_QUOTE_MODIFYRECORDEntity GetObject(string id) 111 { 112 return GetObject(int.Parse(id)); 113 } 114 115 public ZTO_QUOTE_MODIFYRECORDEntity GetObject(int id) 116 { 117 return BaseEntity.Create<ZTO_QUOTE_MODIFYRECORDEntity>(this.GetDataTable(new KeyValuePair<string, object>(this.PrimaryKey, id))); 118 } 119 120 /// <summary> 121 /// 添加实体 122 /// </summary> 123 /// <param name="entity">实体</param> 124 public string AddObject(ZTO_QUOTE_MODIFYRECORDEntity entity) 125 { 126 string key = string.Empty; 127 SQLBuilder sqlBuilder = new SQLBuilder(DbHelper, this.Identity, this.ReturnId); 128 sqlBuilder.BeginInsert(this.CurrentTableName, this.PrimaryKey); 129 if (!this.Identity) 130 { 131 // 这里已经是指定了主键了,所以不需要返回主键了 132 sqlBuilder.ReturnId = false; 133 sqlBuilder.SetValue(this.PrimaryKey, entity.Id); 134 } 135 else 136 { 137 if (!this.ReturnId && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2)) 138 { 139 if (DbHelper.CurrentDbType == CurrentDbType.Oracle) 140 { 141 sqlBuilder.SetFormula(this.PrimaryKey, "SEQ_" + this.CurrentTableName.ToUpper() + ".NEXTVAL "); 142 } 143 if (DbHelper.CurrentDbType == CurrentDbType.DB2) 144 { 145 sqlBuilder.SetFormula(this.PrimaryKey, "NEXT VALUE FOR SEQ_" + this.CurrentTableName.ToUpper()); 146 } 147 } 148 else 149 { 150 if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2)) 151 { 152 BaseSequenceManager sequenceManager = new BaseSequenceManager(DbHelper); 153 entity.Id = int.Parse(sequenceManager.Increment(this.CurrentTableName)); 154 sqlBuilder.SetValue(this.PrimaryKey, entity.Id); 155 } 156 } 157 } 158 this.SetObject(sqlBuilder, entity); 159 if (UserInfo != null) 160 { 161 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldCreateUserId, UserInfo.Id); 162 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldCreateBy, UserInfo.RealName); 163 } 164 sqlBuilder.SetDBNow(ZTO_QUOTE_MODIFYRECORDEntity.FieldCreateOn); 165 if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.SqlServer || DbHelper.CurrentDbType == CurrentDbType.Access)) 166 { 167 key = sqlBuilder.EndInsert().ToString(); 168 } 169 else 170 { 171 sqlBuilder.EndInsert(); 172 } 173 if (this.Identity && (DbHelper.CurrentDbType == CurrentDbType.Oracle || DbHelper.CurrentDbType == CurrentDbType.DB2)) 174 { 175 return entity.Id.ToString(); 176 } 177 return key; 178 } 179 180 /// <summary> 181 /// 更新实体 182 /// </summary> 183 /// <param name="entity">实体</param> 184 public int UpdateObject(ZTO_QUOTE_MODIFYRECORDEntity entity) 185 { 186 SQLBuilder sqlBuilder = new SQLBuilder(DbHelper); 187 sqlBuilder.BeginUpdate(this.CurrentTableName); 188 this.SetObject(sqlBuilder, entity); 189 sqlBuilder.SetWhere(this.PrimaryKey, entity.Id); 190 return sqlBuilder.EndUpdate(); 191 } 192 193 // 这个是声明扩展方法 194 partial void SetObjectExpand(SQLBuilder sqlBuilder, ZTO_QUOTE_MODIFYRECORDEntity entity); 195 196 /// <summary> 197 /// 设置实体 198 /// </summary> 199 /// <param name="entity">实体</param> 200 private void SetObject(SQLBuilder sqlBuilder, ZTO_QUOTE_MODIFYRECORDEntity entity) 201 { 202 SetObjectExpand(sqlBuilder, entity); 203 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldNEWKEY, entity.NEWKEY); 204 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldNEWVALUE, entity.NEWVALUE); 205 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldCOLUMNDESCRIPTION, entity.COLUMNDESCRIPTION); 206 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldOLDKEY, entity.OLDKEY); 207 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldOLDVALUE, entity.OLDVALUE); 208 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldRECORDKEY, entity.RECORDKEY); 209 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldCOLUMNCODE, entity.COLUMNCODE); 210 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldTABLEDESCRIPTION, entity.TABLEDESCRIPTION); 211 sqlBuilder.SetValue(ZTO_QUOTE_MODIFYRECORDEntity.FieldTABLECODE, entity.TABLECODE); 212 } 213 214 /// <summary> 215 /// 删除实体 216 /// </summary> 217 /// <param name="id">主键</param> 218 /// <returns>影响行数</returns> 219 public int Delete(int id) 220 { 221 return this.Delete(new KeyValuePair<string, object>(this.PrimaryKey, id)); 222 } 223 }