コード例 #1
0
ファイル: DbResultContext.cs プロジェクト: cash2one/devfx
 public DbResultContext(IDbExecuteContext ctx, Type resultType, object resultInstance, IResultHandler resultHandler, IDictionary items) : base(items)
 {
     this.ExecuteContext = ctx;
     this.ResultType     = resultType;
     this.ResultInstance = resultInstance;
     this.ResultHandler  = resultHandler;
 }
コード例 #2
0
ファイル: DbCommandBuilder.cs プロジェクト: mer2/devfx
 private string BuildParameter(IDbExecuteContext ctx, IParameterSetting parameter, string parameterName, object parameterValue, string commandText, DbCommand cmd)
 {
     var objectService = ObjectService.Current;
     var typeName = objectService.GetTypeName(parameter.ParameterTypeName);
     var parameterType = TypeHelper.CreateType(typeName, true);
     if (parameterValue != null) { //判断类型是否匹配
         var parameterRealType = parameterValue.GetType();
         if (parameterRealType.IsEnum && parameterType == typeof (int)) {} else if (parameterRealType.IsValueType) {} else if (!parameterType.IsInstanceOfType(parameterValue)) {
             throw new DataException(string.Format("参数 {0} 类型不匹配", parameter.Name));
         }
     } else { //获取缺省值
         parameterValue = parameter.GetDefaultValue(parameterType);
     }
     if (parameter.IsInline) {
         if (parameterValue != null) {
             commandText = commandText.Replace(parameterName, parameterValue.ToString());
         }
     } else {
         if (parameterValue != null && parameterValue is IObjectWrap) { //传出的参数?
             parameterValue = ((IObjectWrap) parameterValue).Value;
         }
         this.BuildParameter(ctx, cmd, parameter, parameterName, parameterValue);
     }
     return commandText;
 }
コード例 #3
0
ファイル: DbCommandBuilder.cs プロジェクト: lanicon/devfx
        //通过配置和参数创建SQL参数
        protected virtual void BuildParameter(IDbExecuteContext ctx, DbCommand cmd, IParameterSetting parameter, string parameterName, object parameterValue)
        {
            var dbParameter = cmd.CreateParameter();

            dbParameter.ParameterName = parameterName;            //这里的参数名已经有@前缀了
            var isNullable = parameter.IsNullable;

            if (isNullable && parameterValue == null)
            {
                parameterValue = DBNull.Value;
            }
            dbParameter.Value = parameterValue;
            if (!string.IsNullOrEmpty(parameter.DbTypeName))              //显示指定了参数类型
            {
                ctx.DataStorage.SetDbType(dbParameter, parameter.DbTypeName);
            }
            else                //未指定则从类型值里推断参数类型
            {
                ctx.DataStorage.SetDbTypeFromValue(dbParameter, parameterValue);
            }

            dbParameter.Direction  = parameter.Direction;
            dbParameter.IsNullable = parameter.IsNullable;
            dbParameter.Size       = parameter.Size;
            ((IDbDataParameter)dbParameter).Scale     = parameter.Scale;
            ((IDbDataParameter)dbParameter).Precision = parameter.Precision;
            cmd.Parameters.Add(dbParameter);
        }
コード例 #4
0
        protected override object ExecuteResult(IDbExecuteContext ctx, Type resultType, object resultInstance)
        {
            var type    = this.GetResultType(ctx, resultType, resultInstance, null);
            var handler = this.GetResultHandler(type);

            return(handler.ExecuteResult(ctx, resultType, resultInstance));
        }
コード例 #5
0
        protected virtual IPaginateResult ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type elementType)
        {
            PaginateResult result;

            if (elementType == null)
            {
                result = new PaginateResult();
            }
            else
            {
                var type         = typeof(PaginateResult <>);
                var instanceType = type.MakeGenericType(elementType);
                result = (PaginateResult)TypeHelper.CreateObject(instanceType, null, true);
            }
            using (var reader = command.ExecuteReader(CommandBehavior.Default)) {
                if (reader.Read())
                {
                    result.Count = Convert.ToInt32(reader[0]);
                }
                var list = new ArrayList();
                if (reader.NextResult())
                {
                    while (reader.Read())
                    {
                        list.Add(this.ObjectMapper.Mapping(ctx.Statement, reader.ToDictionary(), elementType, null));
                    }
                }
                result.Items = elementType != null ? (object[])list.ToArray(elementType) : list.ToArray();
            }
            return(result);
        }
