예제 #1
0
        protected virtual void ContributeParameter(IDbCommand command, string name, object value, DocumentMap mapping = null)
        {
            if (value == null)
            {
                command.Parameters.Add(new SqlParameter(name, DBNull.Value));
                return;
            }

            if (value is IEnumerable && (value is string) == false && (value is byte[]) == false)
            {
                var inClauseNames = new List <string>();
                var i             = 0;
                foreach (var inClauseValue in (IEnumerable)value)
                {
                    var inClauseName = name + "_" + i;
                    inClauseNames.Add(inClauseName);
                    ContributeParameter(command, inClauseName, inClauseValue);
                    i++;
                }

                if (i == 0)
                {
                    var inClauseName = name + "_" + i;
                    inClauseNames.Add(inClauseName);
                    ContributeParameter(command, inClauseName, null);
                }


                var originalParameter     = Regex.Escape("@" + name.TrimStart('@'));
                var replacementParameters = "(" + string.Join(", ", inClauseNames.Select(x => "@" + x)) + ")";
                command.CommandText = Regex.Replace(command.CommandText, originalParameter, match => replacementParameters, RegexOptions.IgnoreCase);
                return;
            }

            var columnType = DatabaseTypeConverter.AsDbType(value.GetType());

            var param = new SqlParameter();

            param.ParameterName = name;
            param.DbType        = columnType;
            param.Value         = value;

            // To assist SQL's query plan caching, assign a parameter size for our
            // common id lookups where possible.
            if (mapping != null &&
                mapping.IdColumn != null &&
                mapping.IdColumn.MaxLength > 0 &&
                columnType == DbType.String &&
                string.Equals(name, "Id", StringComparison.OrdinalIgnoreCase))
            {
                param.Size = mapping.IdColumn.MaxLength;
            }

            command.Parameters.Add(param);
        }
        public void Before()
        {
            _wordsToPhrase = new Mock<IWordsPhraseConverter>();
            _assembly = new Mock<IAssembleArguments>();
            _argumentAssemblies = new Mock<IArgumentAssemblyProvider>();
            _argumentAssemblies
                .Setup(x => x.GetAssembly(It.IsAny<PageType>()))
                .Returns(_assembly.Object);

            _converter = new DatabaseTypeConverter(
                _wordsToPhrase.Object,
                _argumentAssemblies.Object);
        }
예제 #3
0
        public IPriceComperationDataManager GetPriceComperationDataManager()
        {
            var converter = new DatabaseTypeConverter();

            DatabaseType type = converter.ToDatabaseType(ConfigurationManager.AppSettings["DatabaseType"]);

            switch (type)
            {
            case DatabaseType.DbManager:
                return(DbManager.TheDbManager);

            default:
                return(null);
            }
        }
예제 #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private static IDbParameter CreateParameter(IDataRecord reader)
        {
            var param = DatabaseUtils.CreateParameter <DbParameter>();
            var tc    = new DatabaseTypeConverter();

            param.DbType = tc.GetDbType(reader["DATA_TYPE"].ToString());

            var paramMode = reader["PARAMETER_MODE"].ToString();

            switch (paramMode.ToUpper())
            {
            case "IN": param.Direction = ParameterDirection.Input;
                break;

            case "OUT": param.Direction = ParameterDirection.Output;
                break;

            default: param.Direction = ParameterDirection.InputOutput;
                break;
            }
            param.ParameterName = reader["PARAMETER_NAME"].ToString();

            return(param);
        }
