Ejemplo n.º 1
0
        private string GetColumnDataType(MsAccessColumnSchema column)
        {
            switch (column.OleDbType)
            {
            case OleDbType.Boolean:
                return("Bit");

            case OleDbType.TinyInt:
            case OleDbType.UnsignedTinyInt:
                return("Byte");

            case OleDbType.SmallInt:
            case OleDbType.UnsignedSmallInt:
                return("Short");

            case OleDbType.Integer:
            case OleDbType.BigInt:
            case OleDbType.UnsignedInt:
            case OleDbType.UnsignedBigInt:
                return("Long");

            case OleDbType.Decimal:
            case OleDbType.Numeric:
                return("Decimal");

            case OleDbType.Currency:
                return("Currency");

            case OleDbType.Single:
                return("Single");

            case OleDbType.Double:
                return("Double");

            case OleDbType.Date:
                return("DateTime");

            case OleDbType.Guid:
                return("Text");

            case OleDbType.Char:
            case OleDbType.WChar:
            case OleDbType.VarChar:
            case OleDbType.VarWChar:
            case OleDbType.LongVarWChar:
            case OleDbType.LongVarChar:
                if (column.Size > 0)
                {
                    return($"Text Width {column.Size}");
                }
                else
                {
                    return("Memo");
                }

            default:
                throw new InvalidOperationException(
                          $"Nepodporovaný dátový typ pre MsAccessBulkInsert: OleDbType.{column.OleDbType}");
            }
        }
        private static void CheckColumnSchema(
            ColumnSchema column,
            OleDbType oleDbType,
            object defaultValue,
            bool allowNull,
            int?size,
            byte?precision,
            byte?scale)
        {
            MsAccessColumnSchema msAccessColumn = (MsAccessColumnSchema)column;
            string columnName = msAccessColumn.Name;

            msAccessColumn.OleDbType.Should().Be(oleDbType, $"{columnName} should have correct OleDbType.");
            msAccessColumn.AllowNull.Should().Be(allowNull, $"{columnName} should allow NULL.");
            if (defaultValue != null)
            {
                msAccessColumn.DefaultValue.Should().Be(defaultValue, $"{columnName} should have correct default value.");
            }
            if (size.HasValue)
            {
                msAccessColumn.Size.Should().Be(size, $"{columnName} should have correct size.");
            }
            if (precision.HasValue)
            {
                msAccessColumn.Precision.Should().Be(precision, $"{columnName} should have correct precision.");
            }
            if (scale.HasValue)
            {
                msAccessColumn.Scale.Should().Be(scale, $"{columnName} should have correct scale.");
            }
        }
 // Returns type of the column for bulk insert based on column's data type.
 private static BulkInsertColumnType GetColumnType(MsAccessColumnSchema column)
 {
     if ((column.OleDbType == OleDbType.VarChar) ||
         (column.OleDbType == OleDbType.VarWChar) ||
         (column.OleDbType == OleDbType.LongVarChar) ||
         (column.OleDbType == OleDbType.LongVarWChar) ||
         (column.OleDbType == OleDbType.Char) ||
         (column.OleDbType == OleDbType.WChar))
     {
         return(BulkInsertColumnType.Text);
     }
     return(BulkInsertColumnType.Undefined);
 }
Ejemplo n.º 4
0
 private void InitBulkInsert(string dataFilePath, IDataReader data)
 {
     using (StreamWriter schemaFile = InitSchemaFile(dataFilePath))
     {
         var         schemaLoader = new MsAccessSchemaLoader();
         TableSchema tableSchema  = schemaLoader.LoadTableSchema(_connection, DestinationTableName);
         for (int i = 0; i < data.FieldCount; i++)
         {
             MsAccessColumnSchema column = tableSchema.Columns[data.GetName(i)] as MsAccessColumnSchema;
             Columns.Add(column);
             int colNumber = i + 1;
             schemaFile.WriteLine($"Col{colNumber}=F{colNumber} {GetColumnDataType(column)}");
         }
     }
 }
        private void InitExplicitSchemaColumns(StreamWriter schemaFile)
        {
            var         schemaLoader = new MsAccessSchemaLoader();
            TableSchema tableSchema  = schemaLoader.LoadTableSchema(_connection, DestinationTableName);

            for (int columnNumber = 0; columnNumber < ColumnMappings.Count; columnNumber++)
            {
                MsAccessColumnSchema     databaseColumn   = null;
                MsAccessBulkInsertColumn bulkInsertColumn = _columns[columnNumber];
                BulkInsertColumnMapping  mapping          = bulkInsertColumn.Mapping;
                if (!string.IsNullOrWhiteSpace(mapping.DestinationName))
                {
                    if (tableSchema.Columns.Contains(mapping.DestinationName))
                    {
                        databaseColumn = (MsAccessColumnSchema)tableSchema.Columns[mapping.DestinationName];
                    }
                    else
                    {
                        ThrowExceptionInvalidDestinationColumnMapping(columnNumber, null, mapping.DestinationName);
                    }
                }
                else if (mapping.DestinationOrdinal >= 0)
                {
                    if (mapping.DestinationOrdinal >= tableSchema.Columns.Count)
                    {
                        ThrowExceptionInvalidDestinationColumnMapping(columnNumber, mapping.DestinationOrdinal);
                    }
                    else
                    {
                        databaseColumn = (MsAccessColumnSchema)tableSchema.Columns[mapping.DestinationOrdinal];
                    }
                }
                else
                {
                    ThrowExceptionInvalidDestinationColumnMapping(columnNumber);
                }
                bulkInsertColumn.DestinationColumnName = databaseColumn.Name;
                bulkInsertColumn.ColumnType            = GetBulkInsertColumnType(databaseColumn);
                WriteSchemaColumnInfo(schemaFile, columnNumber + 1, databaseColumn);
            }
        }
        private void InitImplicitSchemaColumns(StreamWriter schemaFile, IDataReader data)
        {
            var         schemaLoader = new MsAccessSchemaLoader();
            TableSchema tableSchema  = schemaLoader.LoadTableSchema(_connection, DestinationTableName);

            for (int columnNumber = 0; columnNumber < data.FieldCount; columnNumber++)
            {
                string columnName = data.GetName(columnNumber);
                if (tableSchema.Columns.Contains(columnName))
                {
                    MsAccessColumnSchema column = (MsAccessColumnSchema)tableSchema.Columns[columnName];
                    _columns.Add(new MsAccessBulkInsertColumn(columnName, column.Name, GetBulkInsertColumnType(column)));
                    WriteSchemaColumnInfo(schemaFile, columnNumber + 1, column);
                }
                else
                {
                    throw new InvalidOperationException(
                              string.Format(Resources.BulkInsertColumnDoesNotExistInDestination, columnName));
                }
            }
        }
 /// <summary>
 /// Adds column based on database column schema <paramref name="column"/>.
 /// </summary>
 /// <param name="column">Database column schema.</param>
 public void Add(MsAccessColumnSchema column)
 {
     Add(new MsAccessBulkInsertColumn(column.Name, GetColumnType(column)));
 }
 private void WriteSchemaColumnInfo(StreamWriter schemaFile, int columnNumber, MsAccessColumnSchema column)
 {
     schemaFile.WriteLine($"Col{columnNumber}=F{columnNumber} {GetColumnDataType(column)}");
 }