コード例 #6
0
ファイル: ResultHandlerBase.cs プロジェクト: cash2one/devfx
        protected virtual object ExecuteResult(IDbExecuteContext ctx, Type resultType, object resultInstance)
        {
            var cmd    = this.GetDbCommand(ctx);
            var result = this.ExecuteResultInternal(ctx, cmd, resultType, resultInstance);

            return(result);
        }
コード例 #7
0
ファイル: ResultHandlerBase.cs プロジェクト: cash2one/devfx
 protected virtual object HandleOutputOrReturnValue(IDbExecuteContext ctx, Type resultType, object resultInstance, DbCommand cmd, object executedResult)
 {
     //此方法由实现者自行调用,大部分情况下只有<see cref="NoneResultHandler" />会调用
     foreach (DbParameter dp in cmd.Parameters)
     {
         if (dp.Direction == ParameterDirection.InputOutput || dp.Direction == ParameterDirection.Output || dp.Direction == ParameterDirection.ReturnValue)
         {
             var ps = ctx.Statement.Parameters.SingleOrDefault(x => string.Compare(x.ParameterName, dp.ParameterName, StringComparison.InvariantCultureIgnoreCase) == 0);
             if (ps == null)
             {
                 continue;
             }
             if (dp.Direction == ParameterDirection.ReturnValue)                      //返回参数
             {
                 executedResult = dp.Value;
             }
             else
             {
                 var valueWrap = ctx.Parameters[ps.Name] as IObjectWrap;
                 if (valueWrap == null)
                 {
                     continue;
                 }
                 valueWrap.ChangeValue(dp.Value);
             }
         }
     }
     return(executedResult);
 }
コード例 #8
0
ファイル: DbCommandBuilder.cs プロジェクト: lanicon/devfx
 protected virtual string GetCommandText(IDbExecuteContext ctx, IStatementSetting statement, IDictionary parameterValues)
 {
     if (statement.StatementText.Parser != null)
     {
         return(statement.StatementText.Parser.GetCommandText(statement, parameterValues));
     }
     return(statement.StatementText.CommandText);
 }
コード例 #9
0
ファイル: DbResultContext.cs プロジェクト: mer2/devfx
 public DbResultContext(IDbExecuteContext ctx, Type resultType, object resultInstance, IResultHandler resultHandler, IDictionary items)
     : base(items)
 {
     this.ExecuteContext = ctx;
     this.ResultType = resultType;
     this.ResultInstance = resultInstance;
     this.ResultHandler = resultHandler;
 }
コード例 #10
0
ファイル: DataReaderResultHandler.cs プロジェクト: mer2/devfx
 protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
 {
     var defaultType = typeof(IDataReader);
     var type = this.GetResultType(ctx, resultType, resultInstance, defaultType);
     if (!defaultType.IsAssignableFrom(type)) {
         throw new DataException("要求返回的类型不正确");
     }
     return command.ExecuteReader(CommandBehavior.CloseConnection);
 }
コード例 #11
0
ファイル: SingleResultHandler.cs プロジェクト: mer2/devfx
 protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
 {
     using (var reader = command.ExecuteReader(CommandBehavior.SingleRow)) {
         if(reader.Read()) {
             resultInstance = this.ObjectMapper.Mapping(ctx.Statement, reader.ToDictionary(), resultType, resultInstance);
         }
         return resultInstance;
     }
 }
コード例 #12
0
ファイル: NoneResultHandler.cs プロジェクト: mer2/devfx
 protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
 {
     var affectedRows = command.ExecuteNonQuery();
     //判断是否是存储过程,是则需要处理输出参数和返回参数
     if(command.CommandType == CommandType.StoredProcedure) {
         var result = this.HandleOutputOrReturnValue(ctx, resultType, resultInstance, command, affectedRows);
         return result;
     }
     return affectedRows;
 }
