Example #1
0
        protected override bool RunOperation(
            SqlConnection sqlConnection,
            IDbTransaction dbTransaction,
            DbFunctionType dbfunctionType,
            string operationName,
            IEnumerable<KeyValuePair<string, object>> parameters,
            out object result)
        {
            var context = parameters.First().Value as ISearchContext;

            if (context != null)
            {
                var sql = new SearchBuilder().BuildSearchSql(context);

                using (var cmd = this.DbAccess.GetCommand(sql, CommandType.Text))
                {
                    result = this.DbAccess.GetReader(cmd, dbTransaction);
                    return true;
                }
            }

            // failure...
            result = null;
            return false;
        }
 /// <summary>
 /// The run operation.
 /// </summary>
 /// <param name="sqlConnection">
 /// The sql connection.
 /// </param>
 /// <param name="dbTransaction">
 /// The unit Of Work.
 /// </param>
 /// <param name="dbfunctionType">
 /// The dbfunction type.
 /// </param>
 /// <param name="operationName">
 /// The operation name.
 /// </param>
 /// <param name="parameters">
 /// The parameters.
 /// </param>
 /// <param name="result">
 /// The result.
 /// </param>
 /// <returns>
 /// The run operation.
 /// </returns>
 protected abstract bool RunOperation(
     [NotNull] SqlConnection sqlConnection,
     [NotNull] IDbTransaction dbTransaction,
     DbFunctionType dbfunctionType,
     [NotNull] string operationName,
     [NotNull] IEnumerable <KeyValuePair <string, object> > parameters,
     [CanBeNull] out object result);
Example #3
0
        /// <summary>
        /// 生成函数执行 sql 语句
        /// </summary>
        /// <param name="providerName">ADO.NET 数据库对象</param>
        /// <param name="dbFunctionType">函数类型</param>
        /// <param name="funcName">函数名词</param>
        /// <param name="parameters">函数参数</param>
        /// <returns>sql 语句</returns>
        internal static string GenerateFunctionSql(string providerName, DbFunctionType dbFunctionType, string funcName, params DbParameter[] parameters)
        {
            // 检查是否支持函数
            DatabaseProvider.CheckFunctionSupported(providerName, dbFunctionType);

            parameters ??= Array.Empty <DbParameter>();

            var stringBuilder = new StringBuilder();

            stringBuilder.Append($"SELECT{(dbFunctionType == DbFunctionType.Table ? " * FROM" : "")} {funcName}(");

            // 生成函数参数
            for (var i = 0; i < parameters.Length; i++)
            {
                var sqlParameter = parameters[i];

                // 添加 @ 前缀参数
                stringBuilder.Append($"@{(sqlParameter.ParameterName.Replace("@", ""))}");

                // 处理最后一个参数逗号
                if (i != parameters.Length - 1)
                {
                    stringBuilder.Append(", ");
                }
            }
            stringBuilder.Append("); ");

            return(stringBuilder.ToString());
        }
        /// <summary>
        /// The run operation.
        /// </summary>
        /// <param name="sqlConnection">The sql connection.</param>
        /// <param name="dbTransaction">The unit Of Work.</param>
        /// <param name="dbfunctionType">The dbfunction type.</param>
        /// <param name="operationName">The operation name.</param>
        /// <param name="parameters">The parameters.</param>
        /// <param name="result">The result.</param>
        /// <returns>
        /// The run operation.
        /// </returns>
        protected override bool RunOperation(
            SqlConnection sqlConnection,
            IDbTransaction dbTransaction,
            DbFunctionType dbfunctionType,
            string operationName,
            IEnumerable <KeyValuePair <string, object> > parameters,
            out object result)
        {
            var context = parameters.First().Value as ISearchContext;

            if (context != null)
            {
                var sql = new SearchBuilder().BuildSearchSql(context);

                using (var cmd = this.DbAccess.GetCommand(sql, CommandType.Text))
                {
                    result = this.DbAccess.GetReader(cmd, dbTransaction);
                    return(true);
                }
            }

            // failure...
            result = null;
            return(false);
        }
Example #5
0
        /// <summary>
        /// 生成函数执行 sql 语句
        /// </summary>
        ///<param name="providerName">ADO.NET 数据库对象</param>
        /// <param name="dbFunctionType">函数类型</param>
        /// <param name="funcName">函数名词</param>
        /// <param name="keyValues">字典类型参数</param>
        /// <returns></returns>
        internal static string GenerateFunctionSql(string providerName, DbFunctionType dbFunctionType, string funcName, Dictionary <string, object> keyValues)
        {
            // 检查是否支持函数
            DatabaseProvider.CheckFunctionSupported(providerName, dbFunctionType);

            var stringBuilder = new StringBuilder();

            stringBuilder.Append($"SELECT{(dbFunctionType == DbFunctionType.Table ? " * FROM" : "")} {funcName}(");

            if (keyValues != null && keyValues.Count > 0)
            {
                var i = 0;
                foreach (var key in keyValues.Keys)
                {
                    stringBuilder.Append($"@{key}");

                    // 处理最后一个参数逗号
                    if (i != keyValues.Count - 1)
                    {
                        stringBuilder.Append(", ");
                    }
                    i++;
                }
            }

            stringBuilder.Append("); ");

            return(stringBuilder.ToString());
        }
