/// <summary> /// 创建一个空的执行对象。 /// </summary> /// <returns></returns> public static IExecuteObject CreateEmptyExecuteObject(ExecuteType type, string connKey = null) { ServerType serverType = GetServerType(connKey); //检查缓存 if (_executeList.ContainsKey(serverType)) { var empty = _executeList[serverType].CloneEmpty(); empty.ExecuteType = type; return(empty); } //反射实例化对象 string className = GetInstanceClassName(serverType) + "ExecuteObject"; Assembly ass = Assembly.GetExecutingAssembly(); object obj = ass.CreateInstance(className); IExecuteObject instance = obj as IExecuteObject; if (instance == null) { throw new DataObjectException("未能实例化数据库 ExecuteObject 对象!"); } instance.ExecuteType = type; if (!_executeList.ContainsKey(serverType)) { _executeList[serverType] = instance; } return(instance); }
/// <summary> /// 执行新增语句,并返回最新的自增ID值。 /// </summary> /// <param name="connKey">连接配置名称</param> /// <param name="type">执行类型</param> /// <param name="execute">执行对象</param> /// <param name="parms">参数</param> /// <returns></returns> public int ExecuteInsertIdentity(IExecuteObject execute, CommandType type = CommandType.Text, string connKey = null, params IDbDataParameter[] parms) { try { this.Open(connKey); this.Command.Transaction = this.Connection.BeginTransaction(); this.Command.CommandType = type; this.Command.CommandText = ProcessSqlString(execute.CreateInsertSQL()); JoinParameters(parms, true); this.Command.ExecuteNonQuery(); this.Command.CommandType = CommandType.Text; this.Command.CommandText = execute.CreateIdentitySQL(); object val = this.Command.ExecuteScalar(); int dataId = Convert.ToInt32(val); this.Command.Transaction.Commit(); return(dataId); } catch (Exception ex) { this.Command.Transaction.Rollback(); throw ShowError(ex, execute.ExecuteType + ":" + execute.GetExecuteSQL()); } }
/// <summary> /// 解析执行对象。 /// </summary> /// <param name="db">数据库对象</param> /// <param name="e">执行对象</param> /// <returns></returns> private static IDbDataParameter[] ResolveExecuteObject(IDbHelper db, IExecuteObject e) { var parms = new List <IDbDataParameter>(); db.Open(); if (db.Command != null) { for (int i = 0; i < e.Fields.Count; i++) { Field field = e.Fields[i]; //判断传入值不为null,否则会导致类型转换出错) if (field.Value != null) { //传入存储过程变量 IDbDataParameter parm = db.Command.CreateParameter(); parm.ParameterName = e.ParmToken + field.Key; parm.Value = field.Value; parms.Add(parm); } } } return(parms.ToArray()); }
/// <summary> /// 根据数据模型创建执行对象。 /// </summary> /// <param name="type">执行对象类型</param> /// <param name="model">数据模型</param> /// <returns></returns> public static IExecuteObject CreateExecuteObject(ExecuteType type, object model = null) { if (model == null) { return(CreateEmptyExecuteObject(type)); } PropertyInfo[] ps = model.GetType().GetProperties(); IExecuteObject e = CreateEmptyExecuteObject(type); if (e == null) { return(null); } e.ExecuteType = type; e.TableName = model.ToString(); int i = e.TableName.LastIndexOf('.'); if (i > -1) { e.TableName = e.TableName.Substring(i + 1, e.TableName.Length - i - 1); } //遍历实体类的所有 PropertyInfo foreach (var info in ps) { object val = info.GetValue(model, null); bool chk = true; //检测初始化值是否超出范围 if (info.PropertyType == typeof(DateTime)) { chk = (Convert.ToDateTime(val) >= new DateTime(1753, 1, 1, 12, 0, 0) && Convert.ToDateTime(val) <= new DateTime(9999, 12, 31, 11, 59, 59)); } if (chk) { //解析LinQ对象 //遍历 PropertyInfo 的所有 ColumnAttribute foreach (ColumnAttribute attr in info.GetCustomAttributes(typeof(ColumnAttribute), false)) { //是主键 if (attr.IsPrimaryKey) { e.PrimaryKey = info.Name; e.PrimaryValue = val; } //由数据库自动生成 if (attr.IsDbGenerated) { e.AutoColumns.Add(info.Name); } //可写 if (info.CanWrite) { if (val != null) { e.Add(info.Name, val); } } } } } return(e); }
/// <summary> /// 执行新增语句,并返回最新的自增ID值。 /// </summary> /// <param name="execute">执行对象</param> /// <param name="parms">参数</param> /// <returns></returns> public int ExecuteInsertIdentity(IExecuteObject execute, params IDbDataParameter[] parms) { return(ExecuteInsertIdentity(execute, CommandType.Text, null, parms)); }