Está en la página 1de 4

Cliente / Servidor

El concepto es el siguiente: un motor de base de datos (MS-SQLServer, Oracle, PostgreSQL,


Informix, etc) ejecutndose
en un servidor con sistema operativo de servidor (Windows NT, Windows 2000 Server, Linux,
Unix, AIX, etc).
La eleccin de uno u otro depende de lo robusto de la aplicacin, seguridad, estabilidad, etc.
Incluso, puede utilizarse la misma base de datos de VFP en el servidor. Tambin puede
utilizarse Access para aplicaciones ms pequeas.

Los ejemplos estn preparados para Microsoft SQL Server 7.0 pero, haciendo una migracin
posterior a Oracle, me di cuenta que hay muy pocas diferencias.
Yo realizo las transacciones a travs de ODBC, pero s que pueden hacerse a travs de
objetos ADO. Me han dicho que es mucho mejor de esta forma, pero an no la he investigado.

Los orgenes de datos DSN

Se supone que ya est instalada la base de datos en un servidor de la red. Lo primero que hay
que hacer es crear un DSN (Data Source Name). Es decir un "vnculo" entre la aplicacin y la
base de datos. Es un nombre para identificar el origen de los datos.
Esto se hace desde el Panel de Control, en el cono Origenes de Datos ODBC (el icono puede
cambiar segn el Windows).
All debe elegirse el tipo de base de datos instalada (Access, MSSQLServer, Oracle, etc) y
crear un nuevo nombre de datos que ser el que utilizaremos para conectar nuestra aplicacin.
En el ejemplo he creado un DNS con el nombre SQLPack, tomando como base el driver de
SQL Server.

Vamos a los ejemplos

La topologa cliente/servidor tiene como objetivo minimizar la cantidad de transacciones entre


la PC cliente y la base de datos en el servidor.
Nuestra aplicacin debe respetar ese concepto para reducir los tiempos de respuesta, pero
sobre todo es primordial reducir el trfico en la red, ya que podemos trabajar en una LAN
donde no habr inconvenientes, pero tambin podremos hacerlo va conexin de baja
velocidad (dial-up por ejemplo). Entonces mientras menos informacin viaje por la red, mejor
para todos.
Para lograr esto, las peticiones del cliente deben ser lo ms exactas posible, a fin de que la
respuesta del servidor sea lo ms concreta que se pueda.

El lenguaje SQL

Toda la comunicacin con la base de datos, se hace a travs de un lenguaje conocido como
SQL (Structured Query Language). Este puede variar un poco entre las distintas base de datos,
pero los comando bsicos son 4 y son los que utilizaremos para los ejemplos: seleccionar,
insertar, actualizar y eliminar.

La conexin

El primer paso para hablar con el motor es crear una conexin. Esta es como un cable que
nos permite acceder a toda la informacin disponible en la base de datos.
El comando para crear la conexin es:

nHndl = SQLCONNECT([DataSourceName, cUserID, cPassword)

nHndl es el nmero de conexin con la base de datos (puede existir ms de una). Identifica
unvocamente a la conexin y es siempre >0 si la conexin fue exitosa.
En caso de error durante el proceso de conexin, tendr un valor negativo.

DataSourceName: nombre del origen de datos con el que creamos a travs del Panel de
Control.
cUserID: nombre del usuario con el que se cre el DSN.
cPassword: clave de acceso del usuario.

En nuestro ejemplo sera:

m.cnx = SQLCONNECT(SQLPack, conexin, cnxpwd)

IF m.cnx < 1
=MESSAGEBOX(Error de conexin, 16, Error)
RETURN
ENDIF

Ej. 1

La idea es tener una conexin nica a la base de datos, que pueda ser compartida por todos
los usuarios.
Yo no gener una conexin por cada nombre de usuario, sino que a travs de esta nica, una
vez dentro controlo por programa si el usuario est habilitado, si coinciden las claves de
ingreso, los niveles de acceso, etc.

Entonces, podremos tener un formulario de ingreso ms o menos as:

Imagen 1

En el mtodo Click del botn Conectar con la Base de Datos, deberamos incluir el cdigo
de conexin.
Si la conexin fue exitosa, el prximo paso es verificar los datos introducidos en los campos
Usuario y Contrasea.
Para ello utilizaremos el identificador de conexin que nos devolvi el comando SQLCONNECT
y que se encuentra en la variable m.cnx.

m.hndl=SQLEXEC(m.cnx,'SELECT username, nombre, clave;


FROM usuarios,
WHERE username= ?Thisform.Text1.Value',
'cu_usuarios')

Ej. 2
El comando ejecutado es el SQLEXEC, cuya sintaxis es la siguiente:
SQLEXEC(nConnectionHandle, [cSQLCommand, [cCursorName]])

nConnectionHandle es el nmero de conexin devuelto por SQLCONNECT. En nuestro


ejemplo, se encuentra en la variable m.cnx.
cSQLCommand es el comando SQL que enviamos al servidor.
cCursorName este campo no es obligatorio, pero lo utilizo para alojar el resultado de la peticin
en un cursor local y luego usarlo como cualquier tabla Fox.

Veamos por partes el Ejemplo 2:


Aparece una nueva variable llamada m.hndl donde se almacenar el resultado del comando. Si
es < 1 el comando fall y deber controlarse a travs de alguna rutina de error desde el VFP.

m.cnx es la variable que contiene la identificacin de la conexin con la base de datos.


Con el comando SQL solicitamos que nos devuelva un set de resultados con los registros de la
base de datos que cumplen con la condicin de la clusula WHERE.
Es decir, seleccionamos aquellos usuarios, su nombre y clave cuyo nombre de usuario sea
igual al ingresado en el campo Text1 del formulario. El resultado (slo un registro) quedar en
un cursor (tabla temporaria) llamado cu_usuarios.
Ntese que a los nombres de las variables debe anteponerse el signo ? dentro de la sentencia
SQL.

El comando SQLEXEC es el que se utiliza para enviar peticiones al servidor y lo utilizaremos


para todas las funciones de acceso a base de datos. Hay formas de programacin ms
avanzadas que permiten generar una sentencia SQL, compilarla y alojarla en el servidor para
ejecutarla cuando se necesite, ganando tiempo en la ejecucin. Pero, por ahora, para tener los
fundamentos bsicos y lograr una aplicacin cliente/servidor que funciones muy bien, con estos
comandos basta y sobra.

Como decamos con SQLEXEC podemos seleccionar datos, tal como vimos en el ejemplo
anterior, pero tambin podemos insertar nuevos registros en la base de datos:

m.hndl = SQLEXEC(m.cnx, INSERT INTO usuarios;


VALUES (?m.username, ?m.nombre, ?m.clave))

Ej. 3

Nuevamente, el resultado de la transaccin lo almacenamos en una variable de control llamada


m.hndl y si su valor es < 1 indica que la operacin ha fallado.
En este ejemplo insertamos en la tabla usuarios un registro con el contenido de las variables de
memoria m.username, m.nombre y m.clave.

Los registros existentes en una tabla de base de datos pueden ser modificados mediante el
comando UPDATE.

m.hndl = SQLEXEC(m.cnx, UPDATE usuarios;


SET clave = ?m.clave;
WHERE username = ?m.username)

Ej. 4

Este ejemplo nos muestra cmo modificar un registro de la tabla usuarios, cambiando el valor
del campo clave solamente para aquel que cumpla con la condicin (WHERE) de que el
nombre de usuario username sea igual al de la variable m.username.

Obviamente, tambin podremos eliminar uno o ms registros que cumplan con una condicin
dada. El comando para esto es DELETE.
m.hndl = SQLEXEC(m.cnx, DELETE FROM usuarios ;
WHERE username = ?m.username)

Ej. 5

Para finalizar una conexin con la base de datos, debemos cerrar la que est actualmente
activa. Esto se realiza con el comando SQLDISCONNECT.

m.hndl = SQLDISCONNECT(m.cnx)

Ej. 6

Si colocamos como parmetro el nmero 0, cerrar todas las conexiones activas. Por ej.:
m.hndl = SQLDISCONNECT(0)

Existen otros comandos relacionados con las propiedades de la conexin que pueden ser
modificados, pero slo los mencionar ya que dependen de cada instalacin para hacer el
ajuste fino.

SQLSETPROP: especifica los parmetros para una conexin.


SQLGETPROP: permite conocer los parmetros de una conexin activa.
SQLCOMMIT: baja la transaccin al disco, es decir copia las modificaciones efectivamente en
la base de datos. Debe estar ajustado el parmetro de Transaccin en Manual.
SQLROLLBACK: cancela cualquier cambio realizado en la ltima transaccin. Para ello
deber estar ajustado el parmetro de Transaccin Manual (con SQLSETPROP).

Si el parmetro de Transaccin est en automtico, estos dos ltimos comandos no se utilizan


y cada transaccin efectuada ser reflejada inmediatamente en la base de datos.

La ayuda de Visual Fox, es muy clara en cuanto a estos comandos y otros ms relacionados
con las operaciones C/S. Lo que falta es verlo en forma efectiva en ejemplos.

Para ello, adjunto un ejemplo para ver como aplicar lo visto en estas pginas.

Espero les sirva a todos.

Un saludo desde Mendoza, Argentina.

Alejandro Beorlegui
abeorlegui@sinectis.com.ar

También podría gustarte