예제 #5
0
        protected virtual void ContributeParameter(IDbCommand command, ITypeHandlerRegistry typeHandlers, string name, object value, DocumentMap mapping = null)
        {
            if (value == null)
            {
                command.Parameters.Add(new SqlParameter(name, DBNull.Value));
                return;
            }

            var typeHandler = typeHandlers.Resolve(value.GetType());

            if (typeHandler != null)
            {
                var p = new SqlParameter(name, SqlDbType.NVarChar);
                typeHandler.WriteDatabase(p, value);
                command.Parameters.Add(p);
                return;
            }

            if (value is TableValuedParameter tvp && command is SqlCommand sqlCommand)
            {
                var p = sqlCommand.Parameters.Add(name, SqlDbType.Structured);
                p.Value    = tvp.DataRecords;
                p.TypeName = tvp.TypeName;
                return;
            }

            if (value is IEnumerable && (value is string) == false && (value is byte[]) == false)
            {
                var inClauseNames = new List <string>();
                var i             = 0;

                var inClauseValues = ((IEnumerable)value).Cast <object>().ToList();

                ListExtender.ExtendListRepeatingLastValue(inClauseValues);

                foreach (var inClauseValue in inClauseValues)
                {
                    i++;
                    var inClauseName = name + "_" + i;
                    inClauseNames.Add(inClauseName);
                    ContributeParameter(command, typeHandlers, inClauseName, inClauseValue);
                }

                if (i == 0)
                {
                    var inClauseName = name + "_" + i;
                    inClauseNames.Add(inClauseName);
                    ContributeParameter(command, typeHandlers, inClauseName, null);
                }

                var originalParameter     = Regex.Escape("@" + name.TrimStart('@')) + @"(?=[^\w\$@#_]|$)";
                var replacementParameters = "(" + string.Join(", ", inClauseNames.Select(x => "@" + x)) + ")";
                command.CommandText = Regex.Replace(command.CommandText, originalParameter, match => replacementParameters, RegexOptions.IgnoreCase);
                return;
            }

            var columnType = DatabaseTypeConverter.AsDbType(value.GetType());

            if (columnType == null)
            {
                throw new InvalidOperationException($"Cannot map type '{value.GetType().FullName}' to a DbType. Consider providing a custom ITypeHandler.");
            }

            var param = new SqlParameter();

            param.ParameterName = name;
            param.DbType        = columnType.Value;
            param.Value         = value;

            if (columnType == DbType.String && value is string text)
            {
                var size = GetBestSizeBucket(text);
                if (size > 0)
                {
                    param.Size = size;
                }
            }

            // To assist SQL's query plan caching, assign a parameter size for our
            // common id lookups where possible.
            if (mapping != null &&
                mapping.IdColumn != null &&
                mapping.IdColumn.MaxLength > 0 &&
                columnType == DbType.String &&
                string.Equals(name, mapping.IdColumn.ColumnName, StringComparison.OrdinalIgnoreCase))
            {
                if (mapping.IdColumn.MaxLength != null)
                {
                    param.Size = mapping.IdColumn.MaxLength.Value;
                }
            }

            if (columnType == DbType.String && mapping != null)
            {
                var indexed   = mapping.WritableIndexedColumns();
                var columnMap = indexed.FirstOrDefault(i => string.Equals(i.ColumnName, param.ParameterName, StringComparison.OrdinalIgnoreCase));
                if (columnMap != null && columnMap.MaxLength != null)
                {
                    param.Size = columnMap.MaxLength.Value;
                }
            }

            command.Parameters.Add(param);
        }
예제 #6
0
        static string GetDatabaseType(ColumnMapping column)
        {
            var dbType = DatabaseTypeConverter.AsDbType(column.Type);

            switch (dbType)
            {
            case DbType.AnsiString:
                return("varchar" + GetLength(column));

            case DbType.AnsiStringFixedLength:
                return("char");

            case DbType.Binary:
                return("varbinary(max)");

            case DbType.Byte:
                return("tinyint");

            case DbType.Boolean:
                return("bit");

            case DbType.Currency:
                return("decimal");

            case DbType.Date:
                return("date");

            case DbType.DateTime:
                return("datetime");

            case DbType.Decimal:
                return("decimal");

            case DbType.Double:
                return("float");

            case DbType.Guid:
                return("uniqueidentifier");

            case DbType.Int16:
                return("smallint");

            case DbType.Int32:
                return("int");

            case DbType.Int64:
                return("bigint");

            case DbType.SByte:
                break;

            case DbType.Single:
                break;

            case DbType.StringFixedLength:
                return("nchar");

            case DbType.String:
                return("nvarchar" + GetLength(column));

            case DbType.Time:
                return("time");

            case DbType.DateTime2:
            case DbType.DateTimeOffset:
                return("datetimeoffset");
            }

            return("nvarchar(max)");
        }