Exemplo n.º 1
0
        private ExecuteCommand CreateDeleteCommandWithEntity(IDbEngine engine, TypeMapper mapper, object entity, string tableName)
        {
            var parSettings  = engine.Owner.Injector.ParameterSettings;
            var whereBuilder = new StringBuilder();
            var ps           = new ExecuteParameterCollection(mapper.Count);

            int index = 0;

            foreach (var property in FindProperties(mapper, ref entity))
            {
                if (property.IsKey)
                {
                    if (whereBuilder.Length > 0)
                    {
                        whereBuilder.Append(" AND ");
                    }

                    if (index++ > 0)
                    {
                        whereBuilder.Append(',');
                    }
                    DefaultAppendField(property, whereBuilder, parSettings);
                    whereBuilder.Append('=');
                    var value = property.GetValue(entity);
                    DefaultAppendValue(property, whereBuilder, parSettings, value, ps);
                }
            }
            return(this.CreateDeleteCommand(mapper, whereBuilder, parSettings, ps, tableName));
        }
Exemplo n.º 2
0
 /// <summary>
 /// 将参数集合填充到 <see cref="System.Data.Common.DbCommand"/>。
 /// </summary>
 /// <param name="engine">数据源查询与交互引擎的实例。</param>
 /// <param name="command">命令对象。</param>
 /// <param name="parameters">参数集合。</param>
 protected virtual void FillParameters(IDbEngine engine, DbCommand command, ExecuteParameterCollection parameters)
 {
     foreach (var p in parameters)
     {
         command.Parameters.Add(p.CreateParameter(command));
     }
 }
 /// <summary>
 /// 指定原参数集合初始化一个 <see cref="Aoite.Data.ExecuteParameterCollection"/> 类的新实例。
 /// </summary>
 /// <param name="source">原参数集合。</param>
 public ExecuteParameterCollection(ExecuteParameterCollection source)
     : this(source == null ? 0 : source.Count)
 {
     foreach (var item in source)
     {
         this.Add(item);
     }
 }
Exemplo n.º 4
0
 /// <summary>
 /// 执行与释放或重置托管资源相关的应用程序定义的任务。
 /// </summary>
 protected override void DisposeManaged()
 {
     this._CommandText = null;
     if (this._Parameters != null)
     {
         this._Parameters.Clear();
     }
     this._Parameters = null;
 }
Exemplo n.º 5
0
 /// <summary>
 /// 将参数集合填充到 <see cref="DbCommand"/>。
 /// </summary>
 /// <param name="command">命令对象。</param>
 /// <param name="parameters">参数集合。</param>
 protected virtual void FillParameters(DbCommand command, ExecuteParameterCollection parameters)
 {
     foreach (var p in parameters)
     {
         var dbp = p.CreateParameter(command);
         dbp.ParameterName = this.Engine.Provider.SqlFactory.EscapeName(dbp.ParameterName, NamePoint.Parameter);
         command.Parameters.Add(dbp);
     }
 }
Exemplo n.º 6
0
        private void DefaultAppendValue(PropertyMapper property, StringBuilder builder, DefaultParameterSettings parameterSettings
                                        , object value
                                        , ExecuteParameterCollection ps)
        {
            var upperName = property.Name.ToUpper();

            builder.Append(parameterSettings.PrefixWithText)
            .Append(upperName);
            ps.Add(parameterSettings.PrefixWithCollection + upperName, value);
        }
Exemplo n.º 7
0
        /// <summary>
        /// 将一个复合格式字符串转换为 <see cref="ExecuteCommand"/> 的对象实例。
        /// </summary>
        /// <param name="fs">一个复合格式字符串</param>
        /// <returns><see cref="ExecuteCommand"/> 的对象实例。</returns>
        public ExecuteCommand Parse(FormattableString fs)
        {
            if (fs == null)
            {
                throw new ArgumentNullException(nameof(fs));
            }

            var parameters = new ExecuteParameterCollection();
            var sfp        = new SqlFormatProvider(parameters, this.Provider);
            var text       = fs.ToString(sfp);

            return(new ExecuteCommand(text, parameters));
        }
Exemplo n.º 8
0
        ///// <summary>
        ///// 将字符串隐式转换为 <see cref="Aoite.Data.ExecuteCommand"/> 类的新实例。
        ///// </summary>
        ///// <param name="commandText">Transact-SQL 语句。第一个字符为“>”时,表示一个存储过程。</param>
        //public static implicit operator ExecuteCommand(string commandText)
        //{
        //    return new ExecuteCommand(commandText);
        //}

        /// <summary>
        /// 创建作为当前实例副本的新对象。
        /// </summary>
        /// <returns>作为此实例副本的新对象。</returns>
        public object Clone()
        {
            ExecuteParameterCollection newParameters = null;

            if (this._Parameters != null)
            {
                newParameters = new ExecuteParameterCollection(this._Parameters.Count);
                foreach (var p in this._Parameters)
                {
                    newParameters.Add(p.Clone() as ExecuteParameter);
                }
            }
            return(new ExecuteCommand(this._CommandText, newParameters));
        }
Exemplo n.º 9
0
        /// <summary>
        /// 指定实体创建一个插入的命令。
        /// </summary>
        /// <param name="engine">数据源查询与交互引擎的实例。</param>
        /// <param name="mapper">类型映射器。</param>
        /// <param name="entity">实体的实例对象。</param>
        /// <param name="tableName">实体的实际表名称,可以为 null 值。</param>
        /// <returns>返回一个查询命令。</returns>
        public virtual ExecuteCommand CreateInsertCommand(IDbEngine engine, TypeMapper mapper, object entity, string tableName = null)
        {
            if (engine == null)
            {
                throw new ArgumentNullException("engine");
            }
            if (mapper == null)
            {
                throw new ArgumentNullException("mapper");
            }
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }
            if (mapper.Count == 0)
            {
                throw new NotSupportedException("{0} 的插入操作没有找到任何属性。".Fmt(entity.GetType().FullName));
            }

            var parameterSettings = this.ParameterSettings;
            var fieldsBuilder     = new StringBuilder("INSERT INTO ")
                                    .Append(parameterSettings.EscapeName(tableName ?? mapper.Name))
                                    .Append('(');
            var valueBuilder = new StringBuilder(")VALUES(");
            var ps           = new ExecuteParameterCollection(mapper.Count);
            int index        = 0;

            foreach (var property in FindProperties(mapper, ref entity))
            {
                if (property.IsIgnore)
                {
                    continue;
                }
                var value = property.GetValue(entity);
                if (property.IsKey && object.Equals(value, property.TypeDefaultValue))
                {
                    continue;
                }

                if (index++ > 0)
                {
                    fieldsBuilder.Append(',');
                    valueBuilder.Append(',');
                }
                DefaultAppendField(property, fieldsBuilder, parameterSettings);
                DefaultAppendValue(property, valueBuilder, parameterSettings, value, ps);
            }
            return(new ExecuteCommand(fieldsBuilder.Append(valueBuilder.Append(')').ToString()).ToString(), ps));
        }
Exemplo n.º 10
0
        private ExecuteCommand CreateDeleteCommandWithPK(IDbEngine engine, TypeMapper mapper, object value, string tableName)
        {
            var parSettings  = this.ParameterSettings;
            var whereBuilder = new StringBuilder();
            var ps           = new ExecuteParameterCollection(mapper.Count);

            foreach (var property in mapper.Properties)
            {
                if (property.IsKey)
                {
                    var arrayValue   = value as Array;
                    var isArrayValue = arrayValue != null;
                    int index        = 0;
                    var fName        = property.Name;
ARRAY_LABEL:
                    var pName = fName;
                    if (isArrayValue)
                    {
                        pName += index;
                    }

                    DefaultAppendField(property, whereBuilder, parSettings);
                    whereBuilder.Append('=');
                    whereBuilder
                    .Append(parSettings.PrefixWithText)
                    .Append(pName);
                    if (isArrayValue)
                    {
                        ps.Add(parSettings.PrefixWithCollection + pName, arrayValue.GetValue(index++));
                        if (index < arrayValue.Length)
                        {
                            whereBuilder.Append(" OR ");
                            goto ARRAY_LABEL;
                        }
                    }
                    else
                    {
                        ps.Add(parSettings.PrefixWithCollection + pName, value);
                    }
                    break;
                }
            }
            return(this.CreateDeleteCommand(mapper, whereBuilder, parSettings, ps, tableName));
        }
Exemplo n.º 11
0
 public SqlFormatter(ExecuteParameterCollection parameters, IDbEngineProvider engineProvider)
 {
     _parameters     = parameters;
     _engineProvider = engineProvider;
 }
Exemplo n.º 12
0
 public SqlFormatProvider(ExecuteParameterCollection parameters, IDbEngineProvider engineProvider)
 {
     _formatter = new SqlFormatter(parameters, engineProvider);
 }
Exemplo n.º 13
0
 /// <summary>
 /// 初始化一个 <see cref="Aoite.Data.ExecuteCommand"/> 类的新实例。
 /// </summary>
 /// <param name="commandText">Transact-SQL 语句。第一个字符为“>”时,表示一个存储过程。</param>
 /// <param name="parameters">参数集合。</param>
 public ExecuteCommand(string commandText, ExecuteParameterCollection parameters)
 {
     this._CommandText = commandText;
     this._Parameters  = parameters;
 }
Exemplo n.º 14
0
        private ExecuteCommand CreateDeleteCommand(TypeMapper mapper, StringBuilder whereBuilder, DefaultParameterSettings parSettings, ExecuteParameterCollection ps, string tableName)
        {
            if (whereBuilder.Length == 0)
            {
                throw new NotSupportedException("{0} 的删除操作没有找到主键。".Fmt(mapper.Type.FullName));
            }

            whereBuilder.Insert(0, " WHERE ");
            whereBuilder.Insert(0, parSettings.EscapeName(tableName ?? mapper.Name));
            whereBuilder.Insert(0, "DELETE ");
            return(new ExecuteCommand(whereBuilder.ToString(), ps));
        }
Exemplo n.º 15
0
        /// <summary>
        /// 指定实体创建一个更新的命令。
        /// </summary>
        /// <param name="engine">数据源查询与交互引擎的实例。</param>
        /// <param name="mapper">类型映射器。</param>
        /// <param name="entity">实体的实例对象。</param>
        /// <param name="tableName">实体的实际表名称,可以为 null 值。</param>
        /// <returns>返回一个查询命令。</returns>
        public virtual ExecuteCommand CreateUpdateCommand(IDbEngine engine, TypeMapper mapper, object entity, string tableName = null)
        {
            if (engine == null)
            {
                throw new ArgumentNullException("engine");
            }
            if (mapper == null)
            {
                throw new ArgumentNullException("mapper");
            }
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }

            var parameterSettings = this.ParameterSettings;
            var setBuilder        = new StringBuilder("UPDATE ")
                                    .Append(parameterSettings.EscapeName(tableName ?? mapper.Name))
                                    .Append(" SET ");
            var whereBuilder = new StringBuilder();
            var ps           = new ExecuteParameterCollection(mapper.Count);

            int index = 0;

            foreach (var property in FindProperties(mapper, ref entity))
            {
                if (property.IsIgnore)
                {
                    continue;
                }

                StringBuilder builder;
                if (property.IsKey)
                {
                    builder = whereBuilder;
                    if (builder.Length > 0)
                    {
                        builder.Append(" AND ");
                    }
                }
                else
                {
                    builder = setBuilder;
                    if (index++ > 0)
                    {
                        builder.Append(',');
                    }
                }

                DefaultAppendField(property, builder, parameterSettings);
                builder.Append('=');
                var value = property.GetValue(entity);
                DefaultAppendValue(property, builder, parameterSettings, value, ps);
            }

            if (whereBuilder.Length == 0)
            {
                throw new NotSupportedException("{0} 的更新操作没有找到主键。".Fmt(entity.GetType().FullName));
            }
            setBuilder.Append(" WHERE ").Append(whereBuilder.ToString());
            return(new ExecuteCommand(setBuilder.ToString(), ps));
        }