コード例 #13
0
ファイル: SingleResultHandler.cs プロジェクト: cash2one/devfx
 protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
 {
     using (var reader = command.ExecuteReader(CommandBehavior.SingleRow)) {
         if (reader.Read())
         {
             resultInstance = this.ObjectMapper.Mapping(ctx.Statement, reader.ToDictionary(), resultType, resultInstance);
         }
         return(resultInstance);
     }
 }
コード例 #14
0
        protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
        {
            var defaultType = typeof(IDataReader);
            var type        = this.GetResultType(ctx, resultType, resultInstance, defaultType);

            if (!defaultType.IsAssignableFrom(type))
            {
                throw new DataException("要求返回的类型不正确");
            }
            return(command.ExecuteReader(CommandBehavior.CloseConnection));
        }
コード例 #15
0
        protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
        {
            var affectedRows = command.ExecuteNonQuery();

            //判断是否是存储过程,是则需要处理输出参数和返回参数
            if (command.CommandType == CommandType.StoredProcedure)
            {
                var result = this.HandleOutputOrReturnValue(ctx, resultType, resultInstance, command, affectedRows);
                return(result);
            }
            return(affectedRows);
        }
コード例 #16
0
ファイル: DbCommandBuilder.cs プロジェクト: cash2one/devfx
        public virtual DbCommand GetCommand(IDbExecuteContext ctx)
        {
            var wrap      = ctx.CommandWrap;
            var statement = ctx.Statement;
            var cmd       = wrap.Command;

            cmd.CommandType    = statement.CommandType;
            cmd.CommandTimeout = statement.Timeout;
            var parameterValues = ctx.Parameters;
            var commandText     = this.GetCommandText(ctx, statement, parameterValues);

            foreach (var parameter in statement.Parameters)
            {
                var parameterValue = parameterValues[parameter.Name];
                if (parameter.Expandable)                   //符合可扩展条件
                {
                    var array = parameterValue as Array;
                    if (array != null)                      //数组
                    {
                        for (var i = 0; i < array.Length; i++)
                        {
                            commandText = this.BuildParameter(ctx, parameter, parameter.ParameterName + i, array.GetValue(i), commandText, cmd);
                        }
                    }
                    else if (parameterValue != null)                       //尝试转换成IDictionary形式
                    {
                        var dict = parameterValue.ToDictionary();
                        foreach (var key in dict.Keys)
                        {
                            var pn = Convert.ToString(key);
                            if (string.IsNullOrEmpty(pn))
                            {
                                continue;
                            }
                            this.BuildParameter(ctx, cmd, parameter, pn, dict[key]);
                        }
                    }                    //否则此选项无效
                }
                else
                {
                    commandText = this.BuildParameter(ctx, parameter, parameter.ParameterName, parameterValue, commandText, cmd);
                }
            }
            cmd.CommandText = commandText;
            var dataService = ctx.DataService;

            if (dataService is DataServiceBase && ((DataServiceBase)dataService).Debug)
            {
                LogService.WriteLog(this, LogLevel.DEBUG, commandText + "\r\n" + JsonHelper.ToJson(parameterValues, false));
            }
            return(cmd);
        }
コード例 #17
0
        protected virtual object FactoryExecuteResult(IDbExecuteContext ctx, Type resultType, object resultInstance)
        {
            var returnValue = FactoryExecuteResultInternal(ctx, resultType, resultInstance);

            if (returnValue == null && resultType.IsValueType)
            {
                if (!resultType.IsGenericType || resultType.GetGenericTypeDefinition() != typeof(Nullable <>))
                {
                    throw new DataException($"期待返回的类型是值类型[{resultType.Name}],但返回的是null,无法转换。");
                }
            }
            return(returnValue);
        }
