Está en la página 1de 7

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


ADODB.Connection, 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=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Archivos
de programa\Microsoft Office\Office10\Samples\Neptuno.mdb”

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
"Microsoft.Jet.OLEDB.4.0;" + ; && Valor del argumento
"Data Source="+; && Argumento
"C:\Archivos de programa\Microsoft Office\Office10\Samples\Neptuno.mdb"

*Creamos el objeto para la conexión


oCnx = CREATEOBJECT('ADODB.Connection')

Denny Infante Juárez www.ambientatec.com/vfp/


*Asignamos la cadena de conexión que contiene
*la información necesaria para realizar la conexión
oCnx.ConnectionString = cConnectionString

*"Abrimos" la conexión
oCnx.Open

IF oCnx.state = 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 = oCnx.Execute('Select * from Clientes')

*Nos movemos al primer registro


rs.MoveFirst

*"Barremos" toda la base de datos


DO WHILE not rs.eof
?rs.fields(1).Value && imprimimos en pantalla el valor
rs.MoveNext && nos movemos al siguiente registro
ENDDO

rs.close
oCnx.Close
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 www.ambientatec.com/vfp/ en la sección de tutoriales.

Ver código de la clase MDADOConexion en los archivos anexos

Denny Infante Juárez www.ambientatec.com/vfp/


Un ejemplo de como utilizar la clase MDADOConexion sería:

Local oCnx, lcRs


oCnx = CreateObject("MDADOConnection")
oCnx.ConnectionString = "Cadena de conexión que se uso en el ejemplo
anterior para conectarse con MS Access"

*"Abrimos" la conexión
oCnx.Open

IF oCnx.state = 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 = oCnx.SQLQuery('Select * from Clientes')

*Nos movemos al primer registro


rs.MoveFirst

*"Barremos" toda la base de datos


DO WHILE not rs.eof
?rs.fields(1).Value && imprimimos en pantalla el valor
rs.MoveNext && nos movemos al siguiente registro
ENDDO

rs.close
oCnx.Close
ELSE
? "Error no se logró entablar la conexión...."
ENDIF

Denny Infante Juárez www.ambientatec.com/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
This.ConnectionString = “Provider=Microsoft.Jet.OLEDB.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 www.ambientatec.com/vfp/


El ejemplo para usar la clase MDAccessCnx

Local lcCnx, lcRs


lcCnx = CreateObject("MDAccessCnx")
With lcCnx
.DBFile = "C:\Path\Archivo.mdb"
.Open()
EndWith
*!* Los otros argumentos se asignarían solamente si son necesarios

*Ejecutar los Querys


lcRs = lcCnx.SQLQuery("Select * From Tabla Order By Campo")
If lcRs.RecordCount > 0 then && Existen registros en el recordset
For i = 1 to lcRs.RecordCount
?lcRs.Fields(0).Value
lcRs.MoveNext
Next i
EndIf

lcCnx.Close()

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 www.ambientatec.com/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 (MyOLEDB3.exe, yo use éste)

Todo lo pueden conseguir en www.mysql.com (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 www.ambientatec.com/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
This.ConnectionString = 'Provider=MySqlProv.3.0;' + ;
'Data Source=vfpsample;' + ;
'Integrated Security="";' +;
'Password=' + ALLTRIM(This.password) +;
';User ID=' + ALLTRIM(This.username) +;
';Location=' + ALLTRIM(This.host) +;
';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 (EjCnxMySQL.prg) 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@hotmail.com

Saludos a todos
dij. ..

Denny Infante Juárez www.ambientatec.com/vfp/

También podría gustarte