Example #6
0
        /// <summary>
        /// The db function execute.
        /// </summary>
        /// <param name="functionType">
        /// The function Type.
        /// </param>
        /// <param name="binder">
        /// The binder.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <param name="executeDb">
        /// The execute db.
        /// </param>
        /// <param name="result">
        /// The result.
        /// </param>
        /// <returns>
        /// The db function execute.
        /// </returns>
        protected bool DbFunctionExecute(
            DbFunctionType functionType,
            [NotNull] InvokeMemberBinder binder,
            [NotNull] IList <KeyValuePair <string, object> > parameters,
            [NotNull] Func <IDbCommand, object> executeDb,
            [CanBeNull] out object result)
        {
            CodeContracts.ArgumentNotNull(binder, "binder");
            CodeContracts.ArgumentNotNull(parameters, "parameters");
            CodeContracts.ArgumentNotNull(executeDb, "executeDb");

            var operationName = binder.Name;

            // see if there's a specific function override for the current provider...
            var specificFunction = this._serviceLocator.Get <IEnumerable <IDbSpecificFunction> >()
                                   .WhereProviderName(this._dbAccessProvider.ProviderName)
                                   .BySortOrder()
                                   .WhereOperationSupported(operationName)
                                   .FirstOrDefault();

            if (specificFunction == null || !specificFunction.Execute(functionType, operationName, parameters, out result))
            {
                using (var cmd = this._dbAccessProvider.Instance.GetCommand(operationName.ToLower(), true, parameters))
                {
                    result = executeDb(cmd);
                }
            }

            this.RunFilters(functionType, parameters, operationName, ref result);

            return(true);
        }
        /// <summary>
        /// The run operation.
        /// </summary>
        /// <param name="sqlConnection">The sql connection.</param>
        /// <param name="dbTransaction">The db unit of work.</param>
        /// <param name="dbfunctionType">The dbfunction type.</param>
        /// <param name="operationName">The operation name.</param>
        /// <param name="parameters">The parameters.</param>
        /// <param name="result">The result.</param>
        /// <returns>
        /// The run operation.
        /// </returns>
        protected override bool RunOperation(
            SqlConnection sqlConnection,
            IDbTransaction dbTransaction,
            DbFunctionType dbfunctionType,
            string operationName,
            IEnumerable <KeyValuePair <string, object> > parameters,
            out object result)
        {
            // create statistic SQL...
            var sb = new StringBuilder();

            sb.AppendLine("DECLARE @TableName sysname");
            sb.AppendLine("DECLARE cur_showfragmentation CURSOR FOR");
            sb.AppendLine(
                "SELECT table_name FROM information_schema.tables WHERE table_type = 'base table' AND table_name LIKE '{objectQualifier}%'");
            sb.AppendLine("OPEN cur_showfragmentation");
            sb.AppendLine("FETCH NEXT FROM cur_showfragmentation INTO @TableName");
            sb.AppendLine("WHILE @@FETCH_STATUS = 0");
            sb.AppendLine("BEGIN");
            sb.AppendLine("DBCC SHOWCONTIG (@TableName)");
            sb.AppendLine("FETCH NEXT FROM cur_showfragmentation INTO @TableName");
            sb.AppendLine("END");
            sb.AppendLine("CLOSE cur_showfragmentation");
            sb.AppendLine("DEALLOCATE cur_showfragmentation");

            using (var cmd = this.DbAccess.GetCommand(sb.ToString(), CommandType.Text))
            {
                this.DbAccess.ExecuteNonQuery(cmd, dbTransaction);
            }

            result = this._sqlMessages.Select(s => s.Message).ToDelimitedString("\r\n");

            return(true);
        }
Example #8
0
        /// <summary>
        /// The execute.
        /// </summary>
        /// <param name="dbfunctionType">
        /// The dbfunction type.
        /// </param>
        /// <param name="operationName">
        /// The operation name.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <param name="result">
        /// The result.
        /// </param>
        /// <returns>
        /// The execute.
        /// </returns>
        public virtual bool Execute(
            DbFunctionType dbfunctionType,
            [NotNull] string operationName,
            [NotNull] IEnumerable <KeyValuePair <string, object> > parameters,
            [CanBeNull] out object result)
        {
            if (this.IsSupportedOperation(operationName))
            {
                this._sqlMessages.Clear();

                using (var dbTransaction = this.DbAccess.BeginTransaction())
                {
                    if (dbTransaction.Connection is SqlConnection)
                    {
                        var sqlConnection = dbTransaction.Connection as SqlConnection;
                        sqlConnection.FireInfoMessageEventOnUserErrors = true;
                        sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(this.sqlConnection_InfoMessage);

                        return(this.RunOperation(sqlConnection, dbTransaction, dbfunctionType, operationName, parameters, out result));
                    }
                }
            }

            result = null;

            return(false);
        }
Example #9
0
        /// <summary>
        /// 生成函数执行 sql 语句
        /// </summary>
        /// <param name="providerName">ADO.NET 数据库对象</param>
        /// <param name="dbFunctionType">函数类型</param>
        /// <param name="funcName">函数名词</param>
        /// <param name="parameters">函数参数</param>
        /// <returns>sql 语句</returns>
        internal static string GenerateFunctionSql(string providerName, DbFunctionType dbFunctionType, string funcName, params DbParameter[] parameters)
        {
            // 检查是否支持函数
            DbProvider.CheckFunctionSupported(providerName, dbFunctionType);

            // 生成数据库表值函数 sql
            return(GenerateDbFunctionSql(providerName, dbFunctionType, funcName, parameters.Select(u => u.ParameterName).ToArray()));
        }
Example #10
0
        /// <summary>
        /// The execute.
        /// </summary>
        /// <param name="dbfunctionType">
        /// The dbfunction type.
        /// </param>
        /// <param name="operationName">
        /// The operation name.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <param name="result">
        /// The result.
        /// </param>
        /// <param name="transaction"></param>
        /// <returns>
        /// The execute.
        /// </returns>
        public virtual bool Execute(
            DbFunctionType dbfunctionType,
            [NotNull] string operationName,
            [NotNull] IEnumerable <KeyValuePair <string, object> > parameters,
            [CanBeNull] out object result,
            IDbTransaction transaction = null)
        {
            if (this.IsSupportedOperation(operationName))
            {
                this._sqlMessages.Clear();

                var createdTransaction = transaction == null;

                try
                {
                    if (transaction == null)
                    {
                        transaction = this.DbAccess.BeginTransaction();
                    }

                    if (transaction.Connection is SqlConnection)
                    {
                        var sqlConnection = transaction.Connection as SqlConnection;
                        sqlConnection.FireInfoMessageEventOnUserErrors = true;
                        sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(this.sqlConnection_InfoMessage);

                        var operationSuccessful = this.RunOperation(
                            sqlConnection,
                            transaction,
                            dbfunctionType,
                            operationName,
                            parameters,
                            out result);

                        if (createdTransaction && operationSuccessful)
                        {
                            transaction.Commit();
                        }

                        return(operationSuccessful);
                    }
                }
                finally
                {
                    if (createdTransaction && transaction != null)
                    {
                        transaction.Dispose();
                    }
                }
            }

            result = null;

            return(false);
        }
Example #11
0
        /// <summary>
        /// 检查是否支持函数
        /// </summary>
        /// <param name="providerName">数据库提供器名</param>
        /// <param name="dbFunctionType">数据库函数类型</param>
        internal static void CheckFunctionSupported(string providerName, DbFunctionType dbFunctionType)
        {
            if (NotSupportFunctionDatabases.Contains(providerName))
            {
                throw Oops.Oh(NotSupportException, typeof(NotSupportedException), "function");
            }

            if (dbFunctionType == DbFunctionType.Table && NotSupportTableFunctionDatabases.Contains(providerName))
            {
                throw Oops.Oh(NotSupportException, typeof(NotSupportedException), "table function");
            }
        }
Example #12
0
        /// <summary>
        /// The run filters.
        /// </summary>
        /// <param name="functionType">
        /// The function type.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <param name="operationName">
        /// The operation name.
        /// </param>
        /// <param name="result">
        /// The result.
        /// </param>
        private void RunFilters(DbFunctionType functionType, IList <KeyValuePair <string, object> > parameters, string operationName, ref object result)
        {
            // execute filter...
            var filterFunctions = this._serviceLocator.Get <IEnumerable <IDbDataFilter> >()
                                  .BySortOrder()
                                  .WhereOperationSupported(operationName)
                                  .ToList();

            foreach (var filter in filterFunctions)
            {
                filter.Run(functionType, operationName, parameters, result);
            }
        }