コード例 #18
0
ファイル: ScalarResultHandler.cs プロジェクト: mer2/devfx
 protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
 {
     var type = this.GetResultType(ctx, resultType, resultInstance, null);
     if(type != null && !(type.IsValueType || type == typeof(string))) {
         throw new DataException("要求返回的类型不正确");
     }
     var result = command.ExecuteScalar();
     if(!Convert.IsDBNull(result) && result != null && type != null) {
         var ut = Nullable.GetUnderlyingType(type) ?? type;
         result = Convert.ChangeType(result, ut);
     }
     return Convert.IsDBNull(result) ? null : result;
 }
コード例 #19
0
ファイル: PaginateResultHandler.cs プロジェクト: mer2/devfx
 protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
 {
     var defaultType = typeof(IPaginateResult);
     var type = this.GetResultType(ctx, resultType, resultInstance, defaultType);
     if (!defaultType.IsAssignableFrom(type)) {
         throw new DataException("要求返回的类型不正确");
     }
     Type elementType = null;
     var types = type.GetGenericArguments();
     if(types != null && types.Length == 1) {
         elementType = types[0];
     }
     return this.ExecuteResultInternal(ctx, command, elementType);
 }
コード例 #20
0
ファイル: ResultCacheModule.cs プロジェクト: mer2/devfx
 protected virtual string GetCacheKey(IDataCacheSetting setting, IDbExecuteContext ctx)
 {
     var cacheKey = setting.CacheKey;
     if (string.IsNullOrEmpty(cacheKey)) {
         cacheKey = ctx.Statement.Name;
     }
     var key = cacheKey + ":";
     var parameters = setting.Parameters;
     if (string.IsNullOrEmpty(parameters)) {
         key += ctx.Parameters.ToString(null);
     } else {
         key += ctx.Parameters.ToString(parameters.Split(','), null);
     }
     return key;
 }
コード例 #21
0
ファイル: DataTableResultHandler.cs プロジェクト: mer2/devfx
 protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
 {
     var defaultType = typeof(DataTable);
     var type = this.GetResultType(ctx, resultType, resultInstance, defaultType);
     if (!defaultType.IsAssignableFrom(type)) {
         throw new DataException("要求返回的类型不正确");
     }
     var provider = ctx.DataStorage.DataProviderFactory;
     var result = resultInstance as DataTable ?? new DataTable();
     using (var adapter = provider.CreateDataAdapter()) {
         adapter.SelectCommand = command;
         adapter.Fill(result);
     }
     return result;
 }
コード例 #22
0
 public static Type GetResultType(IDbExecuteContext ctx, Type resultType, object resultInstance, Type defaultType)
 {
     if (resultType == null)
     {
         if (resultInstance != null)
         {
             resultType = resultInstance.GetType();
         }
         if (resultType == null)
         {
             resultType = defaultType;
         }
     }
     return(resultType);
 }
コード例 #23
0
ファイル: ArrayResultHandler.cs プロジェクト: mer2/devfx
 protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
 {
     var type = this.GetResultType(ctx, resultType, resultInstance, null);
     if(type != null && !typeof(Array).IsAssignableFrom(type)) {
         throw new DataException("要求返回的类型不正确");
     }
     var elementType = type != null ? type.GetElementType() : null;
     var list = new ArrayList();
     using (var reader = command.ExecuteReader(CommandBehavior.SingleResult)) {
         while(reader.Read()) {
             var result = this.ObjectMapper.Mapping(ctx.Statement, reader.ToDictionary(), elementType, null);
             list.Add(result);
         }
     }
     return elementType == null ? list.ToArray() : list.ToArray(elementType);
 }
コード例 #24
0
        protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
        {
            var type = this.GetResultType(ctx, resultType, resultInstance, null);

            if (type != null && !(type.IsValueType || type == typeof(string)))
            {
                throw new DataException("要求返回的类型不正确");
            }
            var result = command.ExecuteScalar();

            if (!Convert.IsDBNull(result) && result != null && type != null)
            {
                var ut = Nullable.GetUnderlyingType(type) ?? type;
                result = Convert.ChangeType(result, ut);
            }
            return(Convert.IsDBNull(result) ? null : result);
        }
