예제 #1
0
        private void CheckCircleReferences(Table table, TableMappingDefinition mappingDefinition)
        {
            if (_tablesToUpdateCircleReferences.ContainsKey(table.Name))
            {
                _tablesToUpdateCircleReferences[table.Name].ForEach(r =>
                {
                    TableMappingDefinition temp = _tableMappingDefinitions.Single(d => d.DestinationTable.Name.Equals(r.OriginTableName));
                    FieldMappingDefinition fieldMappingDefinition = temp.FieldMappingDefinitions.SingleOrDefault(f => f.DestinationField.Name.Equals(r.OriginFieldName));
                    if (fieldMappingDefinition != null)
                    {
                        SourceTable sourceTable           = temp.SourceTable;
                        Field sourceField                 = fieldMappingDefinition.SourceField;
                        DestinationTable destinationTable = temp.DestinationTable;
                        Field destinationField            = fieldMappingDefinition.DestinationField;
                        FieldMappingInfo info             = new FieldMappingInfo
                        {
                            DestinationField = destinationField,
                            DestinationTable = destinationTable,
                            SourceField      = sourceField,
                            SourceTable      = sourceTable
                        };

                        mappingDefinition.CircleReferences.Add(info);
                    }
                });
            }
        }
        public string GenerateFormatFile(BcpDirection direction)
        {
            List <FieldMappingDefinition> fieldMappingDefs = _definition.FieldMappingDefinitions;
            string fields = "";
            int    count  = 0;

            for (int i = 0; i < fieldMappingDefs.Count; i++)
            {
                FieldMappingDefinition definition = fieldMappingDefs[i];
                if (definition.Type != FieldMappingType.Simple)
                {
                    continue;
                }

                // have a problem with (max) datatype in bcp so we handle it seperately
                if ((definition.DestinationField.IsMaxDataType) && _definition.HandleMaxTextSeperately)
                {
                    continue;
                }

                string bcpFormat;
                if (_mode == BcpMode.Native)
                {
                    bcpFormat = BcpTemplates.BCP_NATIVE_FORMAT_ROW;
                }
                else
                {
                    bcpFormat = i < fieldMappingDefs.Count - 1 ? BcpTemplates.BCP_CHARACTER_FORMAT_ROW
                                                                                      : BcpTemplates.BCP_CHARACTER_FORMAT_LAST_ROW;
                }

                string dataType          = definition.DestinationField.SqlDataType;
                int    prefixLength      = definition.DestinationField.PrefixLength;
                int    length            = definition.DestinationField.Length;
                int    serverColumnOrder = definition.DestinationField.Order;
                string serverColumnName  = definition.DestinationField.Name;
                string collation         = definition.DestinationField.Collation;
                fields += bcpFormat.Inject(new
                {
                    Index             = ++count,
                    DataType          = dataType,
                    PrefixLength      = prefixLength,
                    Length            = length,
                    ServerColumnOrder = direction == BcpDirection.Export ? count : serverColumnOrder,
                    ServerColumnName  = serverColumnName,
                    Collation         = string.IsNullOrEmpty(collation) ? @"""""" : collation
                }) + Environment.NewLine;
            }

            string formatFile = BcpTemplates.BCP_FORMAT_FILE.Inject(new
            {
                FieldCount = count,
                Fields     = fields
            });

            return(formatFile);
        }
        private void Generate(FieldMappingDefinition definition, List <string> targetInsertExpressions, List <string> sourceInsertExpressions, List <string> sourceSelectExpressions)
        {
            Field sourceField      = definition.SourceField;
            Field destinationField = definition.DestinationField;

            // SourceSelectFields, SourceInsertFields, SourceConditions
            if (destinationField.Type.HasFlag(FieldType.ForeignKey))
            {
                sourceSelectExpressions.Add(SqlScriptTemplates.FK_SELECT.Inject(new
                {
                    FKTable      = sourceField.Reference.ReferenceTableName,
                    SourceFKName = sourceField.Name
                }));

                string newFieldName = string.Format(SqlScriptTemplates.NEW_FIELD, sourceField.Name);
                sourceInsertExpressions.Add(newFieldName);
            }
            else if (definition.Type == FieldMappingType.BlobToBlobPointer)
            {
                sourceSelectExpressions.Add(SqlScriptTemplates.BLOB_SELECT.Inject(new
                {
                    SourceBlobFieldName = sourceField.Name,
                    SourcePKName        = GetSourcePrimaryKey().Name
                }));

                sourceInsertExpressions.Add(string.Format(SqlScriptTemplates.NEW_FIELD, sourceField.Name));
            }
            else
            {
                string sourceInsertExpression;
                if (!string.IsNullOrEmpty(definition.ForceValue))
                {
                    sourceInsertExpression = string.Format("'{0}'", definition.ForceValue);
                }
                else if (sourceField.Name.Contains("created_who"))
                {
                    sourceInsertExpression = SqlScriptTemplates.FIELD_NULL_DEFAULT_VALUE.Inject(new
                    {
                        FieldName = sourceField.Name,
                        Value     = "'Database Migration Tool'"
                    });
                }
                else if (sourceField.Name.Contains("created_when"))
                {
                    sourceInsertExpression = SqlScriptTemplates.FIELD_NULL_DEFAULT_VALUE.Inject(new
                    {
                        FieldName = sourceField.Name,
                        Value     = "GETDATE()"
                    });
                }
                else
                {
                    sourceInsertExpression = string.Format(SqlScriptTemplates.FIELD, sourceField.Name);
                }

                sourceInsertExpressions.Add(sourceInsertExpression);
            }

            // TargetInsertFields
            targetInsertExpressions.Add(string.Format(SqlScriptTemplates.FIELD, destinationField.Name));
        }