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); }
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))); }
public DataTypeSpecification GetDataTypeSpecification(string dataType) { return(DataTypeManager.GetDataTypeSpecification(this.DatabaseType, dataType)); }
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)); }
public static DataTypeSpecification GetDataTypeSpecification(DatabaseType databaseType, string dataType) { return(DataTypeManager.GetDataTypeSpecifications(databaseType).FirstOrDefault(item => item.Name.ToLower() == dataType.ToLower().Trim())); }