コード例 #25
0
        protected virtual object FactoryExecuteResultInternal(IDbExecuteContext ctx, Type resultType, object resultInstance)
        {
            IResultHandler handler;
            var            handlerName = ctx.Statement.ResultHandlerName;

            if (string.IsNullOrEmpty(handlerName))
            {
                var type = GetResultType(ctx, resultType, resultInstance, null);
                handler = this.GetResultHandler(type);
            }
            else
            {
                handler = this.ObjectService.GetOrCreateObject <IResultHandler>(handlerName);
            }
            var resultContext = new DbResultContext(ctx, resultType, resultInstance, handler, null);

            if (this.Modules != null && this.Modules.Length > 0)
            {
                foreach (var module in this.Modules)
                {
                    module.OnResultExecute(resultContext);
                    if (resultContext.ResultHandled)
                    {
                        break;
                    }
                }
            }
            if (resultContext.ResultHandled)
            {
                return(resultContext.ResultInstance);
            }
            handler = resultContext.ResultHandler;
            if (handler == null)
            {
                throw new DataException("ResultHandler Not Found");
            }
            if (resultType == null && resultInstance == null)              //都没有指定?则使用无返回值的处理器
            {
                var noneHandler = this.ObjectService.GetObject <NoneResultHandler>();
                if (noneHandler != null)
                {
                    handler = noneHandler;
                }
            }
            return(handler.ExecuteResult(ctx, resultType, resultInstance));
        }
コード例 #26
0
ファイル: DbCommandBuilder.cs プロジェクト: lanicon/devfx
        //仅通过参数创建SQL参数
        protected virtual void BuildParameter(IDbExecuteContext ctx, DbCommand cmd, string parameterName, object parameterValue)
        {
            if (parameterValue is DbParameter dbp)              //如果已经是参数类型,则直接添加
            {
                cmd.Parameters.Add(dbp);
                return;
            }
            var dbParameter = cmd.CreateParameter();

            dbParameter.ParameterName = "@" + parameterName;            //这里的参数名需要添加@前缀
            if (parameterValue == null)
            {
                parameterValue = DBNull.Value;
            }
            dbParameter.Value = parameterValue;
            ctx.DataStorage.SetDbTypeFromValue(dbParameter, parameterValue);
            cmd.Parameters.Add(dbParameter);
        }
コード例 #27
0
        protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
        {
            var defaultType = typeof(IPaginateResult);
            var type        = this.GetResultType(ctx, resultType, resultInstance, defaultType);

            if (!defaultType.IsAssignableFrom(type))
            {
                throw new DataException("要求返回的类型不正确");
            }
            Type elementType = null;
            var  types       = type.GetGenericArguments();

            if (types != null && types.Length == 1)
            {
                elementType = types[0];
            }
            return(this.ExecuteResultInternal(ctx, command, elementType));
        }
コード例 #28
0
        protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
        {
            var defaultType = typeof(DataSet);
            var type        = this.GetResultType(ctx, resultType, resultInstance, defaultType);

            if (!defaultType.IsAssignableFrom(type))
            {
                throw new DataException("要求返回的类型不正确");
            }
            var provider = ctx.DataStorage.DataProviderFactory;
            var result   = resultInstance as DataSet ?? new DataSet();

            using (var adapter = provider.CreateDataAdapter()) {
                adapter.SelectCommand = command;
                adapter.Fill(result);
            }
            return(result);
        }