Example #13
0
        /// <summary>
        /// The execute.
        /// </summary>
        /// <param name="dbfunctionType">
        /// The dbfunction type.
        /// </param>
        /// <param name="operationName">
        /// The operation name.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <param name="result">
        /// The result.
        /// </param>
        /// <returns>
        /// The <see cref="bool"/> .
        /// </returns>
        public bool Execute(DbFunctionType dbfunctionType, string operationName, IEnumerable <KeyValuePair <string, object> > parameters, out object result)
        {
            // find operation...
            var method = this._methods.FirstOrDefault(x => string.Equals(x.Key.Name, operationName, StringComparison.OrdinalIgnoreCase));

            if (method.IsDefault())
            {
                result = null;

                return(false);
            }

            var mappedParameters = new List <object>();

            var incomingParameters = parameters.ToList();
            var incomingIndex      = 0;

            // match up parameters...
            foreach (var param in method.Value)
            {
                if (param.ParameterType == typeof(IDbFunction))
                {
                    // put the db function in...
                    mappedParameters.Add(this.DbFunction);

                    continue;
                }

                ParameterInfo param1           = param;
                var           matchedNameParam = incomingParameters.FirstOrDefault(x => x.Key == param1.Name);

                if (matchedNameParam.IsNotDefault())
                {
                    // use this named parameter...
                    mappedParameters.Add(matchedNameParam.Value);
                }
                else if (incomingIndex < incomingParameters.Count)
                {
                    // just use the indexed value of...
                    mappedParameters.Add(incomingParameters[incomingIndex++].Value);
                }
            }

            // execute the method...
            result = method.Key.Invoke(null, mappedParameters.ToArray());

            return(true);
        }
Example #14
0
        /// <summary>
        /// The run.
        /// </summary>
        /// <param name="dbfunctionType">
        /// The dbfunction type.
        /// </param>
        /// <param name="operationName">
        /// The operation name.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <param name="data">
        /// The data.
        /// </param>
        public void Run(DbFunctionType dbfunctionType, string operationName, IEnumerable<KeyValuePair<string, object>> parameters, object data)
        {
            if (!this.ServiceLocator.IsYafContext() || !this._styledNickOperations.Contains(operationName.ToLower()) || dbfunctionType != DbFunctionType.DataTable)
            {
                return;
            }

            var colorOnly = false;

            if (!this.BoardSettings.UseStyledNicks)
            {
                return;
            }

            var dataTable = (DataTable)data;
            this.StyleTransform.DecodeStyleByTable(dataTable, false);
        }
Example #15
0
        /// <summary>
        /// The db function execute.
        /// </summary>
        /// <param name="functionType">
        /// The function Type.
        /// </param>
        /// <param name="binder">
        /// The binder.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <param name="executeDb">
        /// The execute db.
        /// </param>
        /// <param name="result">
        /// The result.
        /// </param>
        /// <returns>
        /// The db function execute.
        /// </returns>
        protected bool DbFunctionExecute(
            DbFunctionType functionType,
            [NotNull] InvokeMemberBinder binder,
            [NotNull] IList <KeyValuePair <string, object> > parameters,
            [NotNull] Func <IDbCommand, object> executeDb,
            [CanBeNull] out object result)
        {
            CodeContracts.VerifyNotNull(binder, "binder");
            CodeContracts.VerifyNotNull(parameters, "parameters");
            CodeContracts.VerifyNotNull(executeDb, "executeDb");

            var operationName = binder.Name;

            // see if there's a specific function override for the current provider...
            var specificFunction = this.DbSpecificFunctions
                                   .WhereOperationSupported(operationName)
                                   .FirstOrDefault();

            result = null;

            if (specificFunction != null)
            {
                if (!specificFunction.Execute(functionType, operationName, parameters, out result, this.DbTransaction))
                {
                    // unsuccessful -- execute command below
                    specificFunction = null;
                }
            }

            if (specificFunction == null)
            {
                using (var cmd = this._dbAccessProvider.Instance.GetCommand(operationName, CommandType.StoredProcedure, parameters))
                {
                    result = executeDb(cmd);
                }
            }

            this.RunFilters(functionType, parameters, operationName, ref result);

            return(true);
        }
Example #16
0
        /// <summary>
        /// 生成函数执行 sql 语句
        /// </summary>
        ///<param name="providerName">ADO.NET 数据库对象</param>
        /// <param name="dbFunctionType">函数类型</param>
        /// <param name="funcName">函数名词</param>
        /// <param name="model">参数模型</param>
        /// <returns>(string sql, DbParameter[] parameters)</returns>
        internal static string GenerateFunctionSql(string providerName, DbFunctionType dbFunctionType, string funcName, object model)
        {
            // 检查是否支持函数
            DbProvider.CheckFunctionSupported(providerName, dbFunctionType);

            var modelType = model?.GetType();

            // 处理字典类型参数
            if (modelType == typeof(Dictionary <string, object>))
            {
                return(GenerateFunctionSql(providerName, dbFunctionType, funcName, (Dictionary <string, object>)model));
            }

            // 获取模型所有公开的属性
            var properities = model == null
                ? Array.Empty <PropertyInfo>()
                : modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            // 生成数据库表值函数 sql
            return(GenerateDbFunctionSql(providerName, dbFunctionType, funcName, properities.Select(u => u.Name).ToArray()));
        }
Example #17
0
        /// <summary>
        /// 生成函数执行 sql 语句
        /// </summary>
        ///<param name="providerName">ADO.NET 数据库对象</param>
        /// <param name="dbFunctionType">函数类型</param>
        /// <param name="funcName">函数名词</param>
        /// <param name="model">参数模型</param>
        /// <returns>(string sql, DbParameter[] parameters)</returns>
        internal static string GenerateFunctionSql(string providerName, DbFunctionType dbFunctionType, string funcName, object model)
        {
            // 检查是否支持函数
            DatabaseProvider.CheckFunctionSupported(providerName, dbFunctionType);

            var modelType = model?.GetType();

            // 处理字典类型参数
            if (modelType == typeof(Dictionary <string, object>))
            {
                return(GenerateFunctionSql(providerName, dbFunctionType, funcName, (Dictionary <string, object>)model));
            }

            // 获取模型所有公开的属性
            var properities = model == null
                ? Array.Empty <PropertyInfo>()
                : modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            var stringBuilder = new StringBuilder();

            stringBuilder.Append($"SELECT{(dbFunctionType == DbFunctionType.Table ? " * FROM" : "")} {funcName}(");

            for (var i = 0; i < properities.Length; i++)
            {
                var property = properities[i];

                stringBuilder.Append($"@{property.Name}");

                // 处理最后一个参数逗号
                if (i != properities.Length - 1)
                {
                    stringBuilder.Append(", ");
                }
            }

            stringBuilder.Append("); ");

            return(stringBuilder.ToString());
        }
