Te presento paso a paso como migrar datos de una tabla .dbf de FoxPro a una tabla Sqlite usando el lenguaje de programación C#.
Comenzamos creando nuestro proyecto usando el IDE Visual Studio.
Seleccionamos como plantilla de proyecto "Aplicación de consola"
asignamos un nombre, seleccionamos la ubicación y indicamos la version de .NET.
Una vez creado el proyecto usando nuget instalamos los siguientes paquetes.
Importamos en nuestro proyecto.
using System.Data.SQLite;
using DbfDataReader;
creamos las variales donde indicamos la ruta de nuestro archivo.dbf, sqlite y la variable skipDeleted para omitir registros eliminados.
var skipDeleted = true;
var pathFiles = @"D:\";
var dbfPath = pathFiles + "example.DBF";
string dbfName = Path.GetFileNameWithoutExtension(dbfPath);
var sqliteDb = pathFiles + dbfName + ".db";
realizamos una validación en la que: si la base de datos sqlite no existe creamos uno caso contrario borramos y creamos uno nuevo.
if (!File.Exists(sqliteDb))
{
SQLiteConnection.CreateFile(sqliteDb);
}
else
{
File.Delete(sqliteDb);
SQLiteConnection.CreateFile(sqliteDb);
}
leemos la cabecera de la tabla .dbf, creamos la tabla sqlite con las mismas columnas contenidas en la tabla .dbf.
using (var dbfTable = new DbfTable(dbfPath))
{
}
using (var connection = new SQLiteConnection($"Data Source={sqliteDb};Version=3;"))
{
connection.Open();
string sql = $"CREATE TABLE IF NOT EXISTS {dbfName} (";
foreach (var dbfColumn in dbfTable.Columns)
{
sql += dbfColumn.ColumnName + " TEXT,";
}
sql = sql.TrimEnd(',');
sql += ")";
SQLiteCommand command = new SQLiteCommand(sql, connection);
command.ExecuteNonQuery();
}
luego leemos los datos e insertamos en nuestra tabla sqlite.
using (var connection = new SQLiteConnection($"Data Source={sqliteDb};Version=3;"))
{
connection.Open();
using var transaction = connection.BeginTransaction();
while (dbfTable.Read(dbfRecord))
{
if (skipDeleted && dbfRecord.IsDeleted)
{
continue;
}
string sql = $"INSERT INTO {dbfName} VALUES (";
foreach (var dbfValue in dbfRecord.Values)
{
sql += "'" + dbfValue.ToString().Replace("'", "''") + "',";
}
sql = sql.TrimEnd(',');
sql += ")";
SQLiteCommand command = new SQLiteCommand(sql, connection);
command.ExecuteNonQuery();
Console.WriteLine(sql);
}
transaction.Commit();
}
Codigo completo
using System.Data.SQLite;
using DbfDataReader;
namespace DbfRead
{
class Program
{
static void Main(string[] args)
{
var skipDeleted = true;
var pathFiles = @"D:\";
var dbfPath = pathFiles + "example.DBF";
string dbfName = Path.GetFileNameWithoutExtension(dbfPath);
var sqliteDb = pathFiles + dbfName + ".db";
if (!File.Exists(sqliteDb))
{
SQLiteConnection.CreateFile(sqliteDb);
}
else
{
File.Delete(sqliteDb);
SQLiteConnection.CreateFile(sqliteDb);
}
using (var dbfTable = new DbfTable(dbfPath))
{
var dbfRecord = new DbfRecord(dbfTable);
using (var connection = new SQLiteConnection($"Data Source={sqliteDb};Version=3;"))
{
connection.Open();
string sql = $"CREATE TABLE IF NOT EXISTS {dbfName} (";
foreach (var dbfColumn in dbfTable.Columns)
{
sql += dbfColumn.ColumnName + " TEXT,";
}
sql = sql.TrimEnd(',');
sql += ")";
SQLiteCommand command = new SQLiteCommand(sql, connection);
command.ExecuteNonQuery();
}
using (var connection = new SQLiteConnection($"Data Source={sqliteDb};Version=3;"))
{
connection.Open();
using var transaction = connection.BeginTransaction();
while (dbfTable.Read(dbfRecord))
{
if (skipDeleted && dbfRecord.IsDeleted)
{
continue;
}
string sql = $"INSERT INTO {dbfName} VALUES (";
foreach (var dbfValue in dbfRecord.Values)
{
sql += "'" + dbfValue.ToString().Replace("'", "''") + "',";
}
sql = sql.TrimEnd(',');
sql += ")";
SQLiteCommand command = new SQLiteCommand(sql, connection);
command.ExecuteNonQuery();
Console.WriteLine(sql);
}
transaction.Commit();
}
}
}
}
}
Puedes revisar y descargar el codigo en mi repositorio de GitHub en el siguiente enlace