Usando ADO con MySQL y MS Access
La forma más común de usar datos que no son directamente manejados desde
VFP es usando el proveedor OLE DB (se utiliza ADO para su manejoA). Este
proveedor te permite conectarte con datos con el formato de otros programas
(MS Access, MS SQL Server, MySQL, etc.) ejecutando sentencias SQL estándar.
Así por ejemplo si estas manejando un proveedor de datos para MS Access y
quieres cambiar a MS SQL solo basta con cambiar pequeñas parte de tu “cadena
de conexión” (que es una propiedad de la conexión) y es todo, ya has migrado a
MS SQL sin modificar las sentencias SQL estándar.
Éste artículo se enfoca en la propiedad ConnectionString de un objeto
[Link], que es donde se encuentra la información necesaria para
realizar una conexión con un proveedor de datos. Los valores usados en la
“ConnectionString” consiste en uno o más argumentos ADO usados para
entablar la conexión.
Los argumentos dependen del proveedor que vayamos a utilizar como ejemplo
en MS Access una cadena de conexión (con la información mínima necesaria)
sería:
“Provider=[Link].4.0;Data Source=C:\Archivos
de programa\Microsoft Office\Office10\Samples\[Link]”
donde:
Argumento Descripción
Provider Proveedor de datos (algo así como el
traductor entre aplicaciones)
Data Source Base de datos
Veamos el siguiente ejemplo que muestra como realizar una conexión con la
base de datos MS Access Neptuno (en español), y ejecuta una consulta a la tabla
de clientes y muestra todos los nombres de clientes en la pantalla
LOCAL cConnectionString, oCnx
*Generamos la cadena de conexión
*OJO: los argumentos y la cantidad de estos depende
* del proveedor que se este utilizando
cConnectionString = "Provider=" + ; && Argumento
"[Link].4.0;" + ; && Valor del argumento
"Data Source="+; && Argumento
"C:\Archivos de programa\Microsoft Office\Office10\Samples\[Link]"
*Creamos el objeto para la conexión
oCnx = CREATEOBJECT('[Link]')
Denny Infante Juárez [Link]/vfp/
*Asignamos la cadena de conexión que contiene
*la información necesaria para realizar la conexión
[Link] = cConnectionString
*"Abrimos" la conexión
[Link]
IF [Link] = 1 Then &&Si se consiguió entablar la conexión
*Ejecutamos una sentencia SQL estándar
*el método Execute devuelve un recordset que almacenamos en rs
rs = [Link]('Select * from Clientes')
*Nos movemos al primer registro
[Link]
*"Barremos" toda la base de datos
DO WHILE not [Link]
?[Link](1).Value && imprimimos en pantalla el valor
[Link] && nos movemos al siguiente registro
ENDDO
[Link]
[Link]
ELSE
? "Error no se logró entablar la conexión...."
ENDIF
Como ven es muy sencillo utilizar el OLE DB con ADO, existen otros argumentos
importantes dentro de la cadena de conexión pero los valores predeterminados
normalmente son los más comunes, como la localización de recordset, el tiempo
de espera para la conexión entre otros.
Esto da pie a utilizar las características de OOP de VFP para crear una clase para
el manejo de conexiones que nos facilite aún más el manejo de éstas.
El siguiente código define una clase para la conexiones utilizando el ADO, si
quieren más detalle de cómo se creó las clase que se muestran a continuación
visiten [Link]/vfp/ en la sección de tutoriales.
Ver código de la clase MDADOConexion en los archivos anexos
Denny Infante Juárez [Link]/vfp/
Un ejemplo de como utilizar la clase MDADOConexion sería:
Local oCnx, lcRs
oCnx = CreateObject("MDADOConnection")
[Link] = "Cadena de conexión que se uso en el ejemplo
anterior para conectarse con MS Access"
*"Abrimos" la conexión
[Link]
IF [Link] = 1 Then &&Si se consiguió entablar la conexión
*Ejecutamos una sentencia SQL estándar
*el método SQLQuery devuelve un recordset que almacenamos en rs
rs = [Link]('Select * from Clientes')
*Nos movemos al primer registro
[Link]
*"Barremos" toda la base de datos
DO WHILE not [Link]
?[Link](1).Value && imprimimos en pantalla el valor
[Link] && nos movemos al siguiente registro
ENDDO
[Link]
[Link]
ELSE
? "Error no se logró entablar la conexión...."
ENDIF
Denny Infante Juárez [Link]/vfp/
MS Access
Viéndolo con el ejemplo anterior vemos que la clase anterior no nos facilita el
manejo de la conexión pero si la tomamos como base para otra clase; específica
para el manejo del proveedor de MS Access, quedaría algo así:
DEFINE CLASS MDAccessCnx AS MDADOConexion
PROTECTED ConnectionString && "Escondemos" la propiedad ConnectionString
*Argumentos utilizados por el proveedor (propiedades en la clase)
DBFile = '' && Archivo de base de datos de Access
DBPassWord = '' && Clave para abrir la base de datos
UserName = '' && Nombre de usuario
Pwd = '' && Clave de acceso del usuario
PROCEDURE Open
Local lRet
lRet = .F.
With This
*Checamos que se haya asignado un valor a la propiedad DBFile
If !Empty(.DBFile) Then
*Checamos que el archivo exista
If File(.DBFile) Then
*Generamos la cadena de conexión y la asignamos a la
*propiedad ConnectionString
[Link] = “Provider=[Link].4.0;" +;
"User ID=" + AllTrim(.UserName) + ";" +;
"Data Source=" + AllTrim(.DBFile) +;
";Persist Security Info=False;" + ;
"Jet OLEDB:Database Password=" + AllTrim(.DBPassWord)
*Ejecutamos el procedimiento definido en la clase base
lRet = DoDefault()
EndIf
EndIf
EndWith
Return lRet
ENDPROC
ENDDEFINE
Denny Infante Juárez [Link]/vfp/
El ejemplo para usar la clase MDAccessCnx
Local lcCnx, lcRs
lcCnx = CreateObject("MDAccessCnx")
With lcCnx
.DBFile = "C:\Path\[Link]"
.Open()
EndWith
*!* Los otros argumentos se asignarían solamente si son necesarios
*Ejecutar los Querys
lcRs = [Link]("Select * From Tabla Order By Campo")
If [Link] > 0 then && Existen registros en el recordset
For i = 1 to [Link]
?[Link](0).Value
[Link]
Next i
EndIf
[Link]()
Ahora sí, ya se ve la diferencia en el uso de esta clase, más que todo es la
simplificación en el manejo de la cadena de conexión, esto debido a que varios
valores en los argumentos son específicos para cada proveedor.
Por cierto se dieron cuenta que también estamos viendo reutilización de código
existente.
Denny Infante Juárez [Link]/vfp/
MySQL
La intención de lo anterior era empezar desde lo más fácil y sobre todo que lo
pudieran comprobar (creo que cualquiera puede conseguir una base de datos de
Access) espero que se haya entendido ya que ahora pasaremos al objetivo
central de éste artículo, la conexión con MySQL.
Los requisitos para poder ejecutar los ejemplos mostrados son:
1. Tener instalado MySQL
2. Tener instalado MyOLEDB ([Link], yo use éste)
Todo lo pueden conseguir en [Link] (son gratis bajo ciertas
circunstancias)
Los argumentos necesarios en al cadena de conexión para conectarse con una
base de datos MySQL son:
Argumento Valor
Provider MySQLProv.3.0 -> el proveedor de
datos específico para MySQL
Data Source Nombre de la base de datos a
conectarnos
Integrated Security Seguridad
Password Clave de acceso del usuario
User ID Nombre de usuario
Location IP del servidor donde se encuentra el
servidor MySQL
Extended Properties Propiedades extendidas
Cuando bajen MyOLEDB (el que yo bajé), tiene un archivo de ayuda en el cual
explica a detalle cada una de las propiedades del proveedor de datos.
De acuerdo con la tabla, el argumento Provider es constante y; para éste
ejemplo utilizaremos solamente los argumentos Data Source, Password, User ID
y Location. Por lo tanto nuestra clase tendrá esas mismas propiedades.
La clase para esta conexión deriva de la clase base MDADOConexion, verán que
resulta muy sencillo cuando ya tenemos la base para las conexiones:
Denny Infante Juárez [Link]/vfp/
DEFINE CLASS MDMySQLCnx AS MDADOConexion
HIDDEN ConnectionString
*Argumentos utilizados por el proveedor (propiedades en la clase)
DataBaseName = '' &&Nombre de la base de datos
UserName ='' &&Nombre de usuario
Pwd = '' &&Password del usuario
IP = '' &&Dirección de IP o Host
PROCEDURE Open
Local lRet
lRet = .F.
With This
*Generamos la cadena de conexión y la asignamos a la
*propiedad ConnectionString
[Link] = 'Provider=MySqlProv.3.0;' + ;
'Data Source=vfpsample;' + ;
'Integrated Security="";' +;
'Password=' + ALLTRIM([Link]) +;
';User ID=' + ALLTRIM([Link]) +;
';Location=' + ALLTRIM([Link]) +;
';Extended Properties=""'
*Ejecutamos el procedimiento definido en la clase base
*Estamos viendo reutilización de clases sin querer :o)
lRet = DoDefault()
EndWith
Return lRet
ENDPROC
ENDDEFINE
Y es todo, ya tenemos una clase para la conexión con MySQL a través utilizando
ADO; solamente queda por hacer un ejemplo de cómo utilizar la clase:
Por favor vean el ejemplo ([Link]) en los archivos anexos
Lo mismo pueden hacer para MS SQL, solo cambien los argumentos.
Pues bien, espero que les sea de utilizad, si tiene algún comentario pueden
hacérmelo llegar a denny_infante@[Link]
Saludos a todos
dij. ..
Denny Infante Juárez [Link]/vfp/