using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace SqlSugar { /// /// ** description:ActiveX Data Objects /// ** author:sunkaixuan /// ** date:2017/1/2 /// ** email:610262374@qq.com /// public abstract partial class AdoProvider : AdoAccessory, IAdo { #region Constructor public AdoProvider() { this.IsEnableLogEvent = false; this.CommandType = CommandType.Text; this.IsClearParameters = true; this.CommandTimeOut = 300; } #endregion #region Properties internal bool IsOpenAsync { get; set; } protected List OutputParameters { get; set; } public virtual string SqlParameterKeyWord { get { return "@"; } } public IDbTransaction Transaction { get; set; } public virtual SqlSugarProvider Context { get; set; } internal CommandType OldCommandType { get; set; } internal bool OldClearParameters { get; set; } public IDataParameterCollection DataReaderParameters { get; set; } public TimeSpan SqlExecutionTime { get { return AfterTime - BeforeTime; } } public TimeSpan ConnectionExecutionTime { get { return CheckConnectionAfterTime - CheckConnectionBeforeTime; } } public TimeSpan GetDataExecutionTime { get { return GetDataAfterTime - GetDataBeforeTime; } } /// /// Add, delete and modify: the number of affected items; /// public int SqlExecuteCount { get; private set; } = 0; public StackTraceInfo SqlStackTrace { get { return UtilMethods.GetStackTrace(); } } public bool IsDisableMasterSlaveSeparation { get; set; } internal DateTime BeforeTime = DateTime.MinValue; internal DateTime AfterTime = DateTime.MinValue; internal DateTime GetDataBeforeTime = DateTime.MinValue; internal DateTime GetDataAfterTime = DateTime.MinValue; internal DateTime CheckConnectionBeforeTime = DateTime.MinValue; internal DateTime CheckConnectionAfterTime = DateTime.MinValue; public virtual IDbBind DbBind { get { if (base._DbBind == null) { IDbBind bind = InstanceFactory.GetDbBind(this.Context.CurrentConnectionConfig); base._DbBind = bind; bind.Context = this.Context; } return base._DbBind; } } public virtual int CommandTimeOut { get; set; } public virtual CommandType CommandType { get; set; } public virtual bool IsEnableLogEvent { get; set; } public virtual bool IsClearParameters { get; set; } public virtual Action LogEventStarting => this.Context.CurrentConnectionConfig.AopEvents?.OnLogExecuting; public virtual Action LogEventCompleted => this.Context.CurrentConnectionConfig.AopEvents?.OnLogExecuted; public virtual Action CheckConnectionExecuting => this.Context.CurrentConnectionConfig.AopEvents?.CheckConnectionExecuting; public virtual Action CheckConnectionExecuted => this.Context.CurrentConnectionConfig.AopEvents?.CheckConnectionExecuted; public virtual Action OnGetDataReadering => this.Context.CurrentConnectionConfig.AopEvents?.OnGetDataReadering; public virtual Action OnGetDataReadered => this.Context.CurrentConnectionConfig.AopEvents?.OnGetDataReadered; public virtual Func> ProcessingEventStartingSQL => this.Context.CurrentConnectionConfig.AopEvents?.OnExecutingChangeSql; protected virtual Func FormatSql { get; set; } public virtual Action ErrorEvent => this.Context.CurrentConnectionConfig.AopEvents?.OnError; public virtual Action DiffLogEvent => this.Context.CurrentConnectionConfig.AopEvents?.OnDiffLogEvent; public virtual List SlaveConnections { get; set; } public virtual IDbConnection MasterConnection { get; set; } public virtual string MasterConnectionString { get; set; } public virtual CancellationToken? CancellationToken { get; set; } #endregion #region Connection public virtual bool IsValidConnection() { try { if (this.IsAnyTran()) { return true; } using (OpenAlways()) { return true; } } catch (Exception) { return false; } } public virtual bool IsValidConnectionNoClose() { try { this.Open(); return true; } catch (Exception) { return false; } } public virtual void Open() { CheckConnection(); } public virtual async Task OpenAsync() { await CheckConnectionAsync(); } public SugarConnection OpenAlways() { SugarConnection result = new SugarConnection(); result.IsAutoClose = this.Context.CurrentConnectionConfig.IsAutoCloseConnection; result.conn = this.Connection; result.Context = this.Context; this.Context.CurrentConnectionConfig.IsAutoCloseConnection = false; this.Open(); return result; } public virtual void Close() { if (this.Transaction != null) { this.Transaction = null; } if (this.Connection != null && this.Connection.State == ConnectionState.Open) { this.Connection.Close(); } if (this.IsMasterSlaveSeparation && this.SlaveConnections.HasValue()) { foreach (var slaveConnection in this.SlaveConnections) { if (slaveConnection != null && slaveConnection.State == ConnectionState.Open) { slaveConnection.Close(); } } } } public virtual void Dispose() { if (this.Transaction != null) { this.Transaction.Rollback(); this.Transaction = null; } //if (this.Connection != null && this.Connection.State != ConnectionState.Open) //{ // this.Connection.Close(); //} if (this.Connection != null) { this.Connection.Dispose(); } this.Connection = null; if (this.IsMasterSlaveSeparation) { if (this.SlaveConnections != null) { foreach (var slaveConnection in this.SlaveConnections) { if (slaveConnection != null && slaveConnection.State == ConnectionState.Open) { slaveConnection.Dispose(); } } } } } public virtual void CheckConnection() { this.CheckConnectionBefore(this.Connection); if (this.Connection.State != ConnectionState.Open) { try { this.Connection.Open(); } catch (Exception ex) { if (this.Context.CurrentConnectionConfig?.DbType==DbType.SqlServer&&ex.Message?.Contains("provider: SSL")==true) { Check.ExceptionEasy(true,ex.Message, "SSL出错,因为升级了驱动,字符串增加Encrypt=True;TrustServerCertificate=True;即可。详细错误:" + ex.Message); } Check.Exception(true, ErrorMessage.ConnnectionOpen, ex.Message+$"DbType=\"{this.Context.CurrentConnectionConfig.DbType}\";ConfigId=\"{this.Context.CurrentConnectionConfig.ConfigId}\""); } } this.CheckConnectionAfter(this.Connection); } public virtual async Task CheckConnectionAsync() { this.CheckConnectionBefore(this.Connection); if (this.Connection.State != ConnectionState.Open) { try { await (this.Connection as DbConnection).OpenAsync(); } catch (Exception ex) { Check.Exception(true, ErrorMessage.ConnnectionOpen, ex.Message + $"DbType=\"{this.Context.CurrentConnectionConfig.DbType}\";ConfigId=\"{this.Context.CurrentConnectionConfig.ConfigId}\""); } } this.CheckConnectionAfter(this.Connection); } public virtual void CheckConnectionBefore(IDbConnection Connection) { this.CheckConnectionBeforeTime = DateTime.Now; if (this.IsEnableLogEvent) { Action action = CheckConnectionExecuting; if (action != null) { action(Connection); } } } public virtual void CheckConnectionAfter(IDbConnection Connection) { this.CheckConnectionAfterTime = DateTime.Now; if (this.IsEnableLogEvent) { Action action = CheckConnectionExecuted; if (action != null) { action(Connection,this.ConnectionExecutionTime); } } } #endregion #region Transaction public virtual bool IsAnyTran() { return this.Transaction != null; } public virtual bool IsNoTran() { return this.Transaction == null; } public virtual void BeginTran() { CheckConnection(); if (this.Transaction == null) this.Transaction = this.Connection.BeginTransaction(); } public virtual async Task BeginTranAsync() { await CheckConnectionAsync(); if (this.Transaction == null) this.Transaction =await (this.Connection as DbConnection).BeginTransactionAsync(); } public virtual void BeginTran(IsolationLevel iso) { CheckConnection(); if (this.Transaction == null) this.Transaction = this.Connection.BeginTransaction(iso); } public virtual async Task BeginTranAsync(IsolationLevel iso) { await CheckConnectionAsync(); if (this.Transaction == null) this.Transaction =await (this.Connection as DbConnection).BeginTransactionAsync(iso); } public virtual void RollbackTran() { if (this.Transaction != null) { this.Transaction.Rollback(); this.Transaction = null; if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection) this.Close(); } } public virtual async Task RollbackTranAsync() { if (this.Transaction != null) { await (this.Transaction as DbTransaction).RollbackAsync(); this.Transaction = null; if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection) await this.CloseAsync(); } } public virtual void CommitTran() { if (this.Transaction != null) { this.Transaction.Commit(); this.Transaction = null; if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection) this.Close(); } } public virtual async Task CommitTranAsync() { if (this.Transaction != null) { await (this.Transaction as DbTransaction).CommitAsync(); this.Transaction = null; if (this.Context.CurrentConnectionConfig.IsAutoCloseConnection) await this.CloseAsync(); } } #endregion #region abstract public abstract IDataParameter[] ToIDbDataParameter(params SugarParameter[] pars); public abstract void SetCommandToAdapter(IDataAdapter adapter, DbCommand command); public abstract IDataAdapter GetAdapter(); public abstract DbCommand GetCommand(string sql, SugarParameter[] pars); public abstract IDbConnection Connection { get; set; } public abstract void BeginTran(string transactionName);//Only SqlServer public abstract void BeginTran(IsolationLevel iso, string transactionName);//Only SqlServer #endregion #region Use public SqlSugarTransactionAdo UseTran() { return new SqlSugarTransactionAdo(this.Context); } public DbResult UseTran(Action action, Action errorCallBack = null) { var result = new DbResult(); try { this.BeginTran(); if (action != null) action(); this.CommitTran(); result.Data = result.IsSuccess = true; } catch (Exception ex) { result.ErrorException = ex; result.ErrorMessage = ex.Message; result.IsSuccess = false; this.RollbackTran(); if (errorCallBack != null) { errorCallBack(ex); } } return result; } public async Task> UseTranAsync(Func action, Action errorCallBack = null) { var result = new DbResult(); try { await this.BeginTranAsync(); if (action != null) await action(); await this.CommitTranAsync(); result.Data = result.IsSuccess = true; } catch (Exception ex) { result.ErrorException = ex; result.ErrorMessage = ex.Message; result.IsSuccess = false; await this.RollbackTranAsync(); if (errorCallBack != null) { errorCallBack(ex); } } return result; } public DbResult UseTran(Func action, Action errorCallBack = null) { var result = new DbResult(); try { this.BeginTran(); if (action != null) result.Data = action(); this.CommitTran(); result.IsSuccess = true; } catch (Exception ex) { result.ErrorException = ex; result.ErrorMessage = ex.Message; result.IsSuccess = false; this.RollbackTran(); if (errorCallBack != null) { errorCallBack(ex); } } return result; } public async Task> UseTranAsync(Func> action, Action errorCallBack = null) { var result = new DbResult(); try { this.BeginTran(); if (action != null) result.Data = await action(); this.CommitTran(); result.IsSuccess = true; } catch (Exception ex) { result.ErrorException = ex; result.ErrorMessage = ex.Message; result.IsSuccess = false; this.RollbackTran(); if (errorCallBack != null) { errorCallBack(ex); } } return result; } public IAdo UseStoredProcedure() { this.OldCommandType = this.CommandType; this.OldClearParameters = this.IsClearParameters; this.CommandType = CommandType.StoredProcedure; this.IsClearParameters = false; return this; } #endregion #region Core public virtual int ExecuteCommandWithGo(string sql, params SugarParameter[] parameters) { if (string.IsNullOrEmpty(sql)) return 0; if (!sql.ToLower().Contains("go")) { return ExecuteCommand(sql); } System.Collections.ArrayList al = new System.Collections.ArrayList(); System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"^(\s*)go(\s*)$", System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Multiline | System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.ExplicitCapture); al.AddRange(reg.Split(sql)); int count = 0; foreach (string item in al) { if (item.HasValue()) { count += ExecuteCommand(item, parameters); } } return count; } public virtual int ExecuteCommand(string sql, params SugarParameter[] parameters) { try { InitParameters(ref sql, parameters); if (IsFormat(parameters)) sql = FormatSql(sql); if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true) return this.Context.CurrentConnectionConfig.SqlMiddle.ExecuteCommand(sql, parameters); SetConnectionStart(sql); if (this.ProcessingEventStartingSQL != null) ExecuteProcessingSQL(ref sql, ref parameters); ExecuteBefore(sql, parameters); IDbCommand sqlCommand = GetCommand(sql, parameters); int count = sqlCommand.ExecuteNonQuery(); if (this.IsClearParameters) sqlCommand.Parameters.Clear(); // 影响条数 this.SqlExecuteCount = count; ExecuteAfter(sql, parameters); sqlCommand.Dispose(); return count; } catch (Exception ex) { SugarCatch(ex, sql,parameters); CommandType = CommandType.Text; if (ErrorEvent != null) ExecuteErrorEvent(sql, parameters, ex); throw ex; } finally { if (this.IsAutoClose()) this.Close(); SetConnectionEnd(sql); } } public virtual IDataReader GetDataReader(string sql, params SugarParameter[] parameters) { try { InitParameters(ref sql, parameters); if (IsFormat(parameters)) sql = FormatSql(sql); if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true) return this.Context.CurrentConnectionConfig.SqlMiddle.GetDataReader(sql, parameters); SetConnectionStart(sql); var isSp = this.CommandType == CommandType.StoredProcedure; if (this.ProcessingEventStartingSQL != null) ExecuteProcessingSQL(ref sql,ref parameters); ExecuteBefore(sql, parameters); IDbCommand sqlCommand = GetCommand(sql, parameters); IDataReader sqlDataReader = sqlCommand.ExecuteReader(this.IsAutoClose() ? CommandBehavior.CloseConnection : CommandBehavior.Default); if (isSp) DataReaderParameters = sqlCommand.Parameters; if (this.IsClearParameters) sqlCommand.Parameters.Clear(); ExecuteAfter(sql, parameters); SetConnectionEnd(sql); if (SugarCompatible.IsFramework || this.Context.CurrentConnectionConfig.DbType != DbType.Sqlite) sqlCommand.Dispose(); return sqlDataReader; } catch (Exception ex) { SugarCatch(ex, sql, parameters); CommandType = CommandType.Text; if (ErrorEvent != null) ExecuteErrorEvent(sql, parameters, ex); throw; } } public virtual DataSet GetDataSetAll(string sql, params SugarParameter[] parameters) { try { InitParameters(ref sql, parameters); if (IsFormat(parameters)) sql = FormatSql(sql); if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true) return this.Context.CurrentConnectionConfig.SqlMiddle.GetDataSetAll(sql, parameters); SetConnectionStart(sql); if (this.ProcessingEventStartingSQL != null) ExecuteProcessingSQL(ref sql,ref parameters); ExecuteBefore(sql, parameters); IDataAdapter dataAdapter = this.GetAdapter(); DbCommand sqlCommand = GetCommand(sql, parameters); this.SetCommandToAdapter(dataAdapter, sqlCommand); DataSet ds = new DataSet(); dataAdapter.Fill(ds); if (this.IsClearParameters) sqlCommand.Parameters.Clear(); ExecuteAfter(sql, parameters); sqlCommand.Dispose(); return ds; } catch (Exception ex) { SugarCatch(ex, sql, parameters); CommandType = CommandType.Text; if (ErrorEvent != null) ExecuteErrorEvent(sql, parameters, ex); throw; } finally { if (this.IsAutoClose()) this.Close(); SetConnectionEnd(sql); } } public virtual object GetScalar(string sql, params SugarParameter[] parameters) { try { InitParameters(ref sql, parameters); if (IsFormat(parameters)) sql = FormatSql(sql); if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true) return this.Context.CurrentConnectionConfig.SqlMiddle.GetScalar(sql, parameters); SetConnectionStart(sql); if (this.ProcessingEventStartingSQL != null) ExecuteProcessingSQL(ref sql,ref parameters); ExecuteBefore(sql, parameters); IDbCommand sqlCommand = GetCommand(sql, parameters); object scalar = sqlCommand.ExecuteScalar(); //scalar = (scalar == null ? 0 : scalar); if (this.IsClearParameters) sqlCommand.Parameters.Clear(); ExecuteAfter(sql, parameters); sqlCommand.Dispose(); return scalar; } catch (Exception ex) { SugarCatch(ex, sql, parameters); CommandType = CommandType.Text; if (ErrorEvent != null) ExecuteErrorEvent(sql, parameters, ex); throw; } finally { if (this.IsAutoClose()) this.Close(); SetConnectionEnd(sql); } } public virtual async Task ExecuteCommandAsync(string sql, params SugarParameter[] parameters) { try { Async(); InitParameters(ref sql, parameters); if (IsFormat(parameters)) sql = FormatSql(sql); if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true) return await this.Context.CurrentConnectionConfig.SqlMiddle.ExecuteCommandAsync(sql, parameters); SetConnectionStart(sql); if (this.ProcessingEventStartingSQL != null) ExecuteProcessingSQL(ref sql,ref parameters); ExecuteBefore(sql, parameters); var sqlCommand =IsOpenAsync? await GetCommandAsync(sql, parameters) : GetCommand(sql, parameters); int count; if (this.CancellationToken == null) count=await sqlCommand.ExecuteNonQueryAsync(); else count=await sqlCommand.ExecuteNonQueryAsync(this.CancellationToken.Value); if (this.IsClearParameters) sqlCommand.Parameters.Clear(); this.SqlExecuteCount = count; ExecuteAfter(sql, parameters); sqlCommand.Dispose(); return count; } catch (Exception ex) { SugarCatch(ex, sql, parameters); CommandType = CommandType.Text; if (ErrorEvent != null) ExecuteErrorEvent(sql, parameters, ex); throw; } finally { if (this.IsAutoClose()) this.Close(); SetConnectionEnd(sql); } } public virtual async Task GetDataReaderAsync(string sql, params SugarParameter[] parameters) { try { Async(); InitParameters(ref sql, parameters); if (IsFormat(parameters)) sql = FormatSql(sql); if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true) return await this.Context.CurrentConnectionConfig.SqlMiddle.GetDataReaderAsync(sql, parameters); SetConnectionStart(sql); var isSp = this.CommandType == CommandType.StoredProcedure; if (this.ProcessingEventStartingSQL != null) ExecuteProcessingSQL(ref sql,ref parameters); ExecuteBefore(sql, parameters); var sqlCommand = IsOpenAsync ? await GetCommandAsync(sql, parameters) : GetCommand(sql, parameters); DbDataReader sqlDataReader; if(this.CancellationToken==null) sqlDataReader=await sqlCommand.ExecuteReaderAsync(this.IsAutoClose() ? CommandBehavior.CloseConnection : CommandBehavior.Default); else sqlDataReader=await sqlCommand.ExecuteReaderAsync(this.IsAutoClose() ? CommandBehavior.CloseConnection : CommandBehavior.Default,this.CancellationToken.Value); if (isSp) DataReaderParameters = sqlCommand.Parameters; if (this.IsClearParameters) sqlCommand.Parameters.Clear(); ExecuteAfter(sql, parameters); SetConnectionEnd(sql); if (SugarCompatible.IsFramework || this.Context.CurrentConnectionConfig.DbType != DbType.Sqlite) sqlCommand.Dispose(); return sqlDataReader; } catch (Exception ex) { SugarCatch(ex, sql, parameters); CommandType = CommandType.Text; if (ErrorEvent != null) ExecuteErrorEvent(sql, parameters, ex); throw; } } public virtual async Task GetScalarAsync(string sql, params SugarParameter[] parameters) { try { Async(); InitParameters(ref sql, parameters); if (IsFormat(parameters)) sql = FormatSql(sql); if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true) return await this.Context.CurrentConnectionConfig.SqlMiddle.GetScalarAsync(sql, parameters); SetConnectionStart(sql); if (this.ProcessingEventStartingSQL != null) ExecuteProcessingSQL(ref sql,ref parameters); ExecuteBefore(sql, parameters); var sqlCommand = IsOpenAsync ? await GetCommandAsync(sql, parameters) : GetCommand(sql, parameters); object scalar; if(CancellationToken==null) scalar=await sqlCommand.ExecuteScalarAsync(); else scalar = await sqlCommand.ExecuteScalarAsync(this.CancellationToken.Value); //scalar = (scalar == null ? 0 : scalar); if (this.IsClearParameters) sqlCommand.Parameters.Clear(); ExecuteAfter(sql, parameters); sqlCommand.Dispose(); return scalar; } catch (Exception ex) { SugarCatch(ex, sql, parameters); CommandType = CommandType.Text; if (ErrorEvent != null) ExecuteErrorEvent(sql, parameters, ex); throw; } finally { if (this.IsAutoClose()) this.Close(); SetConnectionEnd(sql); } } public virtual Task GetDataSetAllAsync(string sql, params SugarParameter[] parameters) { Async(); //False asynchrony . No Support DataSet if (CancellationToken == null) { return Task.Run(() => { return GetDataSetAll(sql, parameters); }); } else { return Task.Run(() => { return GetDataSetAll(sql, parameters); },this.CancellationToken.Value); } } #endregion #region Methods public virtual string GetString(string sql, object parameters) { return GetString(sql, this.GetParameters(parameters)); } public virtual string GetString(string sql, params SugarParameter[] parameters) { return Convert.ToString(GetScalar(sql, parameters)); } public virtual string GetString(string sql, List parameters) { if (parameters == null) { return GetString(sql); } else { return GetString(sql, parameters.ToArray()); } } public virtual Task GetStringAsync(string sql, object parameters) { return GetStringAsync(sql, this.GetParameters(parameters)); } public virtual async Task GetStringAsync(string sql, params SugarParameter[] parameters) { return Convert.ToString(await GetScalarAsync(sql, parameters)); } public virtual Task GetStringAsync(string sql, List parameters) { if (parameters == null) { return GetStringAsync(sql); } else { return GetStringAsync(sql, parameters.ToArray()); } } public virtual long GetLong(string sql, object parameters = null) { return Convert.ToInt64(GetScalar(sql, GetParameters(parameters))); } public virtual async Task GetLongAsync(string sql, object parameters = null) { return Convert.ToInt64(await GetScalarAsync(sql, GetParameters(parameters))); } public virtual int GetInt(string sql, object parameters) { return GetInt(sql, this.GetParameters(parameters)); } public virtual int GetInt(string sql, List parameters) { if (parameters == null) { return GetInt(sql); } else { return GetInt(sql, parameters.ToArray()); } } public virtual int GetInt(string sql, params SugarParameter[] parameters) { return GetScalar(sql, parameters).ObjToInt(); } public virtual Task GetIntAsync(string sql, object parameters) { return GetIntAsync(sql, this.GetParameters(parameters)); } public virtual Task GetIntAsync(string sql, List parameters) { if (parameters == null) { return GetIntAsync(sql); } else { return GetIntAsync(sql, parameters.ToArray()); } } public virtual async Task GetIntAsync(string sql, params SugarParameter[] parameters) { var list = await GetScalarAsync(sql, parameters); return list.ObjToInt(); } public virtual Double GetDouble(string sql, object parameters) { return GetDouble(sql, this.GetParameters(parameters)); } public virtual Double GetDouble(string sql, params SugarParameter[] parameters) { return GetScalar(sql, parameters).ObjToMoney(); } public virtual Double GetDouble(string sql, List parameters) { if (parameters == null) { return GetDouble(sql); } else { return GetDouble(sql, parameters.ToArray()); } } public virtual Task GetDoubleAsync(string sql, object parameters) { return GetDoubleAsync(sql, this.GetParameters(parameters)); } public virtual async Task GetDoubleAsync(string sql, params SugarParameter[] parameters) { var result = await GetScalarAsync(sql, parameters); return result.ObjToMoney(); } public virtual Task GetDoubleAsync(string sql, List parameters) { if (parameters == null) { return GetDoubleAsync(sql); } else { return GetDoubleAsync(sql, parameters.ToArray()); } } public virtual decimal GetDecimal(string sql, object parameters) { return GetDecimal(sql, this.GetParameters(parameters)); } public virtual decimal GetDecimal(string sql, params SugarParameter[] parameters) { return GetScalar(sql, parameters).ObjToDecimal(); } public virtual decimal GetDecimal(string sql, List parameters) { if (parameters == null) { return GetDecimal(sql); } else { return GetDecimal(sql, parameters.ToArray()); } } public virtual Task GetDecimalAsync(string sql, object parameters) { return GetDecimalAsync(sql, this.GetParameters(parameters)); } public virtual async Task GetDecimalAsync(string sql, params SugarParameter[] parameters) { var result = await GetScalarAsync(sql, parameters); return result.ObjToDecimal(); } public virtual Task GetDecimalAsync(string sql, List parameters) { if (parameters == null) { return GetDecimalAsync(sql); } else { return GetDecimalAsync(sql, parameters.ToArray()); } } public virtual DateTime GetDateTime(string sql, object parameters) { return GetDateTime(sql, this.GetParameters(parameters)); } public virtual DateTime GetDateTime(string sql, params SugarParameter[] parameters) { return GetScalar(sql, parameters).ObjToDate(); } public virtual DateTime GetDateTime(string sql, List parameters) { if (parameters == null) { return GetDateTime(sql); } else { return GetDateTime(sql, parameters.ToArray()); } } public virtual Task GetDateTimeAsync(string sql, object parameters) { return GetDateTimeAsync(sql, this.GetParameters(parameters)); } public virtual async Task GetDateTimeAsync(string sql, params SugarParameter[] parameters) { var list = await GetScalarAsync(sql, parameters); return list.ObjToDate(); } public virtual Task GetDateTimeAsync(string sql, List parameters) { if (parameters == null) { return GetDateTimeAsync(sql); } else { return GetDateTimeAsync(sql, parameters.ToArray()); } } public virtual List SqlQuery(string sql, object parameters = null) { var sugarParameters = this.GetParameters(parameters); return SqlQuery(sql, sugarParameters); } public virtual List SqlQuery(string sql, params SugarParameter[] parameters) { var result = SqlQuery(sql, parameters); return result.Item1; } public List MasterSqlQuery(string sql, object parameters = null) { var oldValue = this.Context.Ado.IsDisableMasterSlaveSeparation; this.Context.Ado.IsDisableMasterSlaveSeparation = true; var result = this.Context.Ado.SqlQuery(sql, parameters); this.Context.Ado.IsDisableMasterSlaveSeparation = oldValue; return result; } public async Task> MasterSqlQueryAasync(string sql, object parameters = null) { var oldValue = this.Context.Ado.IsDisableMasterSlaveSeparation; this.Context.Ado.IsDisableMasterSlaveSeparation = true; var result = await this.Context.Ado.SqlQueryAsync(sql, parameters); this.Context.Ado.IsDisableMasterSlaveSeparation = oldValue; return result; } public virtual List SqlQuery(string sql, List parameters) { if (parameters != null) { return SqlQuery(sql, parameters.ToArray()); } else { return SqlQuery(sql); } } public Tuple, List> SqlQuery(string sql, object parameters = null) { var result = SqlQuery(sql, parameters); return new Tuple, List>(result.Item1, result.Item2); } public Tuple, List, List> SqlQuery(string sql, object parameters = null) { var result = SqlQuery(sql, parameters); return new Tuple, List, List>(result.Item1, result.Item2, result.Item3); } public Tuple, List, List, List> SqlQuery(string sql, object parameters = null) { var result = SqlQuery(sql, parameters); return new Tuple, List, List, List>(result.Item1, result.Item2, result.Item3, result.Item4); } public Tuple, List, List, List, List> SqlQuery(string sql, object parameters = null) { var result = SqlQuery(sql, parameters); return new Tuple, List, List, List, List>(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5); } public Tuple, List, List, List, List, List> SqlQuery(string sql, object parameters = null) { var result = SqlQuery(sql, parameters); return new Tuple, List, List, List, List, List>(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5, result.Item6); } public Tuple, List, List, List, List, List, List> SqlQuery(string sql, object parameters = null) { var parsmeterArray = this.GetParameters(parameters); this.Context.InitMappingInfo(); var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); builder.SqlQueryBuilder.sql.Append(sql); if (parsmeterArray != null && parsmeterArray.Any()) builder.SqlQueryBuilder.Parameters.AddRange(parsmeterArray); string sqlString = builder.SqlQueryBuilder.ToSqlString(); SugarParameter[] Parameters = builder.SqlQueryBuilder.Parameters.ToArray(); this.GetDataBefore(sqlString, Parameters); using (var dataReader = this.GetDataReader(sqlString, Parameters)) { DbDataReader DbReader = (DbDataReader)dataReader; List result = new List(); if (DbReader.HasRows) { result = GetData(typeof(T), dataReader); } else { dataReader.Read(); } List result2 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result2 = GetData(typeof(T2), dataReader); } List result3 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result3 = GetData(typeof(T3), dataReader); } List result4 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result4 = GetData(typeof(T4), dataReader); } List result5 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result5 = GetData(typeof(T5), dataReader); } List result6 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result6 = GetData(typeof(T6), dataReader); } List result7 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result7 = GetData(typeof(T7), dataReader); } builder.SqlQueryBuilder.Clear(); if (this.Context.Ado.DataReaderParameters != null) { foreach (IDataParameter item in this.Context.Ado.DataReaderParameters) { var parameter = parsmeterArray.FirstOrDefault(it => item.ParameterName.Substring(1) == it.ParameterName.Substring(1)); if (parameter != null) { parameter.Value = item.Value; } } this.Context.Ado.DataReaderParameters = null; } this.GetDataAfter(sqlString, Parameters); return Tuple.Create, List, List, List, List, List, List>(result, result2, result3, result4, result5, result6, result7); } } public Task> SqlQueryAsync(string sql, object parameters, CancellationToken token) { this.CancellationToken = token; return SqlQueryAsync(sql, parameters); } public virtual Task> SqlQueryAsync(string sql, object parameters = null) { var sugarParameters = this.GetParameters(parameters); return SqlQueryAsync(sql, sugarParameters); } public virtual async Task> SqlQueryAsync(string sql, params SugarParameter[] parameters) { var result = await SqlQueryAsync(sql, parameters); return result.Item1; } public virtual Task> SqlQueryAsync(string sql, List parameters) { if (parameters != null) { return SqlQueryAsync(sql, parameters.ToArray()); } else { return SqlQueryAsync(sql); } } public async Task, List>> SqlQueryAsync(string sql, object parameters = null) { var result = await SqlQueryAsync(sql, parameters); return new Tuple, List>(result.Item1, result.Item2); } public async Task, List, List>> SqlQueryAsync(string sql, object parameters = null) { var result = await SqlQueryAsync(sql, parameters); return new Tuple, List, List>(result.Item1, result.Item2, result.Item3); } public async Task, List, List, List>> SqlQueryAsync(string sql, object parameters = null) { var result = await SqlQueryAsync(sql, parameters); return new Tuple, List, List, List>(result.Item1, result.Item2, result.Item3, result.Item4); } public async Task, List, List, List, List>> SqlQueryAsync(string sql, object parameters = null) { var result = await SqlQueryAsync(sql, parameters); return new Tuple, List, List, List, List>(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5); } public async Task, List, List, List, List, List>> SqlQueryAsync(string sql, object parameters = null) { var result =await SqlQueryAsync(sql, parameters); return new Tuple, List, List, List, List, List>(result.Item1, result.Item2, result.Item3, result.Item4, result.Item5, result.Item6); } public async Task, List, List, List, List, List, List>> SqlQueryAsync(string sql, object parameters = null) { var parsmeterArray = this.GetParameters(parameters); this.Context.InitMappingInfo(); var builder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); builder.SqlQueryBuilder.sql.Append(sql); if (parsmeterArray != null && parsmeterArray.Any()) builder.SqlQueryBuilder.Parameters.AddRange(parsmeterArray); string sqlString = builder.SqlQueryBuilder.ToSqlString(); SugarParameter[] Parameters = builder.SqlQueryBuilder.Parameters.ToArray(); this.GetDataBefore(sqlString, Parameters); using (var dataReader = await this.GetDataReaderAsync(sqlString, Parameters)) { DbDataReader DbReader = (DbDataReader)dataReader; List result = new List(); if (DbReader.HasRows) { result =await GetDataAsync(typeof(T), dataReader); } List result2 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result2 = await GetDataAsync(typeof(T2), dataReader); } List result3 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result3 = await GetDataAsync(typeof(T3), dataReader); } List result4 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result4 = await GetDataAsync(typeof(T4), dataReader); } List result5 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result5 = await GetDataAsync(typeof(T5), dataReader); } List result6 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result6 = await GetDataAsync(typeof(T6), dataReader); } List result7 = null; if (NextResult(dataReader)) { this.Context.InitMappingInfo(); result7 = await GetDataAsync(typeof(T7), dataReader); } builder.SqlQueryBuilder.Clear(); if (this.Context.Ado.DataReaderParameters != null) { foreach (IDataParameter item in this.Context.Ado.DataReaderParameters) { var parameter = parsmeterArray.FirstOrDefault(it => item.ParameterName.Substring(1) == it.ParameterName.Substring(1)); if (parameter != null) { parameter.Value = item.Value; } } this.Context.Ado.DataReaderParameters = null; } this.GetDataAfter(sqlString, Parameters); return Tuple.Create, List, List, List, List, List, List>(result, result2, result3, result4, result5, result6, result7); } } public virtual T SqlQuerySingle(string sql, object parameters = null) { var result = SqlQuery(sql, parameters); return result == null ? default(T) : result.FirstOrDefault(); } public virtual T SqlQuerySingle(string sql, params SugarParameter[] parameters) { var result = SqlQuery(sql, parameters); return result == null ? default(T) : result.FirstOrDefault(); } public virtual T SqlQuerySingle(string sql, List parameters) { var result = SqlQuery(sql, parameters); return result == null ? default(T) : result.FirstOrDefault(); } public virtual async Task SqlQuerySingleAsync(string sql, object parameters = null) { var result = await SqlQueryAsync(sql, parameters); return result == null ? default(T) : result.FirstOrDefault(); } public virtual async Task SqlQuerySingleAsync(string sql, params SugarParameter[] parameters) { var result = await SqlQueryAsync(sql, parameters); return result == null ? default(T) : result.FirstOrDefault(); } public virtual async Task SqlQuerySingleAsync(string sql, List parameters) { var result = await SqlQueryAsync(sql, parameters); return result == null ? default(T) : result.FirstOrDefault(); } public virtual DataTable GetDataTable(string sql, params SugarParameter[] parameters) { var ds = GetDataSetAll(sql, parameters); if (ds.Tables.Count != 0 && ds.Tables.Count > 0) return ds.Tables[0]; return new DataTable(); } public virtual DataTable GetDataTable(string sql, object parameters) { return GetDataTable(sql, this.GetParameters(parameters)); } public virtual DataTable GetDataTable(string sql, List parameters) { if (parameters == null) { return GetDataTable(sql); } else { return GetDataTable(sql, parameters.ToArray()); } } public virtual async Task GetDataTableAsync(string sql, params SugarParameter[] parameters) { var ds = await GetDataSetAllAsync(sql, parameters); if (ds.Tables.Count != 0 && ds.Tables.Count > 0) return ds.Tables[0]; return new DataTable(); } public virtual Task GetDataTableAsync(string sql, object parameters) { return GetDataTableAsync(sql, this.GetParameters(parameters)); } public virtual Task GetDataTableAsync(string sql, List parameters) { if (parameters == null) { return GetDataTableAsync(sql); } else { return GetDataTableAsync(sql, parameters.ToArray()); } } public virtual DataSet GetDataSetAll(string sql, object parameters) { return GetDataSetAll(sql, this.GetParameters(parameters)); } public virtual DataSet GetDataSetAll(string sql, List parameters) { if (parameters == null) { return GetDataSetAll(sql); } else { return GetDataSetAll(sql, parameters.ToArray()); } } public virtual Task GetDataSetAllAsync(string sql, object parameters) { return GetDataSetAllAsync(sql, this.GetParameters(parameters)); } public virtual Task GetDataSetAllAsync(string sql, List parameters) { if (parameters == null) { return GetDataSetAllAsync(sql); } else { return GetDataSetAllAsync(sql, parameters.ToArray()); } } public virtual IDataReader GetDataReader(string sql, object parameters) { return GetDataReader(sql, this.GetParameters(parameters)); } public virtual IDataReader GetDataReader(string sql, List parameters) { if (parameters == null) { return GetDataReader(sql); } else { return GetDataReader(sql, parameters.ToArray()); } } public virtual Task GetDataReaderAsync(string sql, object parameters) { return GetDataReaderAsync(sql, this.GetParameters(parameters)); } public virtual Task GetDataReaderAsync(string sql, List parameters) { if (parameters == null) { return GetDataReaderAsync(sql); } else { return GetDataReaderAsync(sql, parameters.ToArray()); } } public virtual object GetScalar(string sql, object parameters) { return GetScalar(sql, this.GetParameters(parameters)); } public virtual object GetScalar(string sql, List parameters) { if (parameters == null) { return GetScalar(sql); } else { return GetScalar(sql, parameters.ToArray()); } } public virtual Task GetScalarAsync(string sql, object parameters) { return GetScalarAsync(sql, this.GetParameters(parameters)); } public virtual Task GetScalarAsync(string sql, List parameters) { if (parameters == null) { return GetScalarAsync(sql); } else { return GetScalarAsync(sql, parameters.ToArray()); } } public virtual int ExecuteCommand(string sql, object parameters) { return ExecuteCommand(sql, GetParameters(parameters)); } public virtual int ExecuteCommand(string sql, List parameters) { if (parameters == null) { return ExecuteCommand(sql); } else { return ExecuteCommand(sql, parameters.ToArray()); } } public Task ExecuteCommandAsync(string sql, object parameters, CancellationToken cancellationToken) { this.CancellationToken = CancellationToken; return ExecuteCommandAsync(sql,parameters); } public virtual Task ExecuteCommandAsync(string sql, object parameters) { return ExecuteCommandAsync(sql, GetParameters(parameters)); } public virtual Task ExecuteCommandAsync(string sql, List parameters) { if (parameters == null) { return ExecuteCommandAsync(sql); } else { return ExecuteCommandAsync(sql, parameters.ToArray()); } } #endregion #region Helper public virtual async Task GetCommandAsync(string sql, SugarParameter[] parameters) { await Task.FromResult(0); throw new NotImplementedException(); } public async Task CloseAsync() { if (this.Transaction != null) { this.Transaction = null; } if (this.Connection != null && this.Connection.State == ConnectionState.Open) { await (this.Connection as DbConnection).CloseAsync(); } if (this.IsMasterSlaveSeparation && this.SlaveConnections.HasValue()) { foreach (var slaveConnection in this.SlaveConnections) { if (slaveConnection != null && slaveConnection.State == ConnectionState.Open) { await (slaveConnection as DbConnection).CloseAsync(); } } } } protected virtual void SugarCatch(Exception ex, string sql, SugarParameter[] parameters) { if (sql != null && sql.Contains("{year}{month}{day}")) { Check.ExceptionEasy("need .SplitTable() message:" + ex.Message, "当前代码是否缺少 .SplitTable() ,可以看文档 [分表] , 详细错误:" + ex.Message); } } public virtual void RemoveCancellationToken() { this.CancellationToken = null; } protected void Async() { if (this.Context.Root != null && this.Context.Root.AsyncId == null) { this.Context.Root.AsyncId = Guid.NewGuid(); ; } } private static bool NextResult(IDataReader dataReader) { try { return dataReader.NextResult(); } catch { return false; } } protected void ExecuteProcessingSQL(ref string sql,ref SugarParameter[] parameters) { var result = this.ProcessingEventStartingSQL(sql, parameters); sql = result.Key; parameters = result.Value; } public virtual void ExecuteBefore(string sql, SugarParameter[] parameters) { //if (this.Context.CurrentConnectionConfig.Debugger != null && this.Context.CurrentConnectionConfig.Debugger.EnableThreadSecurityValidation == true) //{ // var contextId = this.Context.ContextID.ToString(); // var processId = Thread.CurrentThread.ManagedThreadId.ToString(); // var cache = new ReflectionInoCacheService(); // if (!cache.ContainsKey(contextId)) // { // cache.Add(contextId, processId); // } // else // { // var cacheValue = cache.Get(contextId); // if (processId != cacheValue) // { // throw new SqlSugarException(this.Context, ErrorMessage.GetThrowMessage("Detection of SqlSugarClient cross-threading usage,a thread needs a new one", "检测到声名的SqlSugarClient跨线程使用,请检查是否静态、是否单例、或者IOC配置错误引起的,保证一个线程new出一个对象 ,具本Sql:") + sql, parameters); // } // } //} this.BeforeTime = DateTime.Now; if (this.IsEnableLogEvent) { Action action = LogEventStarting; if (action != null) { if (parameters == null || parameters.Length == 0) { action(sql, new SugarParameter[] { }); } else { action(sql, parameters); } } } } public virtual void ExecuteAfter(string sql, SugarParameter[] parameters) { this.AfterTime = DateTime.Now; var hasParameter = parameters.HasValue(); if (hasParameter) { foreach (var outputParameter in parameters.Where(it => it.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput, ParameterDirection.ReturnValue))) { var gobalOutputParamter = this.OutputParameters.FirstOrDefault(it => it.ParameterName == outputParameter.ParameterName); if (gobalOutputParamter == null) {//Oracle bug gobalOutputParamter = this.OutputParameters.FirstOrDefault(it => it.ParameterName == outputParameter.ParameterName.TrimStart(outputParameter.ParameterName.First())); } outputParameter.Value = gobalOutputParamter.Value; this.OutputParameters.Remove(gobalOutputParamter); } } if (this.IsEnableLogEvent) { Action action = LogEventCompleted; if (action != null) { if (parameters == null || parameters.Length == 0) { action(sql, new SugarParameter[] { }); } else { action(sql, parameters); } } } if (this.OldCommandType != 0) { this.CommandType = this.OldCommandType; this.IsClearParameters = this.OldClearParameters; this.OldCommandType = 0; this.OldClearParameters = false; } } public virtual void GetDataBefore(string sql, SugarParameter[] parameters) { this.GetDataBeforeTime = DateTime.Now; if (this.IsEnableLogEvent) { Action action = OnGetDataReadering; if (action != null) { if (parameters == null || parameters.Length == 0) { action(sql, new SugarParameter[] { }); } else { action(sql, parameters); } } } } public virtual void GetDataAfter(string sql, SugarParameter[] parameters) { this.GetDataAfterTime = DateTime.Now; if (this.IsEnableLogEvent) { Action action = OnGetDataReadered; if (action != null) { if (parameters == null || parameters.Length == 0) { action(sql, new SugarParameter[] { }, GetDataExecutionTime); } else { action(sql, parameters, GetDataExecutionTime); } } } } public virtual SugarParameter[] GetParameters(object parameters, PropertyInfo[] propertyInfo = null) { if (parameters == null) return null; return base.GetParameters(parameters, propertyInfo, this.SqlParameterKeyWord); } protected bool IsAutoClose() { return this.Context.CurrentConnectionConfig.IsAutoCloseConnection && this.Transaction == null; } protected bool IsMasterSlaveSeparation { get { return this.Context.CurrentConnectionConfig.SlaveConnectionConfigs.HasValue() && this.IsDisableMasterSlaveSeparation == false; } } protected void SetConnectionStart(string sql) { if (this.Transaction == null && this.IsMasterSlaveSeparation && IsRead(sql)) { if (this.MasterConnection == null) { this.MasterConnection = this.Connection; this.MasterConnectionString = this.MasterConnection.ConnectionString; } var saves = this.Context.CurrentConnectionConfig.SlaveConnectionConfigs.Where(it => it.HitRate > 0).ToList(); var currentIndex = UtilRandom.GetRandomIndex(saves.ToDictionary(it => saves.ToList().IndexOf(it), it => it.HitRate)); var currentSaveConnection = saves[currentIndex]; this.Connection = null; this.Context.CurrentConnectionConfig.ConnectionString = currentSaveConnection.ConnectionString; this.Connection = this.Connection; if (this.SlaveConnections.IsNullOrEmpty() || !this.SlaveConnections.Any(it => EqualsConnectionString(it.ConnectionString, this.Connection.ConnectionString))) { if (this.SlaveConnections == null) this.SlaveConnections = new List(); this.SlaveConnections.Add(this.Connection); } } else if (this.Transaction == null && this.IsMasterSlaveSeparation&& this.MasterConnection == null) { this.MasterConnection = this.Connection; this.MasterConnectionString = this.MasterConnection.ConnectionString; } } private bool EqualsConnectionString(string connectionString1, string connectionString2) { var connectionString1Array = connectionString1.Split(';'); var connectionString2Array = connectionString2.Split(';'); var result = connectionString1Array.Except(connectionString2Array); return result.Count() == 0; } private bool IsFormat(SugarParameter[] parameters) { return FormatSql != null && parameters != null && parameters.Length > 0; } protected void SetConnectionEnd(string sql) { if (this.IsMasterSlaveSeparation && IsRead(sql) && this.Transaction == null) { this.Connection = this.MasterConnection; this.Context.CurrentConnectionConfig.ConnectionString = this.MasterConnectionString; } this.Context.SugarActionType = SugarActionType.UnKnown; } private bool IsRead(string sql) { var sqlLower = sql.ToLower(); var result = Regex.IsMatch(sqlLower, "[ ]*select[ ]") && !Regex.IsMatch(sqlLower, "[ ]*insert[ ]|[ ]*update[ ]|[ ]*delete[ ]"); return result; } protected void ExecuteErrorEvent(string sql, SugarParameter[] parameters, Exception ex) { this.AfterTime = DateTime.Now; ErrorEvent(new SqlSugarException(this.Context, ex, sql, parameters)); } protected void InitParameters(ref string sql, SugarParameter[] parameters) { if (parameters.HasValue()) { foreach (var item in parameters) { if (item.Value != null) { var type = item.Value.GetType(); if ((type != UtilConstants.ByteArrayType && type.IsArray&&item.IsArray==false) || type.FullName.IsCollectionsList()||type.IsIterator()) { var newValues = new List(); foreach (var inValute in item.Value as IEnumerable) { newValues.Add(inValute.ObjToString()); } if (newValues.IsNullOrEmpty()) { newValues.Add("-1"); } if (item.ParameterName.Substring(0, 1) == ":") { sql = sql.Replace("@" + item.ParameterName.Substring(1), newValues.ToArray().ToJoinSqlInVals()); } if (item.ParameterName.Substring(0, 1) != this.SqlParameterKeyWord && sql.ObjToString().Contains(this.SqlParameterKeyWord + item.ParameterName)) { sql = sql.Replace(this.SqlParameterKeyWord + item.ParameterName, newValues.ToArray().ToJoinSqlInVals()); } else if (item.Value!=null&&UtilMethods.IsNumberArray(item.Value.GetType())) { if (newValues.Any(it => it == "")) { newValues.RemoveAll(r => r == ""); newValues.Add("null"); } sql = sql.Replace(item.ParameterName, string.Join(",", newValues)); } else { sql = sql.Replace(item.ParameterName, newValues.ToArray().ToJoinSqlInVals()); } item.Value = DBNull.Value; } } if (item.ParameterName != null && item.ParameterName.Contains(" ")) { var oldName = item.ParameterName; item.ParameterName = item.ParameterName.Replace(" ", ""); sql = sql.Replace(oldName, item.ParameterName); } } } } private List GetData(Type entityType, IDataReader dataReader) { List result; if (entityType == UtilConstants.DynamicType) { result = this.Context.Utilities.DataReaderToExpandoObjectListNoUsing(dataReader) as List; } else if (entityType == UtilConstants.ObjType) { result = this.Context.Utilities.DataReaderToExpandoObjectListNoUsing(dataReader).Select(it => ((TResult)(object)it)).ToList(); } else if (entityType.IsAnonymousType()||StaticConfig.EnableAot) { if (StaticConfig.EnableAot&& entityType==UtilConstants.StringType) { result = this.Context.Ado.DbBind.DataReaderToListNoUsing(entityType, dataReader); } else { result = this.Context.Utilities.DataReaderToListNoUsing(dataReader); } } else { result = this.Context.Ado.DbBind.DataReaderToListNoUsing(entityType, dataReader); } return result; } private async Task> GetDataAsync(Type entityType, IDataReader dataReader) { List result; if (entityType == UtilConstants.DynamicType) { result =await this.Context.Utilities.DataReaderToExpandoObjectListAsyncNoUsing(dataReader) as List; } else if (entityType == UtilConstants.ObjType) { var list = await this.Context.Utilities.DataReaderToExpandoObjectListAsyncNoUsing(dataReader); result = list.Select(it => ((TResult)(object)it)).ToList(); } else if (entityType.IsAnonymousType() || StaticConfig.EnableAot) { if (StaticConfig.EnableAot && entityType == UtilConstants.StringType) { result = await this.Context.Ado.DbBind.DataReaderToListNoUsingAsync(entityType, dataReader); } else { result =await this.Context.Utilities.DataReaderToListAsyncNoUsing(dataReader); } } else { result =await this.Context.Ado.DbBind.DataReaderToListNoUsingAsync(entityType, dataReader); } return result; } #endregion } }