Migrar datos de una tabla .dbf FoxPro a SQLite, Mysql, Sqlserver con C#

· 3 min de lectura
Migrar datos de una tabla .dbf FoxPro a SQLite, Mysql, Sqlserver con C#

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