示例#1
0
        public string GetDataTypePrecisionScale(TableColumn column, string dataType)
        {
            DataTypeSpecification dataTypeSpecification = this.GetDataTypeSpecification(dataType);

            if (dataTypeSpecification != null)
            {
                long precision = column.Precision.HasValue ? column.Precision.Value : 0;
                int  scale     = column.Scale.HasValue ? column.Scale.Value : 0;

                if (dataTypeSpecification.Args.Contains(","))
                {
                    if (precision > 0)
                    {
                        return($"{precision},{scale}");
                    }
                }
                else if (dataTypeSpecification.Args == "scale")
                {
                    ArgumentRange?range = DataTypeManager.GetArgumentRange(dataTypeSpecification, "scale");

                    if (range.HasValue)
                    {
                        if (scale > range.Value.Max)
                        {
                            scale = range.Value.Max;
                        }
                    }

                    return($"{scale}");
                }
            }

            return(string.Empty);
        }
示例#2
0
        public virtual bool IsNoLengthDataType(string dataType)
        {
            IEnumerable <DataTypeSpecification> dataTypeSpecs = DataTypeManager.GetDataTypeSpecifications(this.DatabaseType);

            return(dataTypeSpecs.Any(item => item.Name.ToUpper() == dataType.ToUpper() && string.IsNullOrEmpty(item.Args)));
        }
示例#3
0
 public DataTypeSpecification GetDataTypeSpecification(string dataType)
 {
     return(DataTypeManager.GetDataTypeSpecification(this.DatabaseType, dataType));
 }
示例#4
0
        public async Task <DataTable> GetPagedDataTableAsync(DbConnection connection, Table table, List <TableColumn> columns, string orderColumns, long total, int pageSize, long pageNumber, string whereClause = "")
        {
            string quotedTableName = this.GetQuotedObjectName(table);

            List <string> columnNames = new List <string>();

            foreach (TableColumn column in columns)
            {
                string columnName = this.GetQuotedString(column.Name);

                #region Convert MySql float to decimal, avoid scientific notation
                if (this.DatabaseType == DatabaseType.MySql && column.DataType.ToLower().Contains("float"))
                {
                    DataTypeInfo dataTypeInfo = DataTypeHelper.GetDataTypeInfo(column.DataType);

                    if (!string.IsNullOrEmpty(dataTypeInfo.Args))
                    {
                        string strPrecision = dataTypeInfo.Args.Split(',')[0].Trim();
                        int    precision;

                        DataTypeSpecification dataTypeSpec = this.GetDataTypeSpecification("decimal");

                        if (dataTypeSpec != null)
                        {
                            ArgumentRange?precisionRange = DataTypeManager.GetArgumentRange(dataTypeSpec, "precision");

                            if (precisionRange.HasValue)
                            {
                                if (int.TryParse(strPrecision, out precision) && precision > 0 && precision <= precisionRange.Value.Max)
                                {
                                    columnName = $"CONVERT({columnName},DECIMAL({dataTypeInfo.Args})) AS {columnName}";
                                }
                            }
                        }
                    }
                }
                #endregion

                #region Convert Oracle number to char
                else if (this.DatabaseType == DatabaseType.Oracle && column.DataType.ToLower().Contains("number"))
                {
                    columnName = $"TO_CHAR({columnName}) AS {columnName}";
                }
                #endregion

                columnNames.Add(columnName);
            }

            string strColumnNames = string.Join(",", columnNames);

            string pagedSql = this.GetSqlForPagination(quotedTableName, strColumnNames, orderColumns, whereClause, pageNumber, pageSize);

            DataTable dt = await this.GetDataTableAsync(connection, pagedSql);

            if (dt.Columns.OfType <DataColumn>().Any(item => item.ColumnName == RowNumberColumnName))
            {
                dt.Columns.Remove(RowNumberColumnName);
            }

            return(dt);
        }
        private static bool IsTableColumnDataTypeAndLengthEquals(DatabaseType databaseType, TableColumn column1, TableColumn column2)
        {
            if (column1.IsUserDefined != column2.IsUserDefined)
            {
                return(false);
            }
            else if (column1.IsUserDefined && column2.IsUserDefined)
            {
                return(column1.DataType == column2.DataType);
            }

            DataTypeInfo dataTypeInfo1 = DataTypeHelper.GetDataTypeInfo(column1.DataType);
            DataTypeInfo dataTypeInfo2 = DataTypeHelper.GetDataTypeInfo(column2.DataType);

            var dataTypeSpecs1 = DataTypeManager.GetDataTypeSpecifications(databaseType);
            var dataTypeSpecs2 = DataTypeManager.GetDataTypeSpecifications(databaseType);

            string dataType1 = dataTypeInfo1.DataType;
            string dataType2 = dataTypeInfo2.DataType;

            if (!dataTypeSpecs1.Any(item => item.Name == dataType1))
            {
                dataTypeInfo1 = DataTypeHelper.GetSpecialDataTypeInfo(column1.DataType.ToLower());
                dataType1     = dataTypeInfo1.DataType;
            }

            if (!dataTypeSpecs2.Any(item => item.Name == dataType2))
            {
                dataTypeInfo2 = DataTypeHelper.GetSpecialDataTypeInfo(column2.DataType.ToLower());
                dataType2     = dataTypeInfo2.DataType;
            }

            if (dataType1.ToLower() != dataType2.ToLower())
            {
                return(false);
            }

            DataTypeSpecification dataTypeSpec1 = dataTypeSpecs1.FirstOrDefault(item => item.Name == dataType1);
            DataTypeSpecification dataTypeSpec2 = dataTypeSpecs2.FirstOrDefault(item => item.Name == dataType2);

            if (dataTypeInfo1.DataType == dataTypeInfo2.DataType && string.IsNullOrEmpty(dataTypeSpec1.Args) && string.IsNullOrEmpty(dataTypeSpec2.Args))
            {
                return(true);
            }

            bool isChar1 = DataTypeHelper.IsCharType(dataType1);
            bool isChar2 = DataTypeHelper.IsCharType(dataType2);

            bool isBytes1 = DataTypeHelper.IsCharType(dataType1);
            bool isBytes2 = DataTypeHelper.IsCharType(dataType2);

            if (isBytes1 && isBytes2)
            {
                return(column1.MaxLength == column2.MaxLength);
            }
            else if (isChar1 && isChar2 && DataTypeHelper.StartWithN(dataType1) && DataTypeHelper.StartWithN(dataType2))
            {
                return(column1.MaxLength == column2.MaxLength);
            }
            else if ((column1.Precision == null && column1.Scale == null && column1.MaxLength == column2.Precision) ||
                     (column2.Precision == null && column2.Scale == null && column2.MaxLength == column1.Precision))
            {
                return(true);
            }

            if (dataTypeSpec1.Name == dataTypeSpec2.Name && dataTypeSpec1.Args?.Contains("length") == false)
            {
                if (dataTypeSpec1.Args == "scale")
                {
                    return(IsPrecisionScaleEquals(column1.Scale, column2.Scale));
                }
                else if (dataTypeSpec1.Args == "precision")
                {
                    return(IsPrecisionScaleEquals(column1.Precision, column2.Precision));
                }
                else if (dataTypeSpec1.Args?.Contains("scale") == true || dataTypeSpec1.Args?.Contains("precision") == true)
                {
                    return(IsPrecisionScaleEquals(column1.Precision, column2.Precision) &&
                           IsPrecisionScaleEquals(column1.Scale, column2.Scale));
                }
            }

            return(column1.MaxLength == column2.MaxLength &&
                   IsPrecisionScaleEquals(column1.Precision, column2.Precision) &&
                   IsPrecisionScaleEquals(column1.Scale, column2.Scale));
        }
示例#6
0
 public static DataTypeSpecification GetDataTypeSpecification(DatabaseType databaseType, string dataType)
 {
     return(DataTypeManager.GetDataTypeSpecifications(databaseType).FirstOrDefault(item => item.Name.ToLower() == dataType.ToLower().Trim()));
 }