Professional Documents
Culture Documents
can use Microsoft OLE DB Provider for Visual FoxPro or Visual FoxPro
ODBC Driver to load data from Visual FoxPro, and then upload into
SQL Server.
Below are the detail steps for your reference:
Before starting the steps, please make sure the Microsoft OLE DB
Provider for Visual FoxPro and Visual FoxPro ODBC Driver is installed.
Solution1: Use the Microsoft OLE DB Provider for Visual FoxPro to load
data from Visual FoxPro database
1.
2.
3.
4.
5.
vfpodbc.dll
Cmo consumir datos de Visual Foxpro en sistemas .NET de 64 bits utilizando un servidor
vinculado
Introduccin
Nos hemos puesto un poco nostlgicos, as que ac volcamos nuestra experiencia reciente
en integrar datos de Visual Foxpro (32 bits) en un entorno de IIS de 64 bits, que no poda
reducirse a correr 32 bits por condiciones de borde de la instalacin.
Como es sabido, los sistemas operativos han ido migrando lentamente hacia los 64 bits. Entre
otras ventajas, se tiene mayor direccionamiento en memoria RAM, y un rendimiento ms
slido en los entornos de 64 bits, y lo ms importante, el foco en los esfuerzos de las grandes
compaas, entre otras ventajas. La migracin de 16 a 32 bits demor casi una dcada, pero
de 32 a 64 est ocurriendo muy rpidamente.
En esta coyuntura, la realidad es que todava existen muchos sistemas desarrollados en torno
a Visual Foxpro, que es una aplicacin de 32 bits. ste puede correr en sistemas operativos
Windows de 64 bits bajo la emulacin WoW64 (Windows on Windows 64), que es
esencialmente un conjunto de tres bibliotecas de enlace dinmico. Estas se encargan de
colocar una capa muy liviana de adaptacin en el sistema de 64 bits, a fin de traducir las
llamadas y las estructuras de los sistemas de 32 bits, sin que stos sufran modificacin
alguna. Sin embargo, por diseo, los manejadores de dispositivos se manejan de forma
distinta. De esta forma, si por ejemplo tenemos una placa de video de tal marca y modelo, y la
queremos usar en un sistema de 64 bits, deberemos indefectiblemente conseguir el driver de
64 bits. Como toda mquina virtual, es sumamente difcil comunicarse fuera de ella. En otras
palabras, los drivers de 32 bits se podrn ver slo dentro del mbito Wow64, es decir: en un
sistema operativo de 64 bits, los drivers de 32 sern visibles para los procesos emulados de
32 bits, pero no lo sern desde fuera de ese mbito.
Ahora, qu tiene que ver esto con Visual FoxPro? Bueno, fundamentalmente, las estrategias
de acceso a datos que corren en Windows son basadas en el modelo ODBC (Open Database
Connectivity). ODBC, en la implementacin para Windows, no es otra cosa que un manejador
de impresora modificado para bases de datos, es decir, funciona y se gestiona de manera muy
parecida a un device-driver de impresora, y por lo tanto, pueden coexistir drivers de 32 y 64 en
un sistema, pero slo sern visibles dentro de sus mbitos respectivos de ejecucin. El rol del
driver ODBC es anlogo al manejador de impresora: as como un controlador de una
determinada impresora entiende el lenguaje y los comandos de la misma (sean sos PCL,
Postcript, etc.), del mismo modo un manejador ODBC entiende las particularidades de una
determinada base de datos. Y con OLEDB pasa ms o menos lo mismo, recordemos que OLE
DB es un derivado de ODBC, que introduce el modelo de objetos COM a ODBC, y copia su
modelo de doble bfer, etc., con lo cual hay mucha similitud conceptual en cuanto al driver en
s (y no tanta similitud en cmo expone los datos hacia el cliente).
Escenarios posibles entre cliente y servidor
Suponiendo que tenemos un ejecutable de una aplicacin cliente que desea acceder a un
servidor de datos. Las combinaciones posibles seran estas, siempre hablando de un sistema
operativo de 64 bits:
Cliente
Servidor
Driver de 64 b
32 bits
32 bits
Invisible desde
para conectars
32 bits
64 bits
Invisible desde
para conectars
64 bits
32 bits
64 bits
64 bits
Visible desde e
conectar.
Luego, si de VFP y de SQL Server se tratase, podemos asumir como cliente a VFP, y como
servidor a SQL Server, y el cuadro de arriba sera vlido igualmente. Si nos preguntamos si un
cliente de 64 bits podra conectarse a un servidor que corre en 32 bits, la respuesta es: si, en
la medida que exista el driver del lado del cliente. Supongamos que existiera un VFP de 64
bits, y se corre una instancia de SQL Server de 32 bits. Como SQL Server es un servicio de
datos que funciona un un protocolo binario (esto es, basado en sockets con trfico bajo un
modelo propietario) llamado TDS (Tabular Data Stream), tendremos que este servicio es
independiente de la versin (32 o 64 bits) que lo produzca: el protocolo es inmutable entre
dichas plataformas. Para que lo veamos mejor, un servidor IIS de 32 bits producir el mismo
HTML que uno de 64 bits, ya que el protocolo de comunicacin HTTP y el formato del mensaje
HTML es conceptualmente siempre el mismo (un documento de texto), independientemente de
la plataforma que lo genere. Anlogamente, es posible entonces conectarse desde un cliente
de 32 a un servidor de 64, siempre y cuando exista el driver de 32 bits para dicho
servicio.
Por ejemplo, si queremos gestionar desde un cliente de 64 bits la creacin y el mantenimiento
de un driver ODBC, slo veremos los drivers de 64 bits. Hagamos la siguiente prueba:
iniciemos el Panel de Control, vayamos a Herramientas administrativas, Configurar orgenes
de datos (ODBC). Pidamos crear una nueva conexin de sistema (DSN de sistema), y
veremos slo los drivers de 64 bits que la PC tenga instalados en ese momento:
Ahora bien, sin cambiar de PC, tratemos de hacer lo mismo desde un cliente de 32 bits, por
ejemplo, desde el mismo Visual FoxPro, creando una base de datos .DBC y generando una
conexin desde all.
Como se aprecia en la figura 2, la cantidad es mayor, y entre ellos , vemos el driver para Visual
FoxPro instalado. Tanto en el cliente de 64 bits (Panel de control) como en el cliente de 32
(VFP) podremos gestionar, por ejemplo, la creacin de una conexin a SQL Server
(independientemente de si el servidor SQL corre en 32 o en 64), porque tenemos ambos
drivers de cliente instalados en la PC. Pero no podremos gestionar una conexin a VFP desde
un cliente de 64, porque no existe el driver.
El problema con ASP.NET, VS y Windows de 64 bits.
Ahora bien, desde Visual Studio 2010, qu sucede?. Supongamos este escenario:
IDE de Visual Studio 2010 convencional, 32 bits, instalado con ajustes por
defecto sobre el Windows anterior.
El objetivo es construir una pgina ASP.NET que acceda a los datos de VFP en ese escenario.
El problema es el siguiente:
Entonces la pregunta es: cmo publicamos una pgina ASP.NET en un servidor IIS montado
en un Windows de 64 bits, que no puede tener compatibilidad de 32 bits por alguna razn, y
que la vez consuma datos de Visual FoxPro?
No existe una respuesta fcil. Las posibilidades que exploramos son las siguientes:
Idea central
Correr el sitio
ASP.NET en IIS
habilitado para
32 bits
Contras
Si bien se
Activar la compatibilidad de 32 bits en IIS de 64 bits, activa la
corriendo en una ventana de comandos la siguiente compatibilidad
instruccin:
de 32 bits en
IIS, al mismo
tiempo se
C:\>cscript %SYSTEMDRIVE
%\inetpub\adminscripts\adsutil.vbs SET
W3SVC/AppPools/Enable32bitAppOnWin64 true
inhabilitan las
de 64 bits.
Luego,
deberamos
tener todos los
sitios corriendo
en IIS en modo
de 32 bits,
aunque el SO
de 64 bits
(estamos
pagando por
algo que no
usamos).
Instalar dos IIS La segunda instalacin de IIS correra en modo de
en el servidor,
No es posible.
de 64
en un mismo
servidor. Si es
resolver por nombre (porque tienen una misma IP pblica) a posible instalar
nivel del IIS principal.
un IIS +
Apache, o bien
dos instancias
de Apache, pero
necesitamos IIS
para correr
ASP.NET.
No se podr
en el espacio de
VFP
64 de bits del
IIS en
produccin.
No es posible,
servicio web
anterior, pero publicarlo como servicio web en el mismo IIS el COM de VFP
con VFP y
de 32 bits no se
publicarlo en el
podr enlazar al
ISAPI de 64
publica las
bits.
pginas
ASP.NET.
dem anterior,
Tericamente
pero publicar el publicar el servicio web de VFP de 32 bits por all. Las
posible, pero
complicado. Al
VFP en un
servidor Apache
servers bajo
de 32 bits.
Intentar
Licencia de
conseguir un
Sybase.
driver de 64
transformacin y carga).
Dnde se lo
bits.
consigue sin
tener ningn
producto
Sybase?
funciona
standalone o
necesita un
software de
Sybase?
donde desde un gran sitio ASP.NET en Windows Server de 64 bits, con SQL Server de 64 bits,
se accede a VFP del driver VFPOLEDB de 32 bits:
para Visual FoxPro, y estaramos listos para lograr el acceso desde las pginas ASP.NET
corriendo desde un servidor de 64 bits.
Una vez que el servidor encadenado est definido, se puede acceder desde cualquier
cliente que tenga un driver de acceso a SQL, sea ste de 32 o de 64 bits. En la figura, el
servidor HTTP instalado es IIS7.x, de 64 bits, que aloja un CLR de 64. Dentro de esa mquina
virtual CLR, el proveedor administrado ADO.NET para SQL Server ser uno regular, nativo, no
existir ningn problema porque slo se necesitar la visibilidad del servicio de datos. El
proveedor administrado hace abstraccin de la plataforma del servidor, porque slo ve los
servicios sin importarle los procesos que lo generan. De este modo, desde .NET y con esta
solucin, se tendr acceso indistintamente a SQL Server regular, de produccin, que puede
ser de 64 bits (alternativa de la figura, donde se asume un SQL server prexistente de 64 bits
para el sistema principal), y al mismo tiempo, a SQL Server Express de 32 bits que aloja el
servidor encadenado, vaco sin tablas nativas.
Configurando el servidor encadenado para que tome el archivo .DBC de Visual FoxPro, se
tendr acceso a todas las tablas de la base de datos Visual Fox, como si estuviesen
residiendo de alguna manera en la instancia SQL Server Express.
Configuracin paso a paso
1. Descargar e instalar SQL Server Express de 32 bits en el servidor IIS, o bien en algn
lugar de la red que sea visible. Luego, hay dar acceso al proceso de SQL Server a la carpeta
que contiene las tablas y el contenedor de base de datos de VFP.
Yendo a la carpeta en cuestin, en el explorador de archivos, hacer clic con botn derecho
sobre la que contiene las tablas y el contenedor DBC, y seleccionar Propiedades, luego
seleccionar la ficha Seguridad. La cuenta que debemos habilitar para acceso no es ninguna
de las consabidas Network Service, ni Local System, ni System, sino la denominada
MSSQL$SQLEXPRESS, como se muestra en la figura de abajo. El no hacerlo impedir que
se pueda acceder a dicha base de datos.
Fig. 4
3. Verificar drivers. Expandir dicho nodo, y se ver el listado de drivers disponibles en el
mbito de 32 bits. Debe estar visible la opcin VFPOLEDB
fig. 5
4. Agregar un nuevo servidor vinculado. Hacer clic con botn derecho sobre el nodo Linked
Servers para agregar un nuevo un servidor vinculado a los datos VFP. Aparece el siguiente
cuadro de dilogo:
Fig. 6
Proveer los siguientes datos:
Nombre del producto: se puede especificar un identificador del producto, en este caso
colocar la misma que el nombre del servidor encadenado.
Origen de datos: especificar el archivo .DBC de bases de datos de VFP, con el camino
completo al directorio. Por ejemplo, C:\MIAPPVFP\DATOS\datos1.dbc
Dejar todos los dems campos en blanco, y hacer clic en Aceptar. Asegurarnos que la
pantalla de alta quede as:
Fig. 7
5. Probar con una nueva consulta. Conectarse a la instancia de SQL Server Express que
aloja el servidor encadenado. Recordemos que al no tener bases de datos de usuario de SQL
Server, no existirn ms que las predeterminadas (master, etc.). Cuando hagamos una
consulta al servidor encadenado MIAPPVFP de este ejemplo, no se trabaja contra ninguna
base de datos nativa, sino contra la representacin interna de la base de datos VFP. En otras
palabras, MIAPPVFP es, al mismo tiempo, servidor y base de datos. Debido a esta
particularidad, para hacer una seleccin SELECT a una tabla de VFP, tendremos dos formas
de acceder:
1. Trabajando directamente con el servidor encadenado, armando consultas en TransactSQL (en la figura 3, el trazo en azul) desde cualquier cliente de datos administrado
de .NET. Esta tcnica enva strings de consultas a la base de datos SQL Server
Express, y el servidor encadenado, a travs de VFPOLEDB, realiza la traduccin
necesaria al dialecto de VFP. Por este motivo, desde ADO.NET no podremos enviar a
ejecutar comandos y funciones propias de VFP, como por ejemplo, SELECT
DTOS(fecha) AS fecha , ya que DTOS() no es una funcin reconocida por T-SQL. El
servidor encadenado recibe la peticin en T-SQL , la traduce al SQL de Visual FoxPro,
ejecuta la consulta, y al recibir la respuesta, acondiciona el conjunto de resultados
como si fuese un resultado nativo de SQL Server para envirselo al cliente que efectu
la peticin de datos.
2. Utilizando la primitiva OPENQUERY de SQL Server, que permite enviar por paso-atravs un string conteniendo comandos nativos de VFP. En este caso, el servidor
fig. 8
5.2 Prueba de consulta con paso-a-travs y OPENQUERY
Cuando sea necesario emitir una consulta que slo puede resolverse a travs de VFP, ser
necesario utilizar el pasfo-a-travs. Para lograr esto, ser necesario utilizar la funcin
OPENQUERY, en el siguiente formato de consulta:
fig. 9
Con esto configurado, estaremos en condiciones de consumir los datos desde pginas
Data Source=SERVPRINC\SQLEXPRESS;User
ID=MiUsuario;Password=MiPassword
Una vez establecido este origen de datos, en nuestro proyecto podremos generar objetos de
datos que accedan a la base contenedora de VFP a travs del servidor vinculado. Por
ejemplo, si utilizsemos el control sqlDataSource para las pginas ASP.NET, podramos
probar una consulta as
fig. 10
Donde el secreto est en configurar el datasource SqlDataSource1 de la siguiente manera:
Fig. 11 y 12
Este comando SELECT debe especificarse con sintaxis T-SQL de SQL Server, no con el
dialecto de Visual FoxPro. Ntese que hemos definido un parmetro de consulta en la
consulta:
Fig. 13
Prueba de la consulta:
En el siguiente paso del asistente probaremos la consulta. En nuestro caso, a los fines de
verificacin solamente, hemos creado varias entradas en la tabla (doc_nro no es clave
primaria en este test) con un mismo documento, para ver si recupera correctamente:
Fig. 14 y 15
Aceptemos todo y el SqlDataSource1 quedar configurado.
Ajuste del control GridView: Para el gridview de la pgina slo bastar hacer clic en su
smarttag (el pequeo tringulo que aparece en la esquina superior derecha al seleccionar el
control con el ratn), y elegir como origen de datos al recin configurado SqlDataSource1.
fig. 16
Al hacerlo, inmediatamente quedar configurada la visual del gridview. Podemos cambiar la
visual del gridview utilizando la opcin AutoFormat, etc. y cambiarle la cabecera a cada
columna utilizando la opcin Edit Columns. A efectos ilustrativos, vemos cmo cambiar la
cabecera de la primera columna, de nombre (que trae de la tabla de datos VFP) a Nombre
de cliente.
fig. 17
Prueba de la pgina:
Pulsamos F5 y aguardamos hasta que aparezca la pgina
fig. 18
Colocamos el numero de documento y pulsamos consultar. A los breves instantes tendremos
la respuesta:
fig. 19
Donde los datos provienen de Visual Foxpro. Tambin podramos haber utilizado un dataset,
etc.
Publicar la pgina en el servidor IIS de 64 bits.
La prueba de fuego ser publicar la pgina al servidor IIS, de 64 bits. Una vez hecho esto,
podremos verificarla para ver si funciona correctamente. Esta es una imagen de la misma
pgina instalada en el servidor de produccin:
fig. 20
Con lo cual, hemos podido publicar los datos de VFP en un entorno ASP.NET con IIS de
64 bits, consumiendo datos de VFP.
Algunos cuidados a tener
1. Campos de tipo fecha: Cuando se utilicen fechas como parmetros, la consulta utilizando
sintaxis de T-SQL no es optimizada en el motor VFP si la columna de filtrado es de tipo fecha.
Por algn motivo, OLEBD para VFP ejecuta una exploracin secuencial completa de toda la
tabla, dando como resultado un rendimiento de consulta sub-ptimo que puede llegar incluso a
una decena de segundos, algo inaceptable para una pgina web. En este caso, si
necesitamos optimizar la consulta por parmetros de fecha en la tabla de VFP, la nica
solucin posible ser utilizar OPENQUERY como se explica en el punto siguiente.
2. Funciones nativas de VFP. Al utilizar sintaxis T-SQL, no podremos enviar una consulta con
funciones propias de VFP, por ejemplo, INSTR() o DTOS() no podran incluirse en la consulta.
Como vimos en el paso anterior, tampoco podramos optimizar una consulta que se haga
sobre fechas de VFP. Para estos casos, debermos utilizar OPENQUERY indefectiblemente, a
fin de pasar slo un string de consulta en dialecto VFP que ser procesado desde el mismo
motor de VFP, sin pasar por ningun proceso de traduccin en el servidor encadenado.
Por ejemplo, supongamos que necesitamos optimizar una consulta por la columna de fecha
llamada fechaVenta en una tabla llamada VENTAS debemos seguir estos pasos:
indexar la tabla de Visual Foxpro con la funcin DTOS, y hacer la consulta desde
ASP.NET con dicha consulta. Suponiendo que la columna sea fechaVenta, debemos
indexarla con INDEX ON DTOS(fechaVenta) TAG fV en Visual Foxpro.
en ASP.NET, configurar los parmetros para que coincidan con el patrn YYYYMMDD
de VFP que devuelve la funcin DTOS(). Por ejemplo, si tenemos una variable dFecha
3. Palabras clave en consulta. Si bien VFP nos deja emitir consultas con nombres de campo
o tablas que coincidan con las palabras clave, como por ejemplo llegar al extremo de colocar
SELECT select FROM select y que ejecute correctamente en VFP, siempre que haya una
tabla llamada SELECT con una columna con nombre SELECT, este tipo de consultas ser
rechazada por VFPOLEDB en el servidor encadenado, dando un error en en la instancia de
traduccin si utilizamos las consultas T-SQL. Incluso utilizando OPENQUERY, la consulta
podra realizarse correctamente en VFP, pero al rearmar la tabla de resultados, VFPOLEDB
dar un error y no se podr obtener el dataset, etc. desde .NET. Por tanto, debemos
asegurarnos que, tanto con consultas en T-SQL como con las especificadas dentro de
OPENQUERY, no se utilicen objetos de la base de datos que coincidan con palabras clave de
T-SQL.
Conclusin
Con la facilidad de servidor vinculado (linked server) que tiene SQL Server Express, podremos
hacer que los procesos de 64 bits consuman los datos de VFP a travs de VFPOLEDB. El
SQL Server Express no tiene costo, y el driver OLEDB para VFP es de descarga gratuita. Con
esta solucin, si bien se agrega una instancia ms al servidor principal o a algn otro de la red,
tenemos la ganancia es que no se debe alterar el mecanismo en .NET de acceso a los datos,
porque seguir siendo el driver nativo que siempre estar disponible, en sistemas de 32 o de
64 bits. As, uno puede tener toda una instalacin de un gran sistema ASP.NET en Windows
Server de 64 bits, y an as acceder a los datos de Visual FoxPro sin necesidad de alterar en
nada la programacin ni la instalacin en produccin del sitio.