/// <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;
        }
Ejemplo n.º 2
0
        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);
        }