/// <summary>
        /// Converts to a <see cref="SqlParameter"/>.
        /// </summary>
        /// <param name="stringInputParameter">The string input parameter.</param>
        /// <returns>SqlParameter.</returns>
        public static SqlParameter ToSqlParameter(
            this InputParameterDefinition <string> stringInputParameter)
        {
            stringInputParameter.MustForArg(nameof(stringInputParameter)).NotBeNull();

            if (stringInputParameter.SqlDataType.GetType() == typeof(StringSqlDataTypeRepresentation))
            {
                var stringDataType = (StringSqlDataTypeRepresentation)stringInputParameter.SqlDataType;
                var name           = stringInputParameter.Name;
                name = name.StartsWith("@", StringComparison.Ordinal) ? name : "@" + name;
                var result = stringInputParameter.Value.CreateInputSqlParameter(name, stringDataType.SupportUnicode ? SqlDbType.NVarChar : SqlDbType.VarChar, stringDataType.SupportedLength);
                return(result);
            }
            else if (stringInputParameter.SqlDataType.GetType() == typeof(XmlSqlDataTypeRepresentation))
            {
                var name = stringInputParameter.Name;
                name = name.StartsWith("@", StringComparison.Ordinal) ? name : "@" + name;
                var result = stringInputParameter.Value.CreateInputSqlParameter(name, SqlDbType.Xml);
                return(result);
            }
            else
            {
                throw new NotSupportedException(FormattableString.Invariant($"Cannot create a {nameof(SqlParameter)} from {nameof(InputParameterDefinition<string>)} with a datatype of {stringInputParameter.SqlDataType}."));
            }
        }
        /// <summary>
        /// Converts to a <see cref="SqlParameter"/>.
        /// </summary>
        /// <param name="dateTimeInputParameter">The nullable <see cref="DateTime"/> input parameter.</param>
        /// <returns>SqlParameter.</returns>
        public static SqlParameter ToSqlParameter(
            this InputParameterDefinition <DateTime?> dateTimeInputParameter)
        {
            dateTimeInputParameter.MustForArg(nameof(dateTimeInputParameter)).NotBeNull();
            var name = dateTimeInputParameter.Name;

            name = name.StartsWith("@", StringComparison.Ordinal) ? name : "@" + name;
            var result = dateTimeInputParameter.Value.CreateInputSqlParameter(name);

            return(result);
        }
        /// <summary>
        /// Converts to a <see cref="SqlParameter"/>.
        /// </summary>
        /// <param name="parameterDefinition">The parameter representation.</param>
        /// <returns>SqlParameter.</returns>
        public static SqlParameter ToSqlParameter(
            this ParameterDefinitionBase parameterDefinition)
        {
            parameterDefinition.MustForArg(nameof(parameterDefinition)).NotBeNull();

            if (parameterDefinition is InputParameterDefinition <byte[]> binaryRepresentationInput)
            {
                return(binaryRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <decimal> decimalRepresentationInput)
            {
                return(decimalRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <int> intRepresentationInput)
            {
                return(intRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <int?> intNullableRepresentationInput)
            {
                return(intNullableRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <long> longRepresentationInput)
            {
                return(longRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <long?> longNullableRepresentationInput)
            {
                return(longNullableRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <string> stringRepresentationInput)
            {
                return(stringRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <DateTime> dateTimeRepresentationInput)
            {
                return(dateTimeRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <DateTime?> dateTimeNullableRepresentationInput)
            {
                return(dateTimeNullableRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <byte[]> binaryRepresentationOutput)
            {
                return(binaryRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <decimal> decimalRepresentationOutput)
            {
                return(decimalRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <int> intRepresentationOutput)
            {
                return(intRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <int?> intNullableRepresentationOutput)
            {
                return(intNullableRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <long> longRepresentationOutput)
            {
                return(longRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <long?> longNullableRepresentationOutput)
            {
                return(longNullableRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <string> stringRepresentationOutput)
            {
                return(stringRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <DateTime> dateTimeRepresentationOutput)
            {
                return(dateTimeRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <DateTime?> dateTimeNullableRepresentationOutput)
            {
                return(dateTimeNullableRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition.GetType().GetGenericArguments().SingleOrDefault()?.IsEnum ?? false)
            {
                var genericDefinition = parameterDefinition.GetType().GetGenericTypeDefinition();
                if (genericDefinition == typeof(InputParameterDefinition <>))
                {
                    var enumValue = parameterDefinition.GetType()
                                    .GetProperty(nameof(InputParameterDefinition <string> .Value))
                                    ?.GetValue(parameterDefinition);
                    var stringParameter = new InputParameterDefinition <string>(parameterDefinition.Name, parameterDefinition.SqlDataType, enumValue?.ToString());
                    return(stringParameter.ToSqlParameter());
                }
                else if (genericDefinition == typeof(OutputParameterDefinition <>))
                {
                    var stringParameter = new OutputParameterDefinition <string>(parameterDefinition.Name, parameterDefinition.SqlDataType);
                    return(stringParameter.ToSqlParameter());
                }
                else
                {
                    throw new NotSupportedException(FormattableString.Invariant($"Param type {parameterDefinition.GetType().ToStringReadable()} is not supported."));
                }
            }
            else
            {
                throw new NotSupportedException(FormattableString.Invariant($"{nameof(ParameterDefinitionBase)} {nameof(parameterDefinition)} of type {parameterDefinition.GetType().ToStringReadable()} is not a supported type parameter."));
            }
        }
Пример #4
0
        static InputParameterDefinitionTValueTest()
        {
            ConstructorArgumentValidationTestScenarios
            .RemoveAllScenarios()
            .AddScenario(() =>
                         new ConstructorArgumentValidationTestScenario <InputParameterDefinition <Version> >
            {
                Name             = "constructor should throw ArgumentNullException when parameter 'name' is null scenario",
                ConstructionFunc = () =>
                {
                    var referenceObject = A.Dummy <InputParameterDefinition <Version> >();

                    var result = new InputParameterDefinition <Version>(
                        null,
                        referenceObject.SqlDataType,
                        referenceObject.Value);

                    return(result);
                },
                ExpectedExceptionType            = typeof(ArgumentNullException),
                ExpectedExceptionMessageContains = new[] { "name", },
            })
            .AddScenario(() =>
                         new ConstructorArgumentValidationTestScenario <InputParameterDefinition <Version> >
            {
                Name             = "constructor should throw ArgumentException when parameter 'name' is white space scenario",
                ConstructionFunc = () =>
                {
                    var referenceObject = A.Dummy <InputParameterDefinition <Version> >();

                    var result = new InputParameterDefinition <Version>(
                        Invariant($"  {Environment.NewLine}  "),
                        referenceObject.SqlDataType,
                        referenceObject.Value);

                    return(result);
                },
                ExpectedExceptionType            = typeof(ArgumentException),
                ExpectedExceptionMessageContains = new[] { "name", "white space", },
            })
            .AddScenario(() =>
                         new ConstructorArgumentValidationTestScenario <InputParameterDefinition <Version> >
            {
                Name             = "constructor should throw ArgumentException when parameter 'name' is not alphanumeric nor @ nor _",
                ConstructionFunc = () =>
                {
                    var referenceObject = A.Dummy <InputParameterDefinition <Version> >();

                    var result = new InputParameterDefinition <Version>(
                        referenceObject.Name + "^",
                        referenceObject.SqlDataType,
                        referenceObject.Value);

                    return(result);
                },
                ExpectedExceptionType            = typeof(ArgumentException),
                ExpectedExceptionMessageContains = new[] { "name", "alphanumeric", },
            })
            .AddScenario(() =>
                         new ConstructorArgumentValidationTestScenario <InputParameterDefinition <Version> >
            {
                Name             = "constructor should throw ArgumentNullException when parameter 'sqlDataType' is null scenario",
                ConstructionFunc = () =>
                {
                    var referenceObject = A.Dummy <InputParameterDefinition <Version> >();

                    var result = new InputParameterDefinition <Version>(
                        referenceObject.Name,
                        null,
                        referenceObject.Value);

                    return(result);
                },
                ExpectedExceptionType            = typeof(ArgumentNullException),
                ExpectedExceptionMessageContains = new[] { "sqlDataType", },
            });

            EquatableTestScenarios
            .RemoveAllScenarios()
            .AddScenario(() =>
                         new EquatableTestScenario <InputParameterDefinition <Version> >
            {
                Name            = "Default Code Generated Scenario",
                ReferenceObject = ReferenceObjectForEquatableTestScenarios,
                ObjectsThatAreEqualToButNotTheSameAsReferenceObject = new InputParameterDefinition <Version>[]
                {
                    new InputParameterDefinition <Version>(
                        ReferenceObjectForEquatableTestScenarios.Name,
                        ReferenceObjectForEquatableTestScenarios.SqlDataType,
                        ReferenceObjectForEquatableTestScenarios.Value),
                },
                ObjectsThatAreNotEqualToReferenceObject = new InputParameterDefinition <Version>[]
                {
                    new InputParameterDefinition <Version>(
                        A.Dummy <InputParameterDefinition <Version> >().Whose(_ => !_.Name.IsEqualTo(ReferenceObjectForEquatableTestScenarios.Name)).Name,
                        ReferenceObjectForEquatableTestScenarios.SqlDataType,
                        ReferenceObjectForEquatableTestScenarios.Value),
                    new InputParameterDefinition <Version>(
                        ReferenceObjectForEquatableTestScenarios.Name,
                        ReferenceObjectForEquatableTestScenarios.SqlDataType,
                        A.Dummy <InputParameterDefinition <Version> >().Whose(_ => !_.Value.IsEqualTo(ReferenceObjectForEquatableTestScenarios.Value)).Value),
                },
                ObjectsThatAreNotOfTheSameTypeAsReferenceObject = new object[]
                {
                    A.Dummy <object>(),
                    A.Dummy <string>(),
                    A.Dummy <int>(),
                    A.Dummy <Version>(),
                    A.Dummy <Guid>(),
                    A.Dummy <OutputParameterDefinition <Version> >(),
                },
            });
        }