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); } }); }
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)))); } }
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))); } }