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); } }
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"); }