Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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());
            }
        }
Exemplo n.º 3
0
        /// <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());
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
 /// <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));
 }