SlideShare una empresa de Scribd logo
1 de 4
Descargar para leer sin conexión
Cliente / Servidor

El concepto es el siguiente: un motor de base de datos (MS-SQLServer, Oracle, PostgreSQL,
Informix, etc) ejecutándose
en un servidor con sistema operativo de servidor (Windows NT, Windows 2000 Server, Linux,
Unix, AIX, etc).
La elección de uno u otro depende de lo robusto de la aplicación, seguridad, estabilidad, etc.
Incluso, puede utilizarse la misma base de datos de VFP en el servidor. También puede
utilizarse Access para aplicaciones más pequeñas.

Los ejemplos están preparados para Microsoft SQL Server 7.0 pero, haciendo una migración
posterior a Oracle, me di cuenta que hay muy pocas diferencias.
Yo realizo las transacciones a través de ODBC, pero sé que pueden hacerse a través de
objetos ADO. Me han dicho que es mucho mejor de esta forma, pero aún no la he investigado.


Los orígenes 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 "vínculo" entre la aplicación 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 según 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 aplicación.
En el ejemplo he creado un DNS con el nombre SQLPack, tomando como base el driver de
SQL Server.


Vamos a los ejemplos

La topología cliente/servidor tiene como objetivo minimizar la cantidad de transacciones entre
la PC cliente y la base de datos en el servidor.
Nuestra aplicación debe respetar ese concepto para reducir los tiempos de respuesta, pero
sobre todo es primordial reducir el tráfico en la red, ya que podemos trabajar en una LAN
donde no habrá inconvenientes, pero también podremos hacerlo vía conexión de baja
velocidad (dial-up por ejemplo). Entonces mientras menos información viaje por la red, mejor
para todos.
Para lograr esto, las peticiones del cliente deben ser lo más exactas posible, a fin de que la
respuesta del servidor sea lo más concreta que se pueda.


El lenguaje SQL

Toda la comunicación con la base de datos, se hace a través de un lenguaje conocido como
SQL (Structured Query Language). Este puede variar un poco entre las distintas base de datos,
pero los comando básicos son 4 y son los que utilizaremos para los ejemplos: seleccionar,
insertar, actualizar y eliminar.


La conexión

El primer paso para “hablar” con el motor es crear una conexión. Esta es como un cable que
nos permite acceder a toda la información disponible en la base de datos.
El comando para crear la conexión es:

nHndl = SQLCONNECT([DataSourceName, cUserID, cPassword)

nHndl es el número de conexión con la base de datos (puede existir más de una). Identifica
unívocamente a la conexión y es siempre >0 si la conexión fue exitosa.
En caso de error durante el proceso de conexión, tendrá un valor negativo.

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

En nuestro ejemplo sería:


m.cnx = SQLCONNECT(“SQLPack”, “conexión”, “cnxpwd”)

IF m.cnx < 1
       =MESSAGEBOX(“Error de conexión”, 16, “Error”)
       RETURN
ENDIF

                                              Ej. 1

La idea es tener una conexión única a la base de datos, que pueda ser compartida por todos
los usuarios.
Yo no generé una conexión por cada nombre de usuario, sino que a través 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 más o menos así:




                                            Imagen 1

En el método “Click” del botón “Conectar con la Base de Datos”, deberíamos incluir el código
de conexión.
Si la conexión fue exitosa, el próximo paso es verificar los datos introducidos en los campos
Usuario y Contraseña.
Para ello utilizaremos el identificador de conexión 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 número de conexión 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 petición
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 través de alguna rutina de error desde el VFP.

m.cnx es la variable que contiene la identificación de la conexión 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 condición de la cláusula 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 (sólo un registro) quedará en
un cursor (tabla temporaria) llamado cu_usuarios.
Nótese 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 programación más
avanzadas que permiten generar una sentencia SQL, compilarla y alojarla en el servidor para
ejecutarla cuando se necesite, ganando tiempo en la ejecución. Pero, por ahora, para tener los
fundamentos básicos y lograr una aplicación cliente/servidor que funciones muy bien, con estos
comandos basta y sobra.

Como decíamos con SQLEXEC podemos seleccionar datos, tal como vimos en el ejemplo
anterior, pero también 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 transacción lo almacenamos en una variable de control llamada
m.hndl y si su valor es < 1 indica que la operación 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 cómo modificar un registro de la tabla usuarios, cambiando el valor
del campo clave solamente para aquel que cumpla con la condición (WHERE) de que el
nombre de usuario username sea igual al de la variable m.username.


Obviamente, también podremos eliminar uno o más registros que cumplan con una condición
dada. El comando para esto es DELETE.
m.hndl = SQLEXEC(m.cnx, “DELETE FROM usuarios ;
                           WHERE username = ?m.username”)

                                               Ej. 5


Para finalizar una conexión 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 parámetro el número 0, cerrará todas las conexiones activas. Por ej.:
m.hndl = SQLDISCONNECT(0)


Existen otros comandos relacionados con las propiedades de la conexión que pueden ser
modificados, pero sólo los mencionaré ya que dependen de cada instalación para hacer el
“ajuste fino”.

SQLSETPROP: especifica los parámetros para una conexión.
SQLGETPROP: permite conocer los parámetros de una conexión activa.
SQLCOMMIT: “baja” la transacción al disco, es decir copia las modificaciones efectivamente en
la base de datos. Debe estar ajustado el parámetro de Transacción en Manual.
SQLROLLBACK: cancela cualquier cambio realizado en la última transacción. Para ello
deberá estar ajustado el parámetro de Transacción Manual (con SQLSETPROP).

Si el parámetro de Transacción está en automático, estos dos últimos comandos no se utilizan
y cada transacción efectuada será reflejada inmediatamente en la base de datos.

La ayuda de Visual Fox, es muy clara en cuanto a estos comandos y otros más 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 páginas.

Espero les sirva a todos.

Un saludo desde Mendoza, Argentina.

Alejandro Beorlegui
abeorlegui@sinectis.com.ar

Más contenido relacionado

La actualidad más candente

Transact sql
Transact sqlTransact sql
Transact sqljoan
 
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...José Antonio Sandoval Acosta
 
Replicacion de datos en Oracle
Replicacion de datos en OracleReplicacion de datos en Oracle
Replicacion de datos en OracleJenny Palma
 
- Creación de una base de datos en MySql con Replicacion -
- Creación de una base de datos en MySql con Replicacion -- Creación de una base de datos en MySql con Replicacion -
- Creación de una base de datos en MySql con Replicacion -Tōshirō Hitsugaya
 
Taller programación web ajax con jquery
Taller programación web  ajax con jqueryTaller programación web  ajax con jquery
Taller programación web ajax con jqueryPablo Galeana Bailey
 
Base de Datos(Funciones, Vistas,Procedimientos Almacenados,Triggers)
Base de Datos(Funciones, Vistas,Procedimientos Almacenados,Triggers)Base de Datos(Funciones, Vistas,Procedimientos Almacenados,Triggers)
Base de Datos(Funciones, Vistas,Procedimientos Almacenados,Triggers)Universidad Nacional de Piura
 

La actualidad más candente (20)

Preparestatement
PreparestatementPreparestatement
Preparestatement
 
Transact sql
Transact sqlTransact sql
Transact sql
 
Transac sq ll
Transac sq llTransac sq ll
Transac sq ll
 
Textos sqli_mssql
 Textos sqli_mssql Textos sqli_mssql
Textos sqli_mssql
 
Lenguaje Transact SQL
Lenguaje Transact SQL Lenguaje Transact SQL
Lenguaje Transact SQL
 
MySQL
MySQLMySQL
MySQL
 
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
 
Replicacion de datos en Oracle
Replicacion de datos en OracleReplicacion de datos en Oracle
Replicacion de datos en Oracle
 
- Creación de una base de datos en MySql con Replicacion -
- Creación de una base de datos en MySql con Replicacion -- Creación de una base de datos en MySql con Replicacion -
- Creación de una base de datos en MySql con Replicacion -
 
Doris aguagallo bdii_t7
Doris  aguagallo bdii_t7Doris  aguagallo bdii_t7
Doris aguagallo bdii_t7
 
Sql server 7.0
Sql server 7.0Sql server 7.0
Sql server 7.0
 
Prepared statement
Prepared statementPrepared statement
Prepared statement
 
Sqlcommand
SqlcommandSqlcommand
Sqlcommand
 
Lenguaje transact sql
Lenguaje transact sqlLenguaje transact sql
Lenguaje transact sql
 
Procedimientos almacenados en MySQL
Procedimientos almacenados en MySQLProcedimientos almacenados en MySQL
Procedimientos almacenados en MySQL
 
Bdii 04 sql
Bdii 04 sqlBdii 04 sql
Bdii 04 sql
 
1. introduccion a transact-sql
1.  introduccion a transact-sql1.  introduccion a transact-sql
1. introduccion a transact-sql
 
Taller programación web ajax con jquery
Taller programación web  ajax con jqueryTaller programación web  ajax con jquery
Taller programación web ajax con jquery
 
Base de Datos(Funciones, Vistas,Procedimientos Almacenados,Triggers)
Base de Datos(Funciones, Vistas,Procedimientos Almacenados,Triggers)Base de Datos(Funciones, Vistas,Procedimientos Almacenados,Triggers)
Base de Datos(Funciones, Vistas,Procedimientos Almacenados,Triggers)
 
Prepared Statement
Prepared StatementPrepared Statement
Prepared Statement
 

Destacado

Portafolio de servicios etd
Portafolio de servicios etdPortafolio de servicios etd
Portafolio de servicios etdClaudio Amaya
 
Solemne tics ssiii
Solemne tics ssiiiSolemne tics ssiii
Solemne tics ssiiiguest4df39d5
 
Controladores
ControladoresControladores
ControladoresAndreaG97
 
Conexion de una red (lan) con un bridge y 2 hubs
Conexion de una red (lan) con un bridge y 2 hubsConexion de una red (lan) con un bridge y 2 hubs
Conexion de una red (lan) con un bridge y 2 hubsJack Daniel Rendon
 
El papel de_las_did_cticas_en_la_b_squeda_y_construcci_n_del_conocimiento_cie...
El papel de_las_did_cticas_en_la_b_squeda_y_construcci_n_del_conocimiento_cie...El papel de_las_did_cticas_en_la_b_squeda_y_construcci_n_del_conocimiento_cie...
El papel de_las_did_cticas_en_la_b_squeda_y_construcci_n_del_conocimiento_cie...Tito Mania
 
Investigación de las normas y cables Juan Carlos
Investigación de las normas y cables Juan CarlosInvestigación de las normas y cables Juan Carlos
Investigación de las normas y cables Juan CarlosJuan Carlos Sosa
 

Destacado (10)

Exposcion de jose huauya exchange 2010
Exposcion de jose huauya   exchange 2010Exposcion de jose huauya   exchange 2010
Exposcion de jose huauya exchange 2010
 
Portafolio de servicios etd
Portafolio de servicios etdPortafolio de servicios etd
Portafolio de servicios etd
 
Wladiii ticsd
Wladiii ticsdWladiii ticsd
Wladiii ticsd
 
Solemne tics ssiii
Solemne tics ssiiiSolemne tics ssiii
Solemne tics ssiii
 
Presentación1
Presentación1Presentación1
Presentación1
 
Controladores
ControladoresControladores
Controladores
 
Conexion de una red (lan) con un bridge y 2 hubs
Conexion de una red (lan) con un bridge y 2 hubsConexion de una red (lan) con un bridge y 2 hubs
Conexion de una red (lan) con un bridge y 2 hubs
 
El papel de_las_did_cticas_en_la_b_squeda_y_construcci_n_del_conocimiento_cie...
El papel de_las_did_cticas_en_la_b_squeda_y_construcci_n_del_conocimiento_cie...El papel de_las_did_cticas_en_la_b_squeda_y_construcci_n_del_conocimiento_cie...
El papel de_las_did_cticas_en_la_b_squeda_y_construcci_n_del_conocimiento_cie...
 
capitulo 5.1
capitulo 5.1capitulo 5.1
capitulo 5.1
 
Investigación de las normas y cables Juan Carlos
Investigación de las normas y cables Juan CarlosInvestigación de las normas y cables Juan Carlos
Investigación de las normas y cables Juan Carlos
 

Similar a Cliente servidor

Diapositivas de acceso a datos ado.net
Diapositivas de acceso a datos ado.netDiapositivas de acceso a datos ado.net
Diapositivas de acceso a datos ado.netTAPIA SILVA EVELINA
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datosJhosy2404
 
Diapositivas de n capas en visual net 2017
Diapositivas de n capas en visual net 2017Diapositivas de n capas en visual net 2017
Diapositivas de n capas en visual net 2017TAPIA SILVA EVELINA
 
Aplicaciones n capas en visual.net
Aplicaciones n capas en visual.netAplicaciones n capas en visual.net
Aplicaciones n capas en visual.netLisbeth Ocaña Bueno
 
Linq to sql 6
Linq to sql 6Linq to sql 6
Linq to sql 6jcfarit
 
Fundamentos de Sistemas de Base de Datos (Capítulo 9 y 10)
Fundamentos de Sistemas de Base de Datos (Capítulo 9 y 10)Fundamentos de Sistemas de Base de Datos (Capítulo 9 y 10)
Fundamentos de Sistemas de Base de Datos (Capítulo 9 y 10)Karina Lucio
 
curso-servidores-apache-2
curso-servidores-apache-2curso-servidores-apache-2
curso-servidores-apache-2greenpeans
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gioRobert Wolf
 
Html,php
Html,phpHtml,php
Html,phpsoftyed
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gioRobert Wolf
 
LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.SILVA19_PAMELA
 
Lenguaje transact sql
Lenguaje transact sqlLenguaje transact sql
Lenguaje transact sqlSuarezJhon
 
INFOSAN Delphi 603-752
INFOSAN Delphi  603-752INFOSAN Delphi  603-752
INFOSAN Delphi 603-752FRANCIACOCO
 

Similar a Cliente servidor (20)

Unidad 4
Unidad 4Unidad 4
Unidad 4
 
bd.net.pptx
bd.net.pptxbd.net.pptx
bd.net.pptx
 
Diapositivas de acceso a datos ado.net
Diapositivas de acceso a datos ado.netDiapositivas de acceso a datos ado.net
Diapositivas de acceso a datos ado.net
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Diapositivas de n capas en visual net 2017
Diapositivas de n capas en visual net 2017Diapositivas de n capas en visual net 2017
Diapositivas de n capas en visual net 2017
 
My Sql A C#
My Sql A C#My Sql A C#
My Sql A C#
 
My Sql A C#
My Sql A C#My Sql A C#
My Sql A C#
 
Aplicaciones n capas en visual.net
Aplicaciones n capas en visual.netAplicaciones n capas en visual.net
Aplicaciones n capas en visual.net
 
JAVA CON BASE DE DATOS
JAVA CON BASE DE DATOSJAVA CON BASE DE DATOS
JAVA CON BASE DE DATOS
 
Linq to sql 6
Linq to sql 6Linq to sql 6
Linq to sql 6
 
Fundamentos de Sistemas de Base de Datos (Capítulo 9 y 10)
Fundamentos de Sistemas de Base de Datos (Capítulo 9 y 10)Fundamentos de Sistemas de Base de Datos (Capítulo 9 y 10)
Fundamentos de Sistemas de Base de Datos (Capítulo 9 y 10)
 
curso-servidores-apache-2
curso-servidores-apache-2curso-servidores-apache-2
curso-servidores-apache-2
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gio
 
Html,php
Html,phpHtml,php
Html,php
 
Tutorial bd y php
Tutorial bd y phpTutorial bd y php
Tutorial bd y php
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gio
 
Java con Base de Datos
Java con Base de Datos Java con Base de Datos
Java con Base de Datos
 
LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.
 
Lenguaje transact sql
Lenguaje transact sqlLenguaje transact sql
Lenguaje transact sql
 
INFOSAN Delphi 603-752
INFOSAN Delphi  603-752INFOSAN Delphi  603-752
INFOSAN Delphi 603-752
 

Más de CincoC

Curso python-para-principiantes
Curso python-para-principiantesCurso python-para-principiantes
Curso python-para-principiantesCincoC
 
16 pf-preguntas
16 pf-preguntas16 pf-preguntas
16 pf-preguntasCincoC
 
Giving directions wave
Giving directions waveGiving directions wave
Giving directions waveCincoC
 
Why uem-is-the-key-to-enterprise-it-security
Why uem-is-the-key-to-enterprise-it-securityWhy uem-is-the-key-to-enterprise-it-security
Why uem-is-the-key-to-enterprise-it-securityCincoC
 
Saber electrónica
Saber electrónicaSaber electrónica
Saber electrónicaCincoC
 
Ejercicios plc
Ejercicios plcEjercicios plc
Ejercicios plcCincoC
 
Arduino y labview
Arduino y labviewArduino y labview
Arduino y labviewCincoC
 
Microsoft azure pass how to
Microsoft azure pass   how toMicrosoft azure pass   how to
Microsoft azure pass how toCincoC
 
Fuente sin transformador
Fuente sin transformadorFuente sin transformador
Fuente sin transformadorCincoC
 
Tutorial labview
Tutorial labviewTutorial labview
Tutorial labviewCincoC
 
Ejemplo gpib labview
Ejemplo gpib labviewEjemplo gpib labview
Ejemplo gpib labviewCincoC
 
Manual administracion riesgo
Manual administracion riesgoManual administracion riesgo
Manual administracion riesgoCincoC
 
Romper clave elastix
Romper clave elastixRomper clave elastix
Romper clave elastixCincoC
 
21 riesgos-de-tecnologia-de-informacion-implicaciones-y-retos-para-la-auditoria
21 riesgos-de-tecnologia-de-informacion-implicaciones-y-retos-para-la-auditoria21 riesgos-de-tecnologia-de-informacion-implicaciones-y-retos-para-la-auditoria
21 riesgos-de-tecnologia-de-informacion-implicaciones-y-retos-para-la-auditoriaCincoC
 
Eficiencia en motores_electricos
Eficiencia en motores_electricosEficiencia en motores_electricos
Eficiencia en motores_electricosCincoC
 
Manual de-sql-2000-server
Manual de-sql-2000-serverManual de-sql-2000-server
Manual de-sql-2000-serverCincoC
 

Más de CincoC (16)

Curso python-para-principiantes
Curso python-para-principiantesCurso python-para-principiantes
Curso python-para-principiantes
 
16 pf-preguntas
16 pf-preguntas16 pf-preguntas
16 pf-preguntas
 
Giving directions wave
Giving directions waveGiving directions wave
Giving directions wave
 
Why uem-is-the-key-to-enterprise-it-security
Why uem-is-the-key-to-enterprise-it-securityWhy uem-is-the-key-to-enterprise-it-security
Why uem-is-the-key-to-enterprise-it-security
 
Saber electrónica
Saber electrónicaSaber electrónica
Saber electrónica
 
Ejercicios plc
Ejercicios plcEjercicios plc
Ejercicios plc
 
Arduino y labview
Arduino y labviewArduino y labview
Arduino y labview
 
Microsoft azure pass how to
Microsoft azure pass   how toMicrosoft azure pass   how to
Microsoft azure pass how to
 
Fuente sin transformador
Fuente sin transformadorFuente sin transformador
Fuente sin transformador
 
Tutorial labview
Tutorial labviewTutorial labview
Tutorial labview
 
Ejemplo gpib labview
Ejemplo gpib labviewEjemplo gpib labview
Ejemplo gpib labview
 
Manual administracion riesgo
Manual administracion riesgoManual administracion riesgo
Manual administracion riesgo
 
Romper clave elastix
Romper clave elastixRomper clave elastix
Romper clave elastix
 
21 riesgos-de-tecnologia-de-informacion-implicaciones-y-retos-para-la-auditoria
21 riesgos-de-tecnologia-de-informacion-implicaciones-y-retos-para-la-auditoria21 riesgos-de-tecnologia-de-informacion-implicaciones-y-retos-para-la-auditoria
21 riesgos-de-tecnologia-de-informacion-implicaciones-y-retos-para-la-auditoria
 
Eficiencia en motores_electricos
Eficiencia en motores_electricosEficiencia en motores_electricos
Eficiencia en motores_electricos
 
Manual de-sql-2000-server
Manual de-sql-2000-serverManual de-sql-2000-server
Manual de-sql-2000-server
 

Cliente servidor

  • 1. Cliente / Servidor El concepto es el siguiente: un motor de base de datos (MS-SQLServer, Oracle, PostgreSQL, Informix, etc) ejecutándose en un servidor con sistema operativo de servidor (Windows NT, Windows 2000 Server, Linux, Unix, AIX, etc). La elección de uno u otro depende de lo robusto de la aplicación, seguridad, estabilidad, etc. Incluso, puede utilizarse la misma base de datos de VFP en el servidor. También puede utilizarse Access para aplicaciones más pequeñas. Los ejemplos están preparados para Microsoft SQL Server 7.0 pero, haciendo una migración posterior a Oracle, me di cuenta que hay muy pocas diferencias. Yo realizo las transacciones a través de ODBC, pero sé que pueden hacerse a través de objetos ADO. Me han dicho que es mucho mejor de esta forma, pero aún no la he investigado. Los orígenes 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 "vínculo" entre la aplicación 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 según 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 aplicación. En el ejemplo he creado un DNS con el nombre SQLPack, tomando como base el driver de SQL Server. Vamos a los ejemplos La topología cliente/servidor tiene como objetivo minimizar la cantidad de transacciones entre la PC cliente y la base de datos en el servidor. Nuestra aplicación debe respetar ese concepto para reducir los tiempos de respuesta, pero sobre todo es primordial reducir el tráfico en la red, ya que podemos trabajar en una LAN donde no habrá inconvenientes, pero también podremos hacerlo vía conexión de baja velocidad (dial-up por ejemplo). Entonces mientras menos información viaje por la red, mejor para todos. Para lograr esto, las peticiones del cliente deben ser lo más exactas posible, a fin de que la respuesta del servidor sea lo más concreta que se pueda. El lenguaje SQL Toda la comunicación con la base de datos, se hace a través de un lenguaje conocido como SQL (Structured Query Language). Este puede variar un poco entre las distintas base de datos, pero los comando básicos son 4 y son los que utilizaremos para los ejemplos: seleccionar, insertar, actualizar y eliminar. La conexión El primer paso para “hablar” con el motor es crear una conexión. Esta es como un cable que nos permite acceder a toda la información disponible en la base de datos. El comando para crear la conexión es: nHndl = SQLCONNECT([DataSourceName, cUserID, cPassword) nHndl es el número de conexión con la base de datos (puede existir más de una). Identifica unívocamente a la conexión y es siempre >0 si la conexión fue exitosa.
  • 2. En caso de error durante el proceso de conexión, tendrá un valor negativo. DataSourceName: nombre del origen de datos con el que creamos a través del Panel de Control. cUserID: nombre del usuario con el que se creó el DSN. cPassword: clave de acceso del usuario. En nuestro ejemplo sería: m.cnx = SQLCONNECT(“SQLPack”, “conexión”, “cnxpwd”) IF m.cnx < 1 =MESSAGEBOX(“Error de conexión”, 16, “Error”) RETURN ENDIF Ej. 1 La idea es tener una conexión única a la base de datos, que pueda ser compartida por todos los usuarios. Yo no generé una conexión por cada nombre de usuario, sino que a través 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 más o menos así: Imagen 1 En el método “Click” del botón “Conectar con la Base de Datos”, deberíamos incluir el código de conexión. Si la conexión fue exitosa, el próximo paso es verificar los datos introducidos en los campos Usuario y Contraseña. Para ello utilizaremos el identificador de conexión 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
  • 3. El comando ejecutado es el SQLEXEC, cuya sintaxis es la siguiente: SQLEXEC(nConnectionHandle, [cSQLCommand, [cCursorName]]) nConnectionHandle es el número de conexión 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 petición 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 través de alguna rutina de error desde el VFP. m.cnx es la variable que contiene la identificación de la conexión 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 condición de la cláusula 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 (sólo un registro) quedará en un cursor (tabla temporaria) llamado cu_usuarios. Nótese 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 programación más avanzadas que permiten generar una sentencia SQL, compilarla y alojarla en el servidor para ejecutarla cuando se necesite, ganando tiempo en la ejecución. Pero, por ahora, para tener los fundamentos básicos y lograr una aplicación cliente/servidor que funciones muy bien, con estos comandos basta y sobra. Como decíamos con SQLEXEC podemos seleccionar datos, tal como vimos en el ejemplo anterior, pero también 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 transacción lo almacenamos en una variable de control llamada m.hndl y si su valor es < 1 indica que la operación 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 cómo modificar un registro de la tabla usuarios, cambiando el valor del campo clave solamente para aquel que cumpla con la condición (WHERE) de que el nombre de usuario username sea igual al de la variable m.username. Obviamente, también podremos eliminar uno o más registros que cumplan con una condición dada. El comando para esto es DELETE.
  • 4. m.hndl = SQLEXEC(m.cnx, “DELETE FROM usuarios ; WHERE username = ?m.username”) Ej. 5 Para finalizar una conexión 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 parámetro el número 0, cerrará todas las conexiones activas. Por ej.: m.hndl = SQLDISCONNECT(0) Existen otros comandos relacionados con las propiedades de la conexión que pueden ser modificados, pero sólo los mencionaré ya que dependen de cada instalación para hacer el “ajuste fino”. SQLSETPROP: especifica los parámetros para una conexión. SQLGETPROP: permite conocer los parámetros de una conexión activa. SQLCOMMIT: “baja” la transacción al disco, es decir copia las modificaciones efectivamente en la base de datos. Debe estar ajustado el parámetro de Transacción en Manual. SQLROLLBACK: cancela cualquier cambio realizado en la última transacción. Para ello deberá estar ajustado el parámetro de Transacción Manual (con SQLSETPROP). Si el parámetro de Transacción está en automático, estos dos últimos comandos no se utilizan y cada transacción efectuada será reflejada inmediatamente en la base de datos. La ayuda de Visual Fox, es muy clara en cuanto a estos comandos y otros más 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 páginas. Espero les sirva a todos. Un saludo desde Mendoza, Argentina. Alejandro Beorlegui abeorlegui@sinectis.com.ar