private void AddToParameterCollection()

in src/Microsoft.SqlTools.ServiceLayer/AutoParameterizaition/ScalarExpressionTransformer.cs [208:581]


        private void AddToParameterCollection(Literal literal, string parameterName, SqlDataTypeOption sqlDataTypeOption, IList<Literal> sqlDataTypeParameters)
        {
            SqlParameter sqlParameter = new SqlParameter();
            string literalValue = literal.Value;
            object parsedValue = null;
            SqlDbType paramType = SqlDbType.VarChar;
            bool parseSuccessful = true;

            switch (sqlDataTypeOption)
            {
                case SqlDataTypeOption.Binary:
                    paramType = SqlDbType.Binary;
                    try
                    {
                        parsedValue = TryParseBinaryLiteral(literalValue, VariableName, SqlDbType.Binary, literal.StartLine);
                    }
                    catch (ParameterizationFormatException)
                    {
                        if (IsCodeSenseRequest)
                        {
                            parseSuccessful = false;
                            AddCodeSenseErrorItem(MessageHelper.MessageType.BINARY_LITERAL_PREFIX_MISSING_ERROR, literal, literal.Value, VariableName, SqlDbType.Binary.ToString());
                        }
                        else
                        {
                            throw;
                        }
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Binary.ToString(), C_SHARP_BYTE_ARRAY, literalValue, literal.StartLine, e);
                    }
                    break;

                case SqlDataTypeOption.VarBinary:
                    paramType = SqlDbType.VarBinary;
                    try
                    {
                        parsedValue = TryParseBinaryLiteral(literalValue, VariableName, SqlDbType.VarBinary, literal.StartLine);
                        ExtractSize(sqlDataTypeParameters, sqlParameter);
                    }
                    catch (ParameterizationFormatException)
                    {
                        if (IsCodeSenseRequest)
                        {
                            parseSuccessful = false;
                            string sqlDataTypeString = GetSqlDataTypeStringOneParameter(SqlDbType.VarBinary, sqlDataTypeParameters);
                            AddCodeSenseErrorItem(MessageHelper.MessageType.BINARY_LITERAL_PREFIX_MISSING_ERROR, literal, literalValue, VariableName, sqlDataTypeString);
                        }
                        else
                        {
                            throw;
                        }
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        string sqlDataTypeString = GetSqlDataTypeStringOneParameter(SqlDbType.VarBinary, sqlDataTypeParameters);
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, sqlDataTypeString, C_SHARP_BYTE_ARRAY, literalValue, literal.StartLine, e);
                    }
                    break;


                //Integer literals of form 24.0 will not be supported
                case SqlDataTypeOption.BigInt:
                    paramType = SqlDbType.BigInt;
                    long parsedLong;
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    if (long.TryParse(literalValue, out parsedLong))
                    {
                        parsedValue = parsedLong;
                    }
                    else
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.BigInt.ToString(), "Int64", literalValue, literal.StartLine, null);
                    }

                    break;

                case SqlDataTypeOption.Int:
                    paramType = SqlDbType.Int;
                    int parsedInt;
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    if (int.TryParse(literalValue, out parsedInt))
                    {
                        parsedValue = parsedInt;
                    }
                    else
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Int.ToString(), "Int32", literalValue, literal.StartLine, null);
                    }

                    break;

                case SqlDataTypeOption.SmallInt:
                    paramType = SqlDbType.SmallInt;
                    short parsedShort;
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    if (short.TryParse(literalValue, out parsedShort))
                    {
                        parsedValue = parsedShort;
                    }
                    else
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.SmallInt.ToString(), "Int16", literalValue, literal.StartLine, null);
                    }

                    break;

                case SqlDataTypeOption.TinyInt:
                    paramType = SqlDbType.TinyInt;
                    byte parsedByte;
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    if (byte.TryParse(literalValue, out parsedByte))
                    {
                        parsedValue = parsedByte;
                    }
                    else
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.TinyInt.ToString(), "Byte", literalValue, literal.StartLine, null);
                    }

                    break;


                case SqlDataTypeOption.Real:
                    paramType = SqlDbType.Real;
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    try
                    {
                        parsedValue = SqlSingle.Parse(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Real.ToString(), "SqlSingle", literalValue, literal.StartLine, e);
                    }

                    break;

                case SqlDataTypeOption.Float:
                    paramType = SqlDbType.Float;
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    try
                    {
                        parsedValue = SqlDouble.Parse(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Float.ToString(), "SqlDouble", literalValue, literal.StartLine, e);
                    }

                    break;


                case SqlDataTypeOption.Decimal:
                case SqlDataTypeOption.Numeric:
                    paramType = SqlDbType.Decimal;
                    ExtractPrecisionAndScale(sqlDataTypeParameters, sqlParameter);
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    try
                    {
                        parsedValue = SqlDecimal.Parse(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        string sqlDecimalDataType = sqlDataTypeParameters != null ? (SqlDbType.Decimal + "(" + sqlDataTypeParameters[0] + ", " + sqlDataTypeParameters[1] + ")") : "";
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, sqlDecimalDataType, "SqlDecimal", literalValue, literal.StartLine, e);
                    }

                    break;

                case SqlDataTypeOption.Money:
                    paramType = SqlDbType.Money;
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    try
                    {
                        parsedValue = SqlMoney.Parse(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Money.ToString(), "SqlMoney", literalValue, literal.StartLine, e);
                    }

                    break;

                case SqlDataTypeOption.SmallMoney:
                    paramType = SqlDbType.SmallMoney;
                    literalValue = IsNegative ? "-" + literalValue : literalValue;

                    try
                    {
                        parsedValue = SqlMoney.Parse(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.SmallMoney.ToString(), "SqlMoney", literalValue, literal.StartLine, e);
                    }

                    break;

                case SqlDataTypeOption.DateTime:
                    paramType = SqlDbType.DateTime;

                    try
                    {
                        parsedValue = ParseDateTime(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.DateTime.ToString(), "DateTime", literalValue, literal.StartLine, e);
                    }

                    break;

                case SqlDataTypeOption.SmallDateTime:
                    paramType = SqlDbType.SmallDateTime;

                    try
                    {
                        parsedValue = ParseDateTime(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.SmallDateTime.ToString(), "DateTime", literalValue, literal.StartLine, e);
                    }

                    break;

                case SqlDataTypeOption.DateTime2:
                    paramType = SqlDbType.DateTime2;

                    try
                    {
                        parsedValue = ParseDateTime(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.DateTime2.ToString(), "DateTime", literalValue, literal.StartLine, e);
                    }

                    ExtractPrecision(sqlDataTypeParameters, sqlParameter);
                    break;

                case SqlDataTypeOption.Date:
                    paramType = SqlDbType.Date;

                    try
                    {
                        parsedValue = ParseDate(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.Date.ToString(), "DateTime", literalValue, literal.StartLine, e);
                    }

                    break;

                case SqlDataTypeOption.DateTimeOffset:
                    paramType = SqlDbType.DateTimeOffset;

                    try
                    {
                        parsedValue = ParseDateTimeOffset(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.DATE_TIME_ERROR_MESSAGE, literal, VariableName, SqlDbType.DateTimeOffset.ToString(), "DateTimeOffset", literalValue, literal.StartLine, e);
                    }

                    ExtractPrecision(sqlDataTypeParameters, sqlParameter);
                    break;


                case SqlDataTypeOption.Time:
                    paramType = SqlDbType.Time;

                    try
                    {
                        parsedValue = TimeSpan.Parse(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Time.ToString(), "TimeSpan", literalValue, literal.StartLine, e);
                    }

                    ExtractPrecision(sqlDataTypeParameters, sqlParameter);
                    break;

                case SqlDataTypeOption.Char:
                    paramType = SqlDbType.Char;
                    ExtractSize(sqlDataTypeParameters, sqlParameter);
                    break;

                case SqlDataTypeOption.VarChar:
                    paramType = SqlDbType.VarChar;
                    ExtractSize(sqlDataTypeParameters, sqlParameter);
                    break;

                case SqlDataTypeOption.NChar:
                    paramType = SqlDbType.NChar;
                    ExtractSize(sqlDataTypeParameters, sqlParameter);
                    break;

                case SqlDataTypeOption.NVarChar:
                    paramType = SqlDbType.NVarChar;
                    ExtractSize(sqlDataTypeParameters, sqlParameter);
                    break;

                case SqlDataTypeOption.UniqueIdentifier:
                    paramType = SqlDbType.UniqueIdentifier;

                    try
                    {
                        parsedValue = SqlGuid.Parse(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.UniqueIdentifier.ToString(), "SqlGuid", literalValue, literal.StartLine, e);
                    }

                    break;

                case SqlDataTypeOption.Bit:
                    paramType = SqlDbType.Bit;

                    try
                    {
                        parsedValue = Byte.Parse(literalValue);
                    }
                    catch (Exception e)
                    {
                        parseSuccessful = false;
                        HandleError(MessageHelper.MessageType.ERROR_MESSAGE, literal, VariableName, SqlDbType.Bit.ToString(), "Byte", literalValue, literal.StartLine, e);
                    }
                    break;

                default:
                    break;
            }

            if (parseSuccessful)
            {
                sqlParameter.ParameterName = parameterName;
                sqlParameter.SqlDbType = paramType;
                sqlParameter.Value = parsedValue ?? literalValue;
                sqlParameter.Direction = ParameterDirection.Input;
                Parameters.Add(sqlParameter);
            }
        }