Example #18
0
		/// <summary>
		/// The execute.
		/// </summary>
		/// <param name="dbfunctionType">
		/// The dbfunction type.
		/// </param>
		/// <param name="operationName">
		/// The operation name.
		/// </param>
		/// <param name="parameters">
		/// The parameters.
		/// </param>
		/// <param name="result">
		/// The result.
		/// </param>
		/// <returns>
		/// The execute.
		/// </returns>
		public virtual bool Execute(
			DbFunctionType dbfunctionType, 
			[NotNull] string operationName, 
			[NotNull] IEnumerable<KeyValuePair<string, object>> parameters, 
			[CanBeNull] out object result)
		{
			if (this.IsSupportedOperation(operationName))
			{
				this._sqlMessages.Clear();

				using (var dbTransaction = this.DbAccess.BeginTransaction())
				{
					if (dbTransaction.Connection is SqlConnection)
					{
						var sqlConnection = dbTransaction.Connection as SqlConnection;
						sqlConnection.FireInfoMessageEventOnUserErrors = true;
						sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(this.sqlConnection_InfoMessage);

						return this.RunOperation(sqlConnection, dbTransaction, dbfunctionType, operationName, parameters, out result);
					}
				}
			}

			result = null;

			return false;
		}
Example #19
0
        /// <summary>
        /// 生成函数执行 sql 语句
        /// </summary>
        ///<param name="providerName">ADO.NET 数据库对象</param>
        /// <param name="dbFunctionType">函数类型</param>
        /// <param name="funcName">函数名词</param>
        /// <param name="model">参数模型</param>
        /// <returns>(string sql, SqlParameter[] parameters)</returns>
        internal static (string sql, SqlParameter[] parameters) CombineFunctionSql(string providerName, DbFunctionType dbFunctionType, string funcName, object model)
        {
            // 检查是否支持函数
            DatabaseProvider.CheckFunctionSupported(providerName, dbFunctionType);

            // 获取模型所有公开的属性
            var properities = model == null
                ? Array.Empty <PropertyInfo>()
                : model.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            var parameters    = new List <SqlParameter>();
            var stringBuilder = new StringBuilder();

            stringBuilder.Append($"SELECT{(dbFunctionType == DbFunctionType.Table ? " * FROM" : "")} {funcName}(");

            for (var i = 0; i < properities.Length; i++)
            {
                var property      = properities[i];
                var propertyValue = property.GetValue(model) ?? DBNull.Value;

                stringBuilder.Append($"@{property.Name}");

                // 处理最后一个参数逗号
                if (i != properities.Length - 1)
                {
                    stringBuilder.Append(", ");
                }

                // 判断属性是否贴有 [DbParameter] 特性
                if (property.IsDefined(typeof(DbParameterAttribute), true))
                {
                    var dbParameterAttribute = property.GetCustomAttribute <DbParameterAttribute>(true);
                    parameters.Add(DbHelpers.CreateSqlParameter(property.Name, propertyValue, dbParameterAttribute));
                    continue;
                }
                parameters.Add(new SqlParameter(property.Name, propertyValue));
            }

            stringBuilder.Append("); ");

            return(stringBuilder.ToString(), parameters.ToArray());
        }
Example #20
0
 public abstract string ConvertDbFunction(DbFunctionType functionType, params object[] parameters);
        public override string ConvertDbFunction(DbFunctionType functionType, params object[] parameters)
        {
            string result = "''";
            object param0 = parameters[0];



            if (functionType == DbFunctionType.Length)
            {
                result = "LENGTH(" + param0 + ")";
            }
            //模糊搜索
            else if (functionType == DbFunctionType.StartsWith)
            {
                result = param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.EndsWith)
            {
                result = "'%' || " + param0;
            }
            else if (functionType == DbFunctionType.Contains)
            {
                result = "'%' || " + param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.LikeRight)
            {
                result = param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.LikeLeft)
            {
                result = "'%' || " + param0;
            }
            else if (functionType == DbFunctionType.Like)
            {
                result = "'%' || " + param0 + " || '%'";
            }
            //转换
            else if (functionType == DbFunctionType.ToUpper)
            {
                result = "UPPER(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.ToLower)
            {
                result = "LOWER(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Trim)
            {
                result = "TRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.TrimEnd)
            {
                result = "RTRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.TrimStart)
            {
                result = "LTRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Substring)
            {
                result = "SUBSTR(" + param0;

                if (parameters.Length > 1)
                {
                    result += "," + parameters[1] + "+1";
                }
                ///截取长度
                if (parameters.Length > 2)
                {
                    result += "," + parameters[2];
                }
                else
                {
                    result += "," + ConvertDbFunction(DbFunctionType.Length, param0);
                }
                result += (")");
            }
            else if (functionType == DbFunctionType.IsNullOrEmpty)
            {
                result = "(" + param0 + " IS NULL OR " + param0 + "= '')";
            }
            else if (functionType == DbFunctionType.Parse)
            {
                Type type = parameters[1] as Type;
                result = ConvertSqlValue(param0, type);
            }
            else if (functionType == DbFunctionType.NewGuid)
            {
                //返回的是一个长度为 16 的 byte[]
                //// "SYS_GUID()";
                result = "(substr(lower(RAWTOHEX(sys_guid())),1,8) || '-'||substr(lower(RAWTOHEX(sys_guid())),9,4) || '-' || substr(lower(RAWTOHEX(sys_guid())),13,4) || '-' || substr(lower(RAWTOHEX(sys_guid())),17,4) || '-' || substr(lower(RAWTOHEX(sys_guid())),21,12))";
            }
            //聚合函数
            else if (functionType == DbFunctionType.Count)
            {
                result = "COUNT(1)";
            }
            else if (functionType == DbFunctionType.Sum)
            {
                result = "SUM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Max)
            {
                result = "MAX(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Min)
            {
                result = "MIN(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Avg)
            {
                result = "AVG(" + param0 + ")";
            }
            //数学函数
            else if (functionType == DbFunctionType.Abs)
            {
                result  = ("ABS(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Round)
            {
                object precision = 2;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("ROUND(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Ceiling)
            {
                result  = ("CEIL(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Floor)
            {
                result  = ("FLOOR(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Sqrt)
            {
                result  = ("SQRT(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Log)
            {
                object precision = 10;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("LOG(");
                result += (precision);
                result += (",");
                result += (param0);

                result += (")");
            }
            else if (functionType == DbFunctionType.Pow)
            {
                object precision = 10;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("POWER(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Sign)
            {
                result  = ("SIGN(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Truncate)
            {
                object precision = 0;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("TRUNC(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Mod)
            {
                object precision = 2;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("MOD(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Rand)
            {
                result = ("DBMS_RANDOM.VALUE");
            }
            else if (functionType == DbFunctionType.IfNull)
            {
                result = ("NVL(" + param0 + "," + parameters[1] + ")");
            }
            //Add DateTime 函数
            else if (functionType == DbFunctionType.AddYears)
            {
                /* add_months(systimestamp,12 * 2) */
                result  = ("ADD_MONTHS(");
                result += param0;
                result += (",12 * ");
                result += (parameters[1]);
                result += (")");
            }
            else if (functionType == DbFunctionType.AddMonths)
            {
                /* add_months(systimestamp,2) */

                result  = ("ADD_MONTHS(");
                result += param0;
                result += (",");
                result += (parameters[1]);
                result += (")");
            }
            else if (functionType == DbFunctionType.AddDays)
            {
                /* (systimestamp + 3) */

                result  = ("(");
                result += param0;
                result += (" + ");
                result += (parameters[1]);
                result += (")");
            }
            else if (functionType == DbFunctionType.AddHours)
            {
                result = DbFunction_DATEADD("HOUR", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddMinutes)
            {
                result = DbFunction_DATEADD("MINUTE", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddSeconds)
            {
                result = DbFunction_DATEADD("SECOND", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddMilliseconds)
            {
                throw new NotSupportedException("ORACLE is not supports DbFunctionType.AddMilliseconds");
                //result = DbFunction_DATEADD("MILLISECOND", param0, parameters[1]);
            }
            //diff datetime
            else if (functionType == DbFunctionType.DiffYears)
            {
                result = DbFunction_DATEDIFF("YEAR", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMonths)
            {
                result = DbFunction_DATEDIFF("MONTH", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffDays)
            {
                result = DbFunction_DATEDIFF("DAY", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffHours)
            {
                result = DbFunction_DATEDIFF("HOUR", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMinutes)
            {
                result = DbFunction_DATEDIFF("MINUTE", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffSeconds)
            {
                result = DbFunction_DATEDIFF("SECOND", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMilliseconds)
            {
                result = DbFunction_DATEDIFF("MILLISECOND", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMicroseconds)
            {
                result = DbFunction_DATEDIFF("MICROSECOND", param0, parameters[1]);
            }
            return(result);
        }
Example #22
0
        /// <summary>
        /// Handle the run operation.
        /// </summary>
        /// <param name="sqlConnection"></param>
        /// <param name="dbTransaction"></param>
        /// <param name="dbfunctionType"></param>
        /// <param name="operationName"></param>
        /// <param name="parameters"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        protected override bool RunOperation(
            SqlConnection sqlConnection,
            IDbTransaction dbTransaction,
            DbFunctionType dbfunctionType,
            string operationName,
            IEnumerable <KeyValuePair <string, object> > parameters,
            out object result)
        {
            // find operation...
            var method = this._methods.FirstOrDefault(x => string.Equals(x.Key.Name, operationName, StringComparison.OrdinalIgnoreCase));

            if (method.IsDefault())
            {
                result = null;

                return(false);
            }

            var mappedParameters = new List <object>();

            var globalParams = new Dictionary <Type, object>()
            {
                { typeof(IDbTransaction), dbTransaction },
                { typeof(SqlConnection), sqlConnection },
                { typeof(DbFunctionType), dbfunctionType },
                { typeof(IDbAccess), this.DbAccess }
            };

            var incomingParameters = parameters.ToList();
            var incomingIndex      = 0;

            // match up parameters...
            foreach (var param in method.Value)
            {
                var global = globalParams.FirstOrDefault(p => p.Key == param.ParameterType);
                if (global.IsNotDefault())
                {
                    mappedParameters.Add(global.Value);
                    continue;
                }

                var param1           = param;
                var matchedNameParam = incomingParameters.FirstOrDefault(x => x.Key == param1.Name);

                if (matchedNameParam.IsNotDefault())
                {
                    // use this named parameter...
                    mappedParameters.Add(matchedNameParam.Value);
                }
                else if (incomingIndex < incomingParameters.Count)
                {
                    // just use the indexed value of...
                    mappedParameters.Add(incomingParameters[incomingIndex++].Value);
                }
            }

            // execute the method...
            result = method.Key.Invoke(null, mappedParameters.ToArray());

            return(true);
        }
Example #23
0
        /// <summary>
        /// The db function execute.
        /// </summary>
        /// <param name="functionType">
        /// The function Type. 
        /// </param>
        /// <param name="binder">
        /// The binder. 
        /// </param>
        /// <param name="parameters">
        /// The parameters. 
        /// </param>
        /// <param name="executeDb">
        /// The execute db. 
        /// </param>
        /// <param name="result">
        /// The result. 
        /// </param>
        /// <returns>
        /// The db function execute. 
        /// </returns>
        protected bool DbFunctionExecute(
            DbFunctionType functionType, 
            [NotNull] InvokeMemberBinder binder, 
            [NotNull] IList<KeyValuePair<string, object>> parameters, 
            [NotNull] Func<DbCommand, object> executeDb, 
            [CanBeNull] out object result)
        {
            CodeContracts.ArgumentNotNull(binder, "binder");
            CodeContracts.ArgumentNotNull(parameters, "parameters");
            CodeContracts.ArgumentNotNull(executeDb, "executeDb");

            var operationName = binder.Name;

            // see if there's a specific function override for the current provider...
            var specificFunction = this._dbSpecificFunctions
                .GetForProviderAndOperation(this._dbAccessProvider.ProviderName, operationName)
                .FirstOrDefault();

            if (specificFunction == null)
            {
                throw new NotSupportedException(
                    string.Format("Operation: [{0}] Is not Supported for Provider: [{1}]", operationName, this._dbAccessProvider.ProviderName));
            }

            if (specificFunction.Execute(functionType, operationName, parameters, out result))
            {
                return true;
            }

            using (var cmd = this._dbAccessProvider.Instance.GetCommand(operationName.ToLower(), true, parameters))
            {
                result = executeDb(cmd);
            }

            return true;
        }
Example #24
0
	    /// <summary>
	    /// The execute.
	    /// </summary>
	    /// <param name="dbfunctionType">
	    /// The dbfunction type.
	    /// </param>
	    /// <param name="operationName">
	    /// The operation name.
	    /// </param>
	    /// <param name="parameters">
	    /// The parameters.
	    /// </param>
	    /// <param name="result">
	    /// The result.
	    /// </param>
	    /// <param name="transaction"></param>
	    /// <returns>
	    /// The execute.
	    /// </returns>
	    public virtual bool Execute(
			DbFunctionType dbfunctionType, 
			[NotNull] string operationName, 
			[NotNull] IEnumerable<KeyValuePair<string, object>> parameters, 
			[CanBeNull] out object result,
            IDbTransaction transaction = null)
		{
			if (this.IsSupportedOperation(operationName))
			{
				this._sqlMessages.Clear();

			    bool createdTransaction = transaction == null;

			    try
			    {
                    if (transaction == null)
                    {
                        transaction = this.DbAccess.BeginTransaction();
                    }

                    if (transaction.Connection is SqlConnection)
                    {
                        var sqlConnection = transaction.Connection as SqlConnection;
                        sqlConnection.FireInfoMessageEventOnUserErrors = true;
                        sqlConnection.InfoMessage += new SqlInfoMessageEventHandler(this.sqlConnection_InfoMessage);

                        var operationSuccessful = this.RunOperation(sqlConnection, transaction, dbfunctionType, operationName, parameters, out result);

                        if (createdTransaction && operationSuccessful)
                        {
                            transaction.Commit();
                        }

                        return operationSuccessful;
                    }
			    }
			    finally
			    {
                    if (createdTransaction && transaction != null)
			        {
                        transaction.Dispose();
			        }
			    }
			}

			result = null;

			return false;
		}
        /// <summary>
        /// Handle the run operation.
        /// </summary>
        /// <param name="sqlConnection"></param>
        /// <param name="dbTransaction"></param>
        /// <param name="dbfunctionType"></param>
        /// <param name="operationName"></param>
        /// <param name="parameters"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        protected override bool RunOperation(
            SqlConnection sqlConnection,
            IDbTransaction dbTransaction,
            DbFunctionType dbfunctionType,
            string operationName,
            IEnumerable<KeyValuePair<string, object>> parameters,
            out object result)
        {
            // find operation...
            var method = this._methods.FirstOrDefault(x => string.Equals(x.Key.Name, operationName, StringComparison.OrdinalIgnoreCase));

            if (method.IsDefault())
            {
                result = null;

                return false;
            }

            var mappedParameters = new List<object>();

            var globalParams = new Dictionary<Type, object>()
                               {
                                   { typeof(IDbTransaction), dbTransaction },
                                   { typeof(SqlConnection), sqlConnection },
                                   { typeof(DbFunctionType), dbfunctionType },
                                   { typeof(IDbAccess), this.DbAccess }
                               };

            var incomingParameters = parameters.ToList();
            var incomingIndex = 0;

            // match up parameters...
            foreach (var param in method.Value)
            {
                var global = globalParams.FirstOrDefault(p => p.Key == param.ParameterType);
                if (global.IsNotDefault())
                {
                    mappedParameters.Add(global.Value);
                    continue;
                }

                ParameterInfo param1 = param;
                var matchedNameParam = incomingParameters.FirstOrDefault(x => x.Key == param1.Name);

                if (matchedNameParam.IsNotDefault())
                {
                    // use this named parameter...
                    mappedParameters.Add(matchedNameParam.Value);
                }
                else if (incomingIndex < incomingParameters.Count)
                {
                    // just use the indexed value of...
                    mappedParameters.Add(incomingParameters[incomingIndex++].Value);
                }
            }

            // execute the method...
            result = method.Key.Invoke(null, mappedParameters.ToArray());

            return true;
        }
Example #26
0
        public override string ConvertDbFunction(DbFunctionType functionType, params object[] parameters)
        {
            string result = "''";
            object param0 = parameters[0];

            if (functionType == DbFunctionType.Length)
            {
                result = "LENGTH(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.StartsWith)
            {
                result = param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.EndsWith)
            {
                result = "'%' || " + param0;
            }
            else if (functionType == DbFunctionType.Contains)
            {
                result = "'%' || " + param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.LikeRight)
            {
                result = param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.LikeLeft)
            {
                result = "'%' || " + param0;
            }
            else if (functionType == DbFunctionType.Like)
            {
                result = "'%' || " + param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.ToUpper)
            {
                result = "UPPER(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.ToLower)
            {
                result = "LOWER(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Trim)
            {
                result = "TRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.TrimEnd)
            {
                result = "RTRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.TrimStart)
            {
                result = "LTRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Substring)
            {
                result = "SUBSTR(" + param0;

                if (parameters.Length > 1)
                {
                    result += "," + parameters[1] + "+1";
                }
                ///截取长度
                if (parameters.Length > 2)
                {
                    result += "," + parameters[2];
                }
                else
                {
                    result += "," + ConvertDbFunction(DbFunctionType.Length, param0);
                }
                result += (")");
            }
            else if (functionType == DbFunctionType.IsNullOrEmpty)
            {
                result = "(" + param0 + " IS NULL OR " + param0 + "= '')";
            }
            else if (functionType == DbFunctionType.Parse)
            {
                Type type = parameters[1] as Type;
                result = ConvertSqlValue(param0, type);
            }
            else if (functionType == DbFunctionType.NewGuid)
            {
                throw new NotSupportedException("PostgreSQL is not supports DbFunctionType.NewGuid ");
            }
            //聚合函数
            else if (functionType == DbFunctionType.Count)
            {
                result = "COUNT(1)";
            }
            else if (functionType == DbFunctionType.Sum)
            {
                result = "SUM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Max)
            {
                result = "MAX(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Min)
            {
                result = "MIN(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Avg)
            {
                result = "AVG(" + param0 + ")";
            }
            //数学函数
            else if (functionType == DbFunctionType.Abs)
            {
                result  = ("ABS(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Round)
            {
                object precision = 2;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("ROUND(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Ceiling)
            {
                result  = ("CEIL(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Floor)
            {
                result  = ("FLOOR(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Sqrt)
            {
                result  = ("SQRT(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Log)
            {
                object precision = 10;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("LOG(");
                result += (precision);
                result += (",");
                result += (param0);

                result += (")");
            }
            else if (functionType == DbFunctionType.Pow)
            {
                object precision = 10;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("POWER(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Sign)
            {
                result  = ("SIGN(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Truncate)
            {
                object precision = 0;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("TRUNC(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Mod)
            {
                object precision = 2;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("MOD(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Rand)
            {
                result = ("RANDOM()");
            }
            else if (functionType == DbFunctionType.IfNull)
            {
                result = ("COALESCE(" + param0 + "," + parameters[1] + ")");
            }
            //Add DateTime 函数
            else if (functionType == DbFunctionType.AddYears)
            {
                result = DbFunction_DATEADD("YEAR", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddMonths)
            {
                result = DbFunction_DATEADD("MONTH", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddDays)
            {
                result = DbFunction_DATEADD("DAY", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddHours)
            {
                result = DbFunction_DATEADD("HOUR", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddMinutes)
            {
                result = DbFunction_DATEADD("MINUTE", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddSeconds)
            {
                result = DbFunction_DATEADD("SECOND", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddMilliseconds)
            {
                result = DbFunction_DATEADD("MILLISECOND", param0, parameters[1]);
            }
            //diff datetime
            else if (functionType == DbFunctionType.DiffYears)
            {
                result = DbFunction_DATEDIFF("YEAR", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMonths)
            {
                result = DbFunction_DATEDIFF("MONTH", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffDays)
            {
                result = DbFunction_DATEDIFF("DAY", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffHours)
            {
                result = DbFunction_DATEDIFF("HOUR", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMinutes)
            {
                result = DbFunction_DATEDIFF("MINUTE", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffSeconds)
            {
                result = DbFunction_DATEDIFF("SECOND", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMilliseconds)
            {
                result = DbFunction_DATEDIFF("MILLISECOND", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMicroseconds)
            {
                result = DbFunction_DATEDIFF("MICROSECOND", param0, parameters[1]);
            }
            return(result);
        }
Example #27
0
        /// <summary>
        /// The run.
        /// </summary>
        /// <param name="dbfunctionType">
        /// The dbfunction type.
        /// </param>
        /// <param name="operationName">
        /// The operation name.
        /// </param>
        /// <param name="parameters">
        /// The parameters.
        /// </param>
        /// <param name="data">
        /// The data.
        /// </param>
        public void Run(DbFunctionType dbfunctionType, string operationName, IEnumerable<KeyValuePair<string, object>> parameters, object data)
        {
            if (!this.ServiceLocator.IsYafContext() || !this._styledNickOperations.Contains(operationName.ToLower()) || dbfunctionType != DbFunctionType.DataTable)
            {
                return;
            }

            bool colorOnly = false;

            if (!this.BoardSettings.UseStyledNicks)
            {
                return;
            }

            var dataTable = (DataTable)data;
            this.StyleTransform.DecodeStyleByTable(dataTable, colorOnly);
        }
        /// <summary>
        /// The execute.
        /// </summary>
        /// <param name="dbfunctionType">
        /// The dbfunction type. 
        /// </param>
        /// <param name="operationName">
        /// The operation name. 
        /// </param>
        /// <param name="parameters">
        /// The parameters. 
        /// </param>
        /// <param name="result">
        /// The result. 
        /// </param>
        /// <returns>
        /// The <see cref="bool"/> . 
        /// </returns>
        public bool Execute(DbFunctionType dbfunctionType, string operationName, IEnumerable<KeyValuePair<string, object>> parameters, out object result)
        {
            // find operation...
            var method = this._methods.FirstOrDefault(x => string.Equals(x.Key.Name, operationName, StringComparison.OrdinalIgnoreCase));

            if (method.IsDefault())
            {
                result = null;

                return false;
            }

            var mappedParameters = new List<object>();

            var incomingParameters = parameters.ToList();
            var incomingIndex = 0;

            // match up parameters...
            foreach (var param in method.Value)
            {
                if (param.ParameterType == typeof(IDbFunction))
                {
                    // put the db function in...
                    mappedParameters.Add(this.DbFunction);

                    continue;
                }

                ParameterInfo param1 = param;
                var matchedNameParam = incomingParameters.FirstOrDefault(x => x.Key == param1.Name);

                if (matchedNameParam.IsNotDefault())
                {
                    // use this named parameter...
                    mappedParameters.Add(matchedNameParam.Value);
                }
                else if (incomingIndex < incomingParameters.Count)
                {
                    // just use the indexed value of...
                    mappedParameters.Add(incomingParameters[incomingIndex++].Value);
                }
            }

            // execute the method...
            result = method.Key.Invoke(null, mappedParameters.ToArray());

            return true;
        }
Example #29
0
		/// <summary>
		/// The run operation.
		/// </summary>
		/// <param name="sqlConnection">
		/// The sql connection.
		/// </param>
		/// <param name="dbTransaction">
		/// The db unit of work.
		/// </param>
		/// <param name="dbfunctionType">
		/// The dbfunction type.
		/// </param>
		/// <param name="operationName">
		/// The operation name.
		/// </param>
		/// <param name="parameters">
		/// The parameters.
		/// </param>
		/// <param name="result">
		/// The result.
		/// </param>
		/// <returns>
		/// The run operation.
		/// </returns>
		protected override bool RunOperation(
			SqlConnection sqlConnection, 
			IDbTransaction dbTransaction, 
			DbFunctionType dbfunctionType, 
			string operationName, 
			IEnumerable<KeyValuePair<string, object>> parameters, 
			out object result)
		{
			// create statistic SQL...
			var sb = new StringBuilder();

			sb.AppendLine("DECLARE @TableName sysname");
			sb.AppendLine("DECLARE cur_showfragmentation CURSOR FOR");
			sb.AppendLine("SELECT table_name FROM information_schema.tables WHERE table_type = 'base table' AND table_name LIKE '{objectQualifier}%'");
			sb.AppendLine("OPEN cur_showfragmentation");
			sb.AppendLine("FETCH NEXT FROM cur_showfragmentation INTO @TableName");
			sb.AppendLine("WHILE @@FETCH_STATUS = 0");
			sb.AppendLine("BEGIN");
			sb.AppendLine("DBCC SHOWCONTIG (@TableName)");
			sb.AppendLine("FETCH NEXT FROM cur_showfragmentation INTO @TableName");
			sb.AppendLine("END");
			sb.AppendLine("CLOSE cur_showfragmentation");
			sb.AppendLine("DEALLOCATE cur_showfragmentation");

            using (var cmd = this.DbAccess.GetCommand(sb.ToString(), CommandType.Text))
			{
				this.DbAccess.ExecuteNonQuery(cmd, dbTransaction);
			}

		    result = this._sqlMessages.Select(s => s.Message).ToDelimitedString("\r\n");

			return true;
		}
Example #30
0
		/// <summary>
		/// The run operation.
		/// </summary>
		/// <param name="sqlConnection">
		/// The sql connection.
		/// </param>
		/// <param name="dbTransaction">
		/// The unit Of Work.
		/// </param>
		/// <param name="dbfunctionType">
		/// The dbfunction type.
		/// </param>
		/// <param name="operationName">
		/// The operation name.
		/// </param>
		/// <param name="parameters">
		/// The parameters.
		/// </param>
		/// <param name="result">
		/// The result.
		/// </param>
		/// <returns>
		/// The run operation.
		/// </returns>
		protected abstract bool RunOperation(
			[NotNull] SqlConnection sqlConnection,
            [NotNull] IDbTransaction dbTransaction, 
			DbFunctionType dbfunctionType, 
			[NotNull] string operationName, 
			[NotNull] IEnumerable<KeyValuePair<string, object>> parameters, 
			[CanBeNull] out object result);
        public override string ConvertDbFunction(DbFunctionType functionType, params object[] parameters)
        {
            string result = "''";
            object param0 = parameters[0];

            if (functionType == DbFunctionType.Length)
            {
                result = "LENGTH(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.StartsWith)
            {
                result = param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.EndsWith)
            {
                result = "'%' || " + param0;
            }
            else if (functionType == DbFunctionType.Contains)
            {
                result = "'%' || " + param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.LikeRight)
            {
                result = param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.LikeLeft)
            {
                result = "'%' || " + param0;
            }
            else if (functionType == DbFunctionType.Like)
            {
                result = "'%' || " + param0 + " || '%'";
            }
            else if (functionType == DbFunctionType.ToUpper)
            {
                result = "UPPER(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.ToLower)
            {
                result = "LOWER(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Trim)
            {
                result = "TRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.TrimEnd)
            {
                result = "RTRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.TrimStart)
            {
                result = "LTRIM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Substring)
            {
                result = "SUBSTR(" + param0;

                if (parameters.Length > 1)
                {
                    result += "," + parameters[1] + "+1";
                }
                ///截取长度
                if (parameters.Length > 2)
                {
                    result += "," + parameters[2];
                }
                else
                {
                    result += "," + ConvertDbFunction(DbFunctionType.Length, param0);
                }
                result += (")");
            }
            else if (functionType == DbFunctionType.IsNullOrEmpty)
            {
                result = "(" + param0 + " IS NULL OR " + param0 + "= '')";
            }
            else if (functionType == DbFunctionType.Parse)
            {
                Type type = parameters[1] as Type;
                result = ConvertSqlValue(param0, type);
            }
            else if (functionType == DbFunctionType.NewGuid)
            {
                throw new NotSupportedException("SQLite is not supports DbFunctionType.NewGuid");
            }
            //聚合函数
            else if (functionType == DbFunctionType.Count)
            {
                result = "COUNT(1)";
            }
            else if (functionType == DbFunctionType.Sum)
            {
                result = "SUM(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Max)
            {
                result = "MAX(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Min)
            {
                result = "MIN(" + param0 + ")";
            }
            else if (functionType == DbFunctionType.Avg)
            {
                result = "AVG(" + param0 + ")";
            }
            //数学函数
            else if (functionType == DbFunctionType.Abs)
            {
                result  = ("ABS(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Round)
            {
                object precision = 2;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("ROUND(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Ceiling)
            {
                result  = ("CEIL(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Floor)
            {
                result  = ("FLOOR(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Sqrt)
            {
                result  = ("SQRT(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Log)
            {
                //throw new NotSupportedException("SQLite is not supports DbFunctionType.NewGuid");

                //object precision = 10;
                //if (parameters.Length > 1 && parameters[1] != null)
                //{
                //    precision = parameters[1];
                //}
                result  = ("LOG(");
                result += (param0);

                result += (")");
            }
            else if (functionType == DbFunctionType.Pow)
            {
                object precision = 10;
                if (parameters.Length > 1 && parameters[1] != null)
                {
                    precision = parameters[1];
                }
                result  = ("POWER(");
                result += (param0);
                result += (",");
                result += (precision);

                result += (")");
            }
            else if (functionType == DbFunctionType.Sign)
            {
                result  = ("SIGN(");
                result += (param0);
                result += (")");
            }
            else if (functionType == DbFunctionType.Truncate)
            {
                throw new NotSupportedException("SQLite is not supports DbFunctionType.Truncate");

                //object precision = 0;
                //if (parameters.Length > 1 && parameters[1] != null)
                //{
                //    precision = parameters[1];
                //}
                //result = ("TRUNCATE(");
                //result += (param0);
                //result += (",");
                //result += (precision);

                //result += (")");
            }
            else if (functionType == DbFunctionType.Mod)
            {
                throw new NotSupportedException("SQLite is not supports DbFunctionType.Mod");
                //object precision = 2;
                //if (parameters.Length > 1 && parameters[1] != null)
                //{
                //    precision = parameters[1];
                //}
                //result = ("MOD(");
                //result += (param0);
                //result += (",");
                //result += (precision);

                //result += (")");
            }
            else if (functionType == DbFunctionType.Rand)
            {
                result = ("RANDOM()");
            }
            else if (functionType == DbFunctionType.IfNull)
            {
                result = ("IFNULL(" + param0 + "," + parameters[1] + ")");
            }
            //Add DateTime 函数
            else if (functionType == DbFunctionType.AddYears)
            {
                result = DbFunction_DATEADD("years", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddMonths)
            {
                result = DbFunction_DATEADD("months", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddDays)
            {
                result = DbFunction_DATEADD("days", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddHours)
            {
                result = DbFunction_DATEADD("hours", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddMinutes)
            {
                result = DbFunction_DATEADD("minutes", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddSeconds)
            {
                result = DbFunction_DATEADD("seconds", param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.AddMilliseconds)
            {
                result = DbFunction_DATEADD("MILLISECOND", param0, parameters[1]);
            }
            //diff datetime
            else if (functionType == DbFunctionType.DiffYears)
            {
                result = Append_DiffYears(param0, parameters[1]);
            }
            else if (functionType == DbFunctionType.DiffMonths)
            {
                object startDateTimeExp = param0, endDateTimeExp = parameters[1];

                /*
                 * This method will generating sql like following:
                 * (cast(STRFTIME('%Y','2016-07-06 09:01:24') as INTEGER) - cast(STRFTIME('%Y','2015-08-06 09:01:24') as INTEGER)) * 12  + (cast(STRFTIME('%m','2016-07-06 09:01:24') as INTEGER) - cast(STRFTIME('%m','2015-08-06 09:01:24') as INTEGER))
                 */
                StringBuilder sb = new StringBuilder();
                sb.Append("(");
                /* (cast(STRFTIME('%Y','2016-07-06 09:01:24') as INTEGER) - cast(STRFTIME('%Y','2015-08-06 09:01:24') as INTEGER)) * 12 */
                sb.Append(Append_DiffYears(startDateTimeExp, endDateTimeExp));
                sb.Append(" * 12");

                sb.Append(" + ");

                /* (cast(STRFTIME('%m','2016-07-06 09:01:24') as INTEGER) - cast(STRFTIME('%m','2015-08-06 09:01:24') as INTEGER)) */
                sb.Append("(");
                sb.Append(DbFunction_DATEPART("m", endDateTimeExp));
                sb.Append(" - ");
                sb.Append(DbFunction_DATEPART("m", startDateTimeExp));
                sb.Append(")");

                sb.Append(")");

                result = sb.ToString();
            }
            else if (functionType == DbFunctionType.DiffDays)
            {
                result = Append_DateDiff(param0, parameters[1], null);
            }
            else if (functionType == DbFunctionType.DiffHours)
            {
                result = Append_DateDiff(param0, parameters[1], 24);
            }
            else if (functionType == DbFunctionType.DiffMinutes)
            {
                result = Append_DateDiff(param0, parameters[1], 24 * 60);
            }
            else if (functionType == DbFunctionType.DiffSeconds)
            {
                result = Append_DateDiff(param0, parameters[1], 24 * 60 * 60);
            }
            else if (functionType == DbFunctionType.DiffMilliseconds)
            {
                result = Append_DateDiff(param0, parameters[1], 24 * 60 * 60 * 1000);
            }
            else if (functionType == DbFunctionType.DiffMicroseconds)
            {
                throw new NotSupportedException("SQLite is not supports DbFunctionType.DiffMicroseconds");
            }
            return(result);
        }