using System; using System.Collections.Generic; using System.Data; using System.Data.Common; namespace CSFramework.DB { /// /// CSFramework通用数据框架-对象实体,支持MsSQL,MySQL,Oracle三种数据库 /// public class DbFramework { /// /// 当前事务 /// protected DbTransaction _CurrentTrans = null; protected IDatabase _db; /// /// 构造器 /// /// CSFramework.DB数据库底层通用接口 public DbFramework(IDatabase db) { _db = db; } /// /// 构造器 /// /// CSFramework.DB数据库底层通用接口 /// 事务 public DbFramework(IDatabase db, DbTransaction tran = null) { _db = db; _CurrentTrans = tran; } /// /// 启动事务机制 /// private void BeginTransaction() { if (_CurrentTrans == null) _CurrentTrans = _db.TransBegin(); } /// /// 提交事务 /// private void CommitTransaction() { try { if (_CurrentTrans != null) { _CurrentTrans.Commit(); _CurrentTrans.Dispose(); _CurrentTrans = null; } } catch (Exception ex) { throw ex; } } /// /// 回滚事务 /// private void RollbackTransaction() { try { if (_CurrentTrans != null) { _CurrentTrans.Rollback(); _CurrentTrans.Dispose(); _CurrentTrans = null; } } catch (Exception ex) { throw ex; } } /// /// 查询数据,返回对象列表 /// /// 对象类型 /// 查询语句 /// public List Select(string sql) where T : new() { return _db.ExecuteReaderList(sql); } /// /// 获取当前模型所有数据 /// /// /// public List Select() where T : new() { var sql = $"SELECT * FROM {typeof(T).Name}"; return _db.ExecuteReaderList(sql); } public T Select(string keyFieldName, object keyValue) where T : new() { var sql = $"SELECT * FROM {typeof(T).Name} WHERE {keyFieldName}={_db.ParamSymboName + keyFieldName}"; var cmd = _db.CreateCommand(sql); cmd.AddParam(keyFieldName).Value = keyValue; return _db.ExecuteReader(cmd.Command); } /// /// 查询数据,返回对象列表 /// /// 对象类型 /// 命令 /// public List Select(DbCommand cmd) where T : new() { return _db.ExecuteReaderList(cmd); } /// /// 提交单表DataTable /// /// DataTable对象 /// DataTable对应的实体类 /// 主键字段数组 /// 自增字段(或不能更新的字段)数组 /// 指定更新的字段 /// public int Update(DataTable dt, Type orm, string[] PKs, string[] ignoreFields = null, string[] updateFields = null) { var count = 0; try { BeginTransaction(); var generator = new DbCommandGenerator(_db); var adp = _db.CreateDataAdapter(); adp.UpdateCommand = generator.GetUpdateCommand(orm, PKs, ignoreFields, updateFields); adp.InsertCommand = generator.GetInsertCommand(orm, ignoreFields); adp.DeleteCommand = generator.GetDeleteCommand(orm, PKs); adp.UpdateCommand.Transaction = _CurrentTrans; adp.InsertCommand.Transaction = _CurrentTrans; adp.DeleteCommand.Transaction = _CurrentTrans; adp.UpdateCommand.Connection = _CurrentTrans.Connection; adp.InsertCommand.Connection = _CurrentTrans.Connection; adp.DeleteCommand.Connection = _CurrentTrans.Connection; adp.AcceptChangesDuringUpdate = false; count += adp.Update(dt); adp.Dispose(); CommitTransaction(); return count; } catch (DBConcurrencyException ex) { RollbackTransaction(); //回滚事务 throw new Exception( "并发操作!其他用户已更新了源数据!Event:DbDataUpdate.Update()\r\n\r\n" + ex.Message); } catch (Exception ex) { RollbackTransaction(); //回滚事务 throw new Exception( "更新数据发生错误!Event:DbDataUpdate。Update(),Table:" + dt.TableName + "\r\n\r\n" + ex.Message); } } /// /// 提交Dataset多表数据 /// /// 数据集 /// ORM与表结构参数定义 /// public int Update(DataSet ds, List orms) { if (ds.Tables.Count != orms.Count) throw new Exception("数据表与对象模型的数目不一致!"); var generator = new DbCommandGenerator(_db); var mCurrentTable = ""; DbDataUpdateORM mORM; var count = 0; try { BeginTransaction(); foreach (DataTable dt in ds.Tables) { mCurrentTable = dt.TableName; mORM = orms[ds.Tables.IndexOf(dt)]; var adp = _db.CreateDataAdapter(); adp.UpdateCommand = generator.GetUpdateCommand(mORM.ObjectType, mORM.PKs, mORM.IgnoreFields); adp.InsertCommand = generator.GetInsertCommand(mORM.ObjectType, mORM.IgnoreFields); adp.DeleteCommand = generator.GetDeleteCommand(mORM.ObjectType, mORM.PKs); adp.UpdateCommand.Transaction = _CurrentTrans; adp.InsertCommand.Transaction = _CurrentTrans; adp.DeleteCommand.Transaction = _CurrentTrans; adp.UpdateCommand.Connection = _CurrentTrans.Connection; adp.InsertCommand.Connection = _CurrentTrans.Connection; adp.DeleteCommand.Connection = _CurrentTrans.Connection; adp.AcceptChangesDuringUpdate = false; count += adp.Update(dt); adp.Dispose(); } CommitTransaction(); return count; } catch (DBConcurrencyException ex) { RollbackTransaction(); //回滚事务 throw new Exception( "并发操作!其他用户已更新了源数据!Event:DbDataUpdate.Update()\r\n\r\n" + ex.Message); } catch (Exception ex) { RollbackTransaction(); //回滚事务 throw new Exception("更新数据发生错误!Event:Update(),Table:" + mCurrentTable + "\r\n\r\n" + ex.Message); } } /// /// 新增对象 /// /// 对象实例 /// 自增字段(或不支持更新的字段)数组 /// public bool AddObject(T obj, params string[] ignoreFields) where T : new() { var count = 0; using (var conn = _db.CreateConnection()) { try { var generator = new DbCommandGenerator(_db); var cmd = generator.GetInsertCommand(obj, ignoreFields); cmd.Connection = conn; cmd.Transaction = _CurrentTrans; var i = _db.ExecuteCommand(cmd); if (i > 0) count += i; return count > 0; } catch (Exception ex) { throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" + ex.Message); } } } /// /// 新增对象 /// /// 对象实例 /// 自增字段(或不支持更新的字段)数组 /// 返回的最大自增字段值 /// public bool AddObject(T obj, string[] ignoreFields, out int isid) where T : new() { isid = 0; var count = 0; using (var conn = _db.CreateConnection()) { try { var generator = new DbCommandGenerator(_db); var cmd = generator.GetInsertCommand(obj, ignoreFields); var tableName = generator.GetTableName(obj.GetType()); //获取类对应的表名 cmd.Connection = conn; cmd.Transaction = _CurrentTrans; var i = _db.ExecuteCommand(cmd); if (i > 0) { count += i; isid = _db.GetMaxID(tableName); //获取最大的isid } return count > 0; } catch (Exception ex) { throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" + ex.Message); } } } /// /// 新增对象列表 /// /// 对象实例列表 /// 自增字段(或不支持更新的字段)数组 /// public int AddList(List list, params string[] ignoreFields) where T : new() { var generator = new DbCommandGenerator(_db); var count = 0; BeginTransaction(); try { foreach (var obj in list) { var cmd = generator.GetInsertCommand(obj, ignoreFields); cmd.Transaction = _CurrentTrans; cmd.Connection = _CurrentTrans.Connection; var i = _db.ExecuteCommand(cmd); if (i > 0) count += i; } CommitTransaction(); return count; } catch (Exception ex) { RollbackTransaction(); throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" + ex.Message); } } /// /// 批量更新对象列表数据 /// /// 对象实例列表 /// 主键字段名数组 /// 自增字段(或不支持更新的字段)数组 /// public int UpdateList(List list, string[] PKs = null, string[] ignoreFields = null, string[] updateFields = null) where T : new() { var generator = new DbCommandGenerator(_db); var count = 0; try { BeginTransaction(); foreach (var obj in list) { var cmd = generator.GetUpdateCommand(obj, PKs, ignoreFields, updateFields); cmd.Transaction = _CurrentTrans; cmd.Connection = _CurrentTrans.Connection; var i = _db.ExecuteCommand(cmd); if (i > 0) count += i; } CommitTransaction(); return count; } catch (Exception ex) { RollbackTransaction(); throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" + ex.Message); } } /// /// 修改对象,更新单个对象数据 /// /// 对象实例 /// 主键字段名数组 /// 自增字段(或不支持更新的字段)数组 /// public bool UpdateObject(T obj, string[] PKs = null, string[] ignoreFields = null, string[] updateFields = null) where T : new() { var count = 0; using (var conn = _db.CreateConnection()) { try { var generator = new DbCommandGenerator(_db); var cmd = generator.GetUpdateCommand(obj, PKs, ignoreFields, updateFields); cmd.Connection = conn; cmd.Transaction = _CurrentTrans; var i = _db.ExecuteCommand(cmd); if (i > 0) count += i; return count > 0; } catch (Exception ex) { throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" + ex.Message); } } } /// /// 批量删除数据 /// /// /// 对象实例列表 /// 主键字段名数组 /// public int DeleteList(List list, params string[] PKs) where T : new() { var generator = new DbCommandGenerator(_db); var count = 0; try { BeginTransaction(); foreach (var obj in list) { var cmd = generator.GetDeleteCommand(obj, PKs); cmd.Transaction = _CurrentTrans; cmd.Connection = _CurrentTrans.Connection; var i = _db.ExecuteCommand(cmd); if (i > 0) count += i; } CommitTransaction(); return count; } catch (Exception ex) { RollbackTransaction(); throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" + ex.Message); } } /// /// 删除对象 /// /// 对象实例 /// 主键字段名数组 /// public bool DeleteObject(T obj, params string[] PKs) where T : new() { var count = 0; using (var conn = _db.CreateConnection()) { try { var generator = new DbCommandGenerator(_db); var cmd = generator.GetDeleteCommand(obj, PKs); cmd.Connection = conn; cmd.Transaction = _CurrentTrans; var i = _db.ExecuteCommand(cmd); if (i > 0) count += i; return count > 0; } catch (Exception ex) { throw new Exception("更新数据发生错误!Event:Add()" + "\r\n\r\n" + ex.Message); } } } } /// /// 旧的名称:DbDataUpdate, 请使用DbFramework /// public class DbDataUpdate : DbFramework { /// /// 构造器 /// /// CSFramework.DB数据库底层通用接口 public DbDataUpdate(IDatabase db) : base(db) { } /// /// 构造器 /// /// CSFramework.DB数据库底层通用接口 /// 事务 public DbDataUpdate(IDatabase db, DbTransaction tran = null) : base(db, tran) { } } }