private void SqlReplace(string query, TextWriter builder)
        {
            SqlReplace(query, '@', builder, p =>
            {
                object value;

                if (TryGetParamValue(p, out value))
                {
                    Func <string, string> finalAction = s => s;
                    var inClause = false;

                    if (builder.ToString().EndsWith(" in "))
                    {
                        finalAction = s => "(" + s + ")";
                        inClause    = true;
                    }
                    else if (builder.ToString().EndsWith(" in ("))
                    {
                        inClause = true;
                    }


                    IFormattable num;
                    if (value == null
#if DBDATA
                        || value == DBNull.Value
#endif
                        )
                    {
                        return(finalAction("null"));
                    }
                    else if (ServerContext.TryCastNumber(value, out num))
                    {
                        return(finalAction(_sqlFormatter.Format(num)));
                    }
                    else if (value is string)
                    {
                        return(finalAction(SqlFormatter.Quote(ServerContext.RenderSqlEnum(value, false, o => _sqlFormatter.Format(o)))));
                    }
                    else if (inClause && value is IEnumerable)
                    {
                        return(finalAction(ServerContext.RenderSqlEnum(value, true, o => _sqlFormatter.Format(o))));
                    }
                    else if (value is DateTime || value is bool || value is Guid)
                    {
                        return(finalAction("'" + ServerContext.RenderSqlEnum(value, false, o => _sqlFormatter.Format(o)) + "'"));
                    }
                    else
                    {
                        return(finalAction(SqlFormatter.Quote(ServerContext.RenderSqlEnum(value, false, o => _sqlFormatter.Format(o)))));
                    }
                }
                else
                {
                    return("@" + p);
                }
            });
        }
Пример #2
0
        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            if (!this.Equals(formatProvider))
            {
                return(null);
            }
            if (arg == null)
            {
                return("null");
            }

            var          parts = (format ?? "").Split(':');
            string       formatString;
            var          numberMode = false;
            IFormattable number     = null;

            switch (parts[0])
            {
            case "str":
                numberMode   = false;
                formatString = string.Join(":", parts, 1, parts.Length - 1);
                break;

            case "num":
                if (!ServerContext.TryCastNumber(arg, out number))
                {
                    number     = double.Parse(arg.ToString());
                    numberMode = true;
                }
                formatString = string.Join(":", parts, 1, parts.Length - 1);
                break;

            default:
                numberMode   = ServerContext.TryCastNumber(arg, out number);
                formatString = format;
                break;
            }

            if (numberMode)
            {
                return(number.ToString(formatString, CultureInfo.InvariantCulture));
            }
            else
            {
                return(Quote(Render(arg,
                                    n => n.ToString(formatString, CultureInfo.InvariantCulture),
                                    s => SqlEscape(arg, formatString))));
            }
        }
Пример #3
0
        private string Render(object arg, Func <IFormattable, string> numberRenderer, Func <object, string> stringRenderer)
        {
            if (arg == null)
            {
                return("null");
            }
            else if (arg is Condition condition)
            {
                switch (condition)
                {
                case Condition.Between:
                    return("between");

                case Condition.Equal:
                    return("=");

                case Condition.GreaterThan:
                    return(">");

                case Condition.GreaterThanEqual:
                    return(">=");

                case Condition.In:
                    return("in");

                case Condition.Is:
                    return("is");

                case Condition.IsNotNull:
                    return("is not null");

                case Condition.IsNull:
                    return("is null");

                case Condition.LessThan:
                    return("<");

                case Condition.LessThanEqual:
                    return("<=");

                case Condition.Like:
                    return("like");

                case Condition.NotBetween:
                    return("not between");

                case Condition.NotEqual:
                    return("<>");

                case Condition.NotIn:
                    return("not in");

                case Condition.NotLike:
                    return("not like");

                default:
                    throw new NotSupportedException();
                }
            }
            else if (arg is QueryModel.PatternList pattern)
            {
                return(stringRenderer(QueryModel.PatternParser.SqlServer.Render(pattern)));
            }
            else if (ServerContext.TryCastNumber(arg, out IFormattable number))
            {
                return(numberRenderer(number));
            }
            else
            {
                return(stringRenderer(ElementFactory.Utc.LocalizationContext.Format(arg)));
            }
        }