コード例 #29
0
ファイル: DbCommandBuilder.cs プロジェクト: lanicon/devfx
        private string BuildParameter(IDbExecuteContext ctx, IParameterSetting parameter, string parameterName, object parameterValue, string commandText, DbCommand cmd)
        {
            Type parameterType = null;

            if (!string.IsNullOrEmpty(parameter.ParameterTypeName))
            {
                var objectService = ObjectService.Current;
                parameterType = objectService.GetOrCreateType(parameter.ParameterTypeName);
            }
            if (parameterValue != null)               //判断类型是否匹配
            {
                var parameterRealType = parameterValue.GetType();
                if (parameterRealType.IsEnum && parameterType == typeof(int))
                {
                }
                else if (parameterRealType.IsValueType)
                {
                }
                else if (parameterType != null && !parameterType.IsInstanceOfType(parameterValue))
                {
                    throw new DataException($"参数 {parameter.Name} 类型不匹配");
                }
            }
            else                 //获取缺省值
            {
                parameterValue = parameter.GetDefaultValue(parameterType);
            }
            if (parameter.IsInline)
            {
                if (parameterValue != null)
                {
                    commandText = commandText.Replace(parameterName, parameterValue.ToString());
                }
            }
            else
            {
                if (parameterValue is IObjectWrap)                   //传出的参数?
                {
                    parameterValue = ((IObjectWrap)parameterValue).Value;
                }
                this.BuildParameter(ctx, cmd, parameter, parameterName, parameterValue);
            }
            return(commandText);
        }
コード例 #30
0
ファイル: DbCommandBuilder.cs プロジェクト: mer2/devfx
 protected virtual void BuildParameter(IDbExecuteContext ctx, DbCommand cmd, IParameterSetting parameter, string parameterName, object parameterValue)
 {
     var dbParameter = cmd.CreateParameter();
     dbParameter.ParameterName = parameterName;
     if(!string.IsNullOrEmpty(parameter.DbTypeName)) {
         ctx.DataStorage.SetDbType(dbParameter, parameter.DbTypeName);
     }
     var isNullable = parameter.IsNullable;
     if(isNullable && parameterValue == null) {
         parameterValue = DBNull.Value;
     }
     dbParameter.Direction = parameter.Direction;
     dbParameter.IsNullable = parameter.IsNullable;
     dbParameter.Size = parameter.Size;
     ((IDbDataParameter)dbParameter).Scale = parameter.Scale;
     ((IDbDataParameter)dbParameter).Precision = parameter.Precision;
     dbParameter.Value = parameterValue;
     cmd.Parameters.Add(dbParameter);
 }
コード例 #31
0
ファイル: ArrayResultHandler.cs プロジェクト: lanicon/devfx
        protected override object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance)
        {
            var type = this.GetResultType(ctx, resultType, resultInstance, null);

            if (type != null && !typeof(Array).IsAssignableFrom(type))
            {
                throw new DataException("要求返回的类型不正确");
            }
            var elementType = type?.GetElementType();
            var list        = new ArrayList();

            using (var reader = command.ExecuteReader(CommandBehavior.SingleResult)) {
                while (reader.Read())
                {
                    var result = this.ObjectMapper.Mapping(ctx.Statement, reader.ToDictionary(), elementType, null);
                    list.Add(result);
                }
            }
            return(elementType == null?list.ToArray() : list.ToArray(elementType));
        }
コード例 #32
0
        protected override IPaginateResult ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type elementType)
        {
            var result = new PaginateResult();

            using (var reader = command.ExecuteReader(CommandBehavior.Default)) {
                if (reader.Read())
                {
                    result.Count = Convert.ToInt32(reader[0]);
                }
                var list = new ArrayList();
                if (reader.NextResult())
                {
                    while (reader.Read())
                    {
                        list.Add(reader.ToDictionary());
                    }
                }
                result.Items = list.ToArray();
            }
            return(result);
        }
コード例 #33
0
ファイル: ResultCacheModule.cs プロジェクト: cash2one/devfx
        protected virtual string GetCacheKey(IDataCacheSetting setting, IDbExecuteContext ctx)
        {
            var cacheKey = setting.CacheKey;

            if (string.IsNullOrEmpty(cacheKey))
            {
                cacheKey = ctx.Statement.Name;
            }
            var key        = cacheKey + ":";
            var parameters = setting.Parameters;

            if (string.IsNullOrEmpty(parameters))
            {
                key += ctx.Parameters.ToString(null);
            }
            else
            {
                key += ctx.Parameters.ToString(parameters.Split(','), null);
            }
            return(key);
        }
コード例 #34
0
ファイル: ResultHandlerBase.cs プロジェクト: mer2/devfx
 protected virtual object HandleOutputOrReturnValue(IDbExecuteContext ctx, Type resultType, object resultInstance, DbCommand cmd, object executedResult)
 {
     //此方法由实现者自行调用,大部分情况下只有<see cref="NoneResultHandler" />会调用
     foreach(DbParameter dp in cmd.Parameters) {
         if(dp.Direction == ParameterDirection.InputOutput || dp.Direction == ParameterDirection.Output || dp.Direction == ParameterDirection.ReturnValue) {
             var ps = ctx.Statement.Parameters.SingleOrDefault(x => string.Compare(x.ParameterName, dp.ParameterName, StringComparison.InvariantCultureIgnoreCase) == 0);
             if(ps == null) {
                 continue;
             }
             if(dp.Direction == ParameterDirection.ReturnValue) { //返回参数
                 executedResult = dp.Value;
             } else {
                 var valueWrap = ctx.Parameters[ps.Name] as IObjectWrap;
                 if(valueWrap == null) {
                     continue;
                 }
                 valueWrap.ChangeValue(dp.Value);
             }
         }
     }
     return executedResult;
 }
コード例 #35
0
ファイル: DbCommandBuilder.cs プロジェクト: mer2/devfx
 public virtual DbCommand GetCommand(IDbExecuteContext ctx)
 {
     var wrap = ctx.CommandWrap;
     var statement = ctx.Statement;
     var cmd = wrap.Command;
     cmd.CommandType = statement.CommandType;
     cmd.CommandTimeout = statement.Timeout;
     var parameterValues = ctx.Parameters;
     var commandText = this.GetCommandText(ctx, statement, parameterValues);
     foreach(var parameter in statement.Parameters) {
         var parameterValue = parameterValues[parameter.Name];
         if (parameter.Expandable) { //符合可扩展条件
             var array = parameterValue as Array;
             if (array != null) {//数组
                 for (var i = 0; i < array.Length; i++) {
                     commandText = this.BuildParameter(ctx, parameter, parameter.ParameterName + i, array.GetValue(i), commandText, cmd);
                 }
             } else if(parameterValue != null) {//尝试转换成IDictionary形式
                 var dict = parameterValue.ToDictionary();
                 foreach (var key in dict.Keys) {
                     var pn = Convert.ToString(key);
                     if (string.IsNullOrEmpty(pn)) {
                         continue;
                     }
                     this.BuildParameter(ctx, cmd, parameter, pn, dict[key]);
                 }
             }//否则此选项无效
         } else {
             commandText = this.BuildParameter(ctx, parameter, parameter.ParameterName, parameterValue, commandText, cmd);
         }
     }
     cmd.CommandText = commandText;
     var dataService = ctx.DataService;
     if(dataService is DataServiceBase && ((DataServiceBase)dataService).Debug) {
         LogService.WriteLog(this, LogLevel.DEBUG, commandText + "\r\n" + JsonHelper.ToJson(parameterValues, false));
     }
     return cmd;
 }
コード例 #36
0
ファイル: PaginateResultHandler.cs プロジェクト: mer2/devfx
 protected virtual IPaginateResult ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type elementType)
 {
     PaginateResult result;
     if(elementType == null) {
         result = new PaginateResult();
     } else {
         var type = typeof(PaginateResult<>);
         var instanceType = type.MakeGenericType(elementType);
         result = (PaginateResult)TypeHelper.CreateObject(instanceType, null, true);
     }
     using (var reader = command.ExecuteReader(CommandBehavior.Default)) {
         if (reader.Read()) {
             result.Count = Convert.ToInt32(reader[0]);
         }
         var list = new ArrayList();
         if(reader.NextResult()) {
             while (reader.Read()) {
                 list.Add(this.ObjectMapper.Mapping(ctx.Statement, reader.ToDictionary(), elementType, null));
             }
         }
         result.Items = elementType != null ? (object[])list.ToArray(elementType) : list.ToArray();
     }
     return result;
 }
コード例 #37
0
ファイル: DbCommandBuilder.cs プロジェクト: mer2/devfx
 protected virtual string GetCommandText(IDbExecuteContext ctx, IStatementSetting statement, IDictionary parameterValues)
 {
     return statement.StatementText.GetCommandText(statement, parameterValues);
 }
コード例 #38
0
ファイル: ResultHandlerBase.cs プロジェクト: mer2/devfx
 protected abstract object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance);
コード例 #39
0
ファイル: ResultHandlerBase.cs プロジェクト: mer2/devfx
 object IResultHandler.ExecuteResult(IDbExecuteContext ctx, Type resultType, object resultInstance)
 {
     return this.ExecuteResult(ctx, resultType, resultInstance);
 }
コード例 #40
0
ファイル: DbTracing.cs プロジェクト: whztt07/DbUtility
 void IDbTracing.OnLoadingData( IDbExecuteContext context )
 {
   events.Add( new TraceEventDescriptor( "OnLoadingData", DateTime.UtcNow ) );
   executionStopwatch.Stop();
   ExecutionTime = executionStopwatch.Elapsed;
 }
コード例 #41
0
 object IResultHandlerFactory.ExecuteResult(IDbExecuteContext ctx, Type resultType, object resultInstance)
 {
     return(this.FactoryExecuteResult(ctx, resultType, resultInstance));
 }
コード例 #42
0
ファイル: ResultHandlerBase.cs プロジェクト: mer2/devfx
 protected virtual object ExecuteResult(IDbExecuteContext ctx, Type resultType, object resultInstance)
 {
     var cmd = this.GetDbCommand(ctx);
     var result = this.ExecuteResultInternal(ctx, cmd, resultType, resultInstance);
     return result;
 }
コード例 #43
0
ファイル: ResultHandlerBase.cs プロジェクト: mer2/devfx
 protected virtual Type GetResultType(IDbExecuteContext ctx, Type resultType, object resultInstance, Type defaultType)
 {
     return ResultHandlerFactory.GetResultType(ctx, resultType, resultInstance, defaultType);
 }
コード例 #44
0
ファイル: ResultHandlerBase.cs プロジェクト: mer2/devfx
 protected virtual DbCommand GetDbCommand(IDbExecuteContext ctx)
 {
     return ctx.DataStorage.GetCommand(ctx);
 }
コード例 #45
0
ファイル: AsyncWrapper.cs プロジェクト: Ivony/DataPithy
 public AsyncDbExecuteContextWrapper(IDbExecuteContext context)
 {
     Context = context;
 }
コード例 #46
0
ファイル: DataOperationBase.cs プロジェクト: lanicon/devfx
 protected virtual object ExecuteResult(IDbExecuteContext ctx, Type resultType, object resultInstance)
 {
     return(this.ResultHandlerFactory.ExecuteResult(ctx, resultType, resultInstance));
 }
コード例 #47
0
ファイル: DataStorageBase.cs プロジェクト: cash2one/devfx
        public virtual DbCommand GetCommand(IDbExecuteContext ctx)
        {
            var builder = this.GetCommandBuilder(ctx);

            return(builder.GetCommand(ctx));
        }
コード例 #48
0
ファイル: ResultHandlerBase.cs プロジェクト: cash2one/devfx
 protected abstract object ExecuteResultInternal(IDbExecuteContext ctx, DbCommand command, Type resultType, object resultInstance);
コード例 #49
0
ファイル: ResultHandlerBase.cs プロジェクト: cash2one/devfx
 protected virtual Type GetResultType(IDbExecuteContext ctx, Type resultType, object resultInstance, Type defaultType)
 {
     return(ResultHandlerFactory.GetResultType(ctx, resultType, resultInstance, defaultType));
 }
コード例 #50
0
 public void OnLoadingData(IDbExecuteContext context)
 {
     Assert.IsNotNull(context);
     logger.LogInfo("OnLoadingData");
 }
コード例 #51
0
ファイル: ResultHandlerBase.cs プロジェクト: cash2one/devfx
 protected virtual DbCommand GetDbCommand(IDbExecuteContext ctx)
 {
     return(ctx.DataStorage.GetCommand(ctx));
 }