/// <summary> /// Sets the cell of a value. /// </summary> /// <param name="row">The <see cref="Row"/> containing the cell.</param> /// <param name="column">The <see cref="Column"/> containing the cell.</param> /// <param name="parsedCellValue">The parsed cell value.</param> /// <returns> /// <c>true</c> if the parsed value can be converted and set to the cell; otherwise, <c>false</c>. /// </returns> private static bool SetCellValue(Row row, EditableColumn column, string parsedCellValue) { bool isValid = true; CellValueObject cellValueObj = new CellValueObject(); Binding binding = new Binding(column.Key) { Mode = BindingMode.TwoWay, Source = row.Data, Converter = column.EditorValueConverter, ConverterParameter = column.EditorValueConverterParameter, ConverterCulture = CultureInfo.CurrentCulture }; BindingOperations.SetBinding(cellValueObj, CellValueObject.ValueProperty, binding); if (column.EditorValueConverter != null && column is TextColumn) { cellValueObj.Value = parsedCellValue; } else { object resolvedValue = null; bool targetTypeIsNullable = false; try { // The target data type Type targetType = column.DataType; if (targetType != null) { // If the targetType is Nullable we have to get the underlying type so we can use it for convertion if (targetType.IsGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { targetType = Nullable.GetUnderlyingType(targetType); targetTypeIsNullable = true; } if (!(targetTypeIsNullable && string.IsNullOrEmpty(parsedCellValue))) { // Convert the parsed value to the target type resolvedValue = Convert.ChangeType(parsedCellValue, targetType, CultureInfo.CurrentCulture); } } } catch (InvalidCastException) { isValid = false; } catch (FormatException) { isValid = false; } catch (OverflowException) { isValid = false; } catch (ArgumentException) { isValid = false; } if (resolvedValue != null) { cellValueObj.Value = resolvedValue; } else if (targetTypeIsNullable && string.IsNullOrEmpty(parsedCellValue)) { // We have a nullable targert type and empty parsed value, // it looks like an empty cell ... cellValueObj.Value = null; } } return isValid; }
private List <string> AlterTable( ) { StringBuilder builder = new StringBuilder( ); List <Column> primaryList = new List <Column>( ), foreignAddList = new List <Column>( ); List <EditableColumn> foreignChangeList = new List <EditableColumn>( ); List <string> result = new List <string>( ); int oldPKCount = 0, changedPKCount = 0; foreach (Column column in (Columns as ReportingCollection).ToDelete) { if (column.Created) { continue; } builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("DROP COLUMN ").Append((column as EditableColumn).OldName); result.Add(builder.ToString( )); builder.Clear( ); } foreach (Column column in Columns) { if (column.Created) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("ADD ").Append(column.Name).Append(' ').Append(column.Type); if (TypesWithLength.Contains(column.Type)) { builder.Append('(').Append(DefaultLength).Append(')'); } if (!column.Nullable) { builder.Append(" NOT NULL"); } else { builder.Append(" NULL"); } if (column.PrimaryKey) { primaryList.Add(column); ++changedPKCount; } if (column.ForeignKey) { foreignAddList.Add(column); } result.Add(builder.ToString( )); builder.Clear( ); } else { EditableColumn eColumn = column as EditableColumn; if (eColumn.NameChanged) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("RENAME COLUMN ").Append(eColumn.OldName).Append(" TO ").Append(eColumn.Name); result.Add(builder.ToString( )); builder.Clear( ); } if (eColumn.TypeChanged || eColumn.NullableChanged) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("MODIFY ").Append(column.Name).Append(' ').Append(eColumn.Type); if (TypesWithLength.Contains(eColumn.Type)) { builder.Append('(').Append(DefaultLength).Append(')'); } if (eColumn.NullableChanged) { if (!eColumn.Nullable) { builder.Append(" NOT NULL"); } else { builder.Append(" NULL"); } } result.Add(builder.ToString( )); builder.Clear( ); } if (eColumn.PrimaryChanged) { ++changedPKCount; } if (eColumn.PrimaryKey) { primaryList.Add(eColumn); } if ((eColumn.PrimaryKey && !eColumn.PrimaryChanged) || (!eColumn.PrimaryKey && eColumn.PrimaryChanged)) { ++oldPKCount; } if (eColumn.ForeignChanged) { foreignChangeList.Add(eColumn); } } } if (changedPKCount != 0) { if (oldPKCount != 0) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("DROP PRIMARY KEY"); result.Add(builder.ToString( )); builder.Clear( ); } if (primaryList.Count != 0) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("ADD PRIMARY KEY ").Append('('); foreach (var column in primaryList) { builder.Append(column.Name).Append(','); } builder.Remove(builder.Length - 1, 1); builder.Append(')'); result.Add(builder.ToString( )); builder.Clear( ); } } if (foreignAddList.Count != 0) { foreach (Column refColumn in foreignAddList) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("ADD FOREIGN KEY (").Append(refColumn.Name).Append(')') .Append("REFERENCES ").Append(refColumn.SourceTable).Append('(') .Append(refColumn.SourceColumn).Append(')'); result.Add(builder.ToString( )); builder.Clear( ); } } if (foreignChangeList.Count != 0) { foreach (EditableColumn refColumn in foreignChangeList) { if (refColumn.OldForeignKey) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("DROP CONSTRAINT ").Append(refColumn.FKName); result.Add(builder.ToString( )); builder.Clear( ); } if (refColumn.ForeignKey) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' '); builder.Append("ADD FOREIGN KEY (").Append(refColumn.Name).Append(')') .Append("REFERENCES ").Append(refColumn.SourceTable).Append('(') .Append(refColumn.SourceColumn).Append(')'); result.Add(builder.ToString( )); builder.Clear( ); } } } if (_nameModified) { builder.Append("ALTER TABLE ").Append(_originalName).Append(' ') .Append("RENAME TO ").Append(_tableName); result.Add(builder.ToString( )); builder.Clear( ); } return(result); }