public static void Process(this DbfDataReader.DbfDataReader reader)
        {
            // NOTE: DbfDataReader column  schema doesn't seem to agree with GetFieldType

            var cols = reader.GetColumnSchema();

            bool[]     allowDbNull = cols.Select(c => c.AllowDBNull != false).ToArray();
            TypeCode[] types       = new TypeCode[cols.Count];
            for (int i = 0; i < types.Length; i++)
            {
                var t = reader.GetFieldType(i);
                t        = Nullable.GetUnderlyingType(t) ?? t;
                types[i] = Type.GetTypeCode(t);
            }
            while (reader.Read())
            {
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    if (allowDbNull[i] && reader.IsDBNull(i))
                    {
                        continue;
                    }
                    ProcessField(reader, i, types[i]);
                }
            }
        }
        public void DbfData()
        {
            var ms   = new MemoryStream(dbfData);
            var opts = new DbfDataReader.DbfDataReaderOptions()
            {
                SkipDeletedRecords = true
            };
            var dr = new DbfDataReader.DbfDataReader(ms, opts);

            dr.Process();
        }
        static void ProcessField(this DbfDataReader.DbfDataReader reader, int i, TypeCode typeCode)
        {
            switch (typeCode)
            {
            case TypeCode.Boolean:
                reader.GetBoolean(i);
                break;

            case TypeCode.Int32:
                reader.GetInt32(i);
                break;

            case TypeCode.Int64:
                reader.GetInt64(i);
                break;

            case TypeCode.DateTime:
                reader.GetDateTime(i);
                break;

            case TypeCode.Single:
                reader.GetFloat(i);
                break;

            case TypeCode.Double:
                reader.GetDouble(i);
                break;

            case TypeCode.Decimal:
                reader.GetDecimal(i);
                break;

            case TypeCode.String:
                reader.GetString(i);
                break;

            default:
                // no cheating
                throw new NotSupportedException("" + typeCode);
            }
        }
示例#4
0
        private static void DoBulkCopy(SqlConnection connection, Options options)
        {
            Console.WriteLine("Begin bulk copy");

            var stopwatch = new Stopwatch();

            stopwatch.Start();

            var rowsCopied     = 0L;
            var dbfRecordCount = 0L;

            using (var dbfDataReader = new DbfDataReader.DbfDataReader(options.Dbf))
            {
                dbfRecordCount = dbfDataReader.DbfTable.Header.RecordCount;

                using (var bulkCopy = new SqlBulkCopy(connection))
                {
                    bulkCopy.BulkCopyTimeout      = options.BulkCopyTimeout;
                    bulkCopy.DestinationTableName = options.Table;

                    try
                    {
                        bulkCopy.WriteToServer(dbfDataReader);
                        rowsCopied = bulkCopy.RowsCopied();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"Error importing: dbf file: '{options.Dbf}', exception: {ex.Message}");
                    }
                }
            }

            stopwatch.Stop();
            Console.WriteLine($"Bulk copy completed in {GetElapsedTime(stopwatch)}s");
            Console.WriteLine($"Copied {rowsCopied} of {dbfRecordCount} rows");
        }