Beispiel #1
0
        public override string Render(IQuery query)
        {
            string result = string.Empty;
            CollectVariableVisitor visitor = new CollectVariableVisitor();

            switch (query)
            {
            case SelectQuery sq:
                if (Settings.Parametrization != ParametrizationSettings.None)
                {
                    visitor.Visit(sq);
                }
                result = Render(sq);
                break;

            case SelectQueryBase selectQueryBase:
                result = Render(selectQueryBase);
                break;

            case CreateViewQuery createViewQuery:
                if (Settings.Parametrization != ParametrizationSettings.None)
                {
                    visitor.Visit(createViewQuery.SelectQuery);
                }
                result = Render(createViewQuery);
                break;

            case DeleteQuery deleteQuery:
                if (Settings.Parametrization != ParametrizationSettings.None)
                {
                    visitor.Visit(deleteQuery);
                }
                result = Render(deleteQuery);
                break;

            case UpdateQuery updateQuery:
                result = Render(updateQuery);
                break;

            case TruncateQuery truncateQuery:
                result = Render(truncateQuery);
                break;

            case InsertIntoQuery insertIntoQuery:
                result = Render(insertIntoQuery);
                break;

            case BatchQuery batchQuery:
                result = Render(batchQuery);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(query), "Unknown type of query");
            }
            StringBuilder sbParameters = new StringBuilder(visitor.Variables.Count() * 100);

#if DEBUG
            if (visitor.Variables.Any())
            {
                Debug.Assert(visitor.Variables.All(x => x.Value != null), $"{nameof(visitor)}.{nameof(visitor.Variables)} must not contains variables with null value");
            }
#endif

            if (Settings.Parametrization == ParametrizationSettings.Default)
            {
                foreach (Variable variable in visitor.Variables)
                {
                    sbParameters.Append("DECLARE @").Append(variable.Name).Append(" AS");
                    switch (variable.Type)
                    {
                    case VariableType.Numeric:
                        sbParameters.Append(" NUMERIC = ").Append(variable.Value).Append(BatchStatementSeparator);
                        break;

                    case VariableType.String:
                        sbParameters.Append(" VARCHAR(8000) = '").Append(EscapeString(variable.Value.ToString())).Append("'")
                        .Append(BatchStatementSeparator);
                        break;

                    case VariableType.Boolean:
                        sbParameters.Append(" BIT = ")
                        .Append(true.Equals(variable.Value) ? "1" : "0")
                        .Append(BatchStatementSeparator);
                        break;

                    case VariableType.Date:
                        sbParameters.Append(" DATETIME = '").Append(EscapeString((variable.Value as DateTime?)?.ToString(Settings.DateFormatString)))
                        .Append(BatchStatementSeparator);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException(nameof(variable), variable, $"Unexpected {variable.Type} variable type");
                    }

                    if (Settings.PrettyPrint && sbParameters.Length > 0)
                    {
                        sbParameters.AppendLine();
                    }
                }
            }
            return(sbParameters.Append(result).ToString());
        }
 /// <summary>
 /// Builds a new <see cref="ReplaceParameterBySelectQueryVisitor"/> instance
 /// </summary>
 /// <param name="variableRewriter">Defines how a variable should be rewritten</param>
 public ReplaceParameterBySelectQueryVisitor(Func <Variable, SelectQuery> variableRewriter)
 {
     _variableRewriter = variableRewriter ?? throw new ArgumentNullException(nameof(variableRewriter));
     _variableVisitor  = new CollectVariableVisitor();
 }
 public CollectVariableVisitorTests(ITestOutputHelper outputHelper)
 {
     _outputHelper = outputHelper;
     _sut          = new();
 }