DbfDataReader is a small fast .Net Core library for reading dBase, xBase, Clipper and FoxPro database files
Usage, to get summary info:
var dbfPath = "path\\file.dbf";
using (var dbfTable = new DbfTable(dbfPath, Encoding.UTF8))
{
var header = dbfTable.Header;
var versionDescription = header.VersionDescription;
var hasMemo = dbfTable.Memo != null;
var recordCount = header.RecordCount;
foreach (var dbfColumn in dbfTable.Columns)
{
var name = dbfColumn.ColumnName;
var columnType = dbfColumn.ColumnType;
var length = dbfColumn.Length;
var decimalCount = dbfColumn.DecimalCount;
}
}and to iterate over the rows:
var skipDeleted = true;
var dbfPath = "path/file.dbf";
using (var dbfTable = new DbfTable(dbfPath, Encoding.UTF8))
{
var dbfRecord = new DbfRecord(dbfTable);
while (dbfTable.Read(dbfRecord))
{
if (skipDeleted && dbfRecord.IsDeleted)
{
continue;
}
foreach (var dbfValue in dbfRecord.Values)
{
var stringValue = dbfValue.ToString();
var obj = dbfValue.GetValue();
}
}
}There is also an implementation of DbDataReader:
var options = new DbfDataReaderOptions
{
SkipDeletedRecords = true
// Encoding = EncodingProvider.GetEncoding(1252);
};
var dbfPath = "path/file.dbf";
using (var dbfDataReader = new DbfDataReader(dbfPath, options))
{
while (dbfDataReader.Read())
{
var valueCol1 = dbfDataReader.GetString(0);
var valueCol2 = dbfDataReader.GetDecimal(1);
var valueCol3 = dbfDataReader.GetDateTime(2);
var valueCol4 = dbfDataReader.GetInt32(3);
}
}which also means you can bulk copy to MS SqlServer:
var options = new DbfDataReaderOptions
{
SkipDeletedRecords = true
// Encoding = EncodingProvider.GetEncoding(1252);
};
var dbfPath = "path/file.dbf";
using (var dbfDataReader = new DbfDataReader(dbfPath, options))
{
using (var bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = "DestinationTableName";
try
{
bulkCopy.WriteToServer(dbfDataReader);
}
catch (Exception ex)
{
Console.WriteLine($"Error importing: dbf file: '{dbfPath}', exception: {ex.Message}");
}
}
}There is also an implementation of DbConnection so you can query a folder of files e.g.
var dbConnection = new DbfDbConnection(string.Empty, string.Empty);
dbConnection.ConnectionString = $"Folder=./test/fixtures;SkipDeletedRecords=false";
dbConnection.Open();
var dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = "select * from dbase_03.dbf;";
var reader = await dbCommand.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
var valueCol1 = reader.GetString(0);
var valueCol11 = reader.GetDecimal(10);
}The connection string supports the options available in DbfDataReaderOptions:
- Folder - the folder containing the files to be queried
- required
- string
- Encoding - the encoding to be used
- optional
- string
- valid Encoding name from Encoding
- ReadFloatsAsDecimals - whether to read floats as decimals
- optional
- boolean
- defaults to false
- SkipDeletedRecords - whether to skip deleted records
- optional
- boolean
- defaults to true
- StringTrimming - string timming behaviour
- optional
- string
- defaults to 'None'
- one of 'None', 'Trim', 'TrimStart', 'TrimEnd'
Used by
-
DbfBulkCopy
Command line application to bulk copy from DBF files to MS SqlServer
-
dbf
Command line utility to display DBF info and contents