Leer archivo de tabla de Visual Fox Pro (DBF) desde SQL Server

En mi trabajo, debido a que varios sistemas que se utilizan han sido desarrollados en Visual Fox, ha surgido la necesidad de leer los archivos de tabla (.DBF), desde SQL Server, para poder importar la información de los sistemas antiguos a los nuevos.

Existen varios driver para realizar esta tarea (dBase, ODBC, OleDB, etc.). En esta entrada me centraré en explicar como leer los archivos de tabla utilizando el driver de OleDB.

Primeramente, hay que instalar el driver OleDB en la computadora que alberga la instancia de SQL Server. El driver puede descargarse aquí. Si no me equivoco, no es necesario reiniciar la computadora ni los servicios de SQL Server luego de la instalación (puedo equivocarme, jejeje :)).

En segundo lugar, hay que asegurarse que el usuario que ejecuta la instancia de SQL Server, tenga permiso de lectura sobre el archivo de tabla DBF. Si se utiliza autenticación de Windows, entonces el usuario de Windows debe tener permiso de lectura sobre el archivo.

Finalmente, para leer el archivo, basta con hacer la lectura utilizando la función T-SQL llamada OPENROWSET, de la siguiente manera:

SELECT *  FROM OPENROWSET(
'VFPOLEDB.1',
'C:\ruta\del\archivo';'';'',
'SELECT * FROM NOMBRE_ARCHIVO')

Por ejemplo, para leer el archivo C:\Users\UsuarioPruebas\Documents\TABLA.dbf, la sentencia sería la siguiente:

SELECT *  FROM OPENROWSET(
'VFPOLEDB.1',
'C:\Users\UsuarioPruebas\Documents';'';'',
'SELECT * FROM TABLA')

El comando ha sido probado en SQL Server 2005, pero creería que también funciona para versiones posteriores (2008, 2012).

Feliz día 🙂

Anuncios

18 pensamientos en “Leer archivo de tabla de Visual Fox Pro (DBF) desde SQL Server

    • No es necesario instalar nada dentro de SQL Server. Solo hay que instalar el driver OLEDB en la computadora donde está la instancia de SQL Server. El instalador es un MSI, y se instala como un programa normal de Windows.

      • Hola Jose, perdon por demorar en responder. Creo que esto de la lectura de DBF tiende a ser algo complicado, pues a mi tambien me ha pasado que en algunos servidores y archivos si me funciona, y en otros no. Entre lo que he logrado observar recomendaria: verificar que el usuario de Windows que ejecuta la instancia de SQL Server tiene permiso de lectura sobre el archivo, y si el archivo no es una tabla libre, sino que forma parte de una base de datos, incluir los archivos de la base de datos e indices en la misma carpeta donde esta el archivo. A veces tambien creo que se debe a la version del lenguaje de programacion con que se creo el DBF.

  1. No se ha registrado el proveedor OLE DB “VFPOLEDB.1”

    pero cuando uso el mismo vfpoledb.1 en visual studio si funciona

      • si, mismo equipo. por eso lo q comentaba de q en vs2010 si funciona

      • Mmm, es extrao, la verdad no me ha pasado. No te da algn otro mensaje?

        El 25 de agosto de 2013 19:34, Souvenirs de IT

      • Lo único que se me ocurre es que el DBF no sea un archivo de tabla libre, sino parte de una base de datos de Visual Fox. Si ese es el caso, se necesita que el archivo .CDX respectivo esté en la misma carpeta que está el DBF.

  2. Hola, espero que aun pueda sapoyarme a pesar que ya tiene años que publicaste la entrada.

    en mi trabajo neesito leer un archivo XLS (excel) desde SQL server 2008, por lo cual ejecuto lo siguiente.

    select * from OPENROWSET(‘Microsoft.ACE.OLEDB.12.0’,
    ‘Excel 12.0;HDR=YES;Database=C:\prueba.xls;’,
    ‘SELECT * FROM [Sheet1$]’);

    Sin embargo al ejecutarlo me manda el siguiente error:

    Msg 7415, Level 16, State 1, Line 1
    Ad hoc access to OLE DB provider ‘Microsoft.ACE.OLEDB.12.0’ has been denied. You must access this provider through a linked server.

    como puedo soulcionarlo, me podrias ayudar.

    De antemano, gracias

    • Hola, la verdad es que nunca he intentado leer un archivo de Excel directamente. Lo que hago usualmente es guardarlo como archivo separado por comas (CSV – MS-DOS) desde Excel, y luego leerlo importarlo a una tabla de SQL Server utilizando algo similar a lo siguiente:

      BULK
      INSERT Tabla — Tabla hacia la cual se importarán los datos
      FROM ‘C:\Ruta\A\Archivo.csv’
      WITH
      (
      FIELDTERMINATOR = ‘,’, — Delimitador de campos
      ROWTERMINATOR = ‘\n’, — Delimitador de filas
      FIRSTROW = 2 — Fila inicial (no encabezado)
      )
      GO

  3. Hola Buenos dias
    Tu aporte me a servido bastante, solo que tengo una inquietud necesito hacer una consulta con varias DBF osea varias tablas o base de datos como lo haria usando tu aporte jejejejej
    mil gracias

    • Hola, me alegro que te haya servido. Lo que se me ocurre es ir leyendo tabla por tabla en un bucle, y almacenando todos los resultados en una sola tabla destino. Podrías crear una tabla temporar en la que coloques las rutas y nombres de las tablas, y recorrerla en un bucle con un cursor. La sentencia con el OPENROWSET iría dentro del bucle, y tendrías que ir colocando la ruta (si los archivos están en distintas carpetas) y el nombre de la tabla en cada iteración.

  4. Tengo un directorio con tablas dbf y quiero pasar todo el directorio a sql me podrian ayudar este es mi codigo… Gracias de ante mano

    DECLARE @PathName VARCHAR(1000), @CMD VARCHAR(520), @sql nvarchar(max)
    SET @PathName = ‘C:\ELITE’
    set @CMD =’DIR “‘ + @PathName + ‘” /b’
    SET @sql =’select * into ‘+@CMD+’ from OPENROWSET(”VFPOLEDB”,”’+@PathName+”’;””;””,”select * from ‘+@CMD+’.dbf”)’
    –EXEC xp_cmdshell @cmd
    exec sp_executesql @sql

  5. Hola Buenos dias.. tengo un directorio con varias tablas dbf y quiero pasar todo el directorio a sql me podrian ayudar con mi inquietud gracias de ante mano… este es mi codigo

    DECLARE @PathName VARCHAR(1000), @CMD VARCHAR(520), @sql nvarchar(max)
    SET @PathName = ‘C:\ELITE’
    set @CMD =’DIR “‘ + @PathName + ‘” /b’
    SET @sql =’select * into ‘+@CMD+’ from OPENROWSET(”VFPOLEDB”,”’+@PathName+”’;””;””,”select * from ‘+@CMD+’.dbf”)’
    –EXEC xp_cmdshell @cmd
    exec sp_executesql @sql

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s