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)); }
/// <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); } }
/// <summary> /// 执行与释放或重置托管资源相关的应用程序定义的任务。 /// </summary> protected override void DisposeManaged() { this._CommandText = null; if (this._Parameters != null) { this._Parameters.Clear(); } this._Parameters = null; }
/// <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); } }
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); }
/// <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)); }
///// <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)); }
/// <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)); }
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)); }
public SqlFormatter(ExecuteParameterCollection parameters, IDbEngineProvider engineProvider) { _parameters = parameters; _engineProvider = engineProvider; }
public SqlFormatProvider(ExecuteParameterCollection parameters, IDbEngineProvider engineProvider) { _formatter = new SqlFormatter(parameters, engineProvider); }
/// <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; }
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)); }
/// <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)); }