(Component-Delphi) - DBExpress.pdf

(253 KB) Pobierz
DBExpress
Descripción general
Presentaré aquí el nuevo ‘bebé’ de Borland: la tecnología DBExpress. Esta tecnología viene a
reemplazar a la vieja y conocida BDE (Borland Database Engine) que acompaña a Delphi desde sus
inicios, y que fue responsable de gran parte de su aceptación. Como veremos, los puntos fuertes de la
BDE se mantuvieron en el diseño de DBExpress (desde ahora, DBX) mientras que los puntos débiles
se modificaron… o al menos esa fue la intención. Si se logró o no, lo sabremos dentro de un tiempo.
Objetivos de DBExpress
Cuando se planteó la creación de este nuevo sistema de acceso a datos, se tuvieron en cuenta los
siguientes objetivos:
Velocidad de respuesta
Facilidad de implementación (instalación)
Basado completamente en SQL
Facilidad para cambiar de sistema de base de datos
Multiplataforma
Simpleza para la creación de nuevos controladores
Permitir la utilización de características particulares de cada servidor
Estos objetivos se han alcanzado haciendo algunas concesiones en el terreno de las características
avanzadas. Los controladores DBExpress son veloces, simples de configurar e instalar, y…
terriblemente reducidos en características. Únicamente tienen que proveer de una forma de conectarse
al servidor, una forma de ejecutar sentencias SQL, una forma de comunicar los errores que se pueden
producir en el proceso, y el tipo más básico de cursores que podemos pedir: unidireccionales y no
actualizables.
Podemos entender que de un diseño tan minimalista se obtenga velocidad. Los controladores no se
molestan en almacenar distintos registros para permitir volver a uno anterior al actual: simplemente, no
se puede volver atrás. Tampoco se pueden editar los datos, y por tanto el controlador no necesita
ocuparse de la comunicación de los cambios y resolución de conflictos con el servidor. Todas las
modificaciones deberán hacerse ejecutando sentencias SQL de acción (Insert, Delete, Update). Esto
también significa que se pueden tener características propias de los distintos servidores, siempre que se
puedan especificar en SQL.
Pero el hecho que los cursores sean unidireccionales significa que no podemos usar un control como la
grilla de datos (DBGrid); además, tenemos que programar la generación de sentencias de acción SQL
para cada operación… esto se parece cada vez más a un lenguaje no visual! Bueno, no es para tanto:
podemos programar un sistema de
caché
de registros en un componente, así como un sistema para la
generación automática de las sentencias SQL de inserción, modificación y borrado. Aunque preferiría
no hacerlo yo, como sin duda estará pensando la mayoría de Uds.
Por suerte Borland ya tiene un par de componentes que realizan esas tareas. Estos componentes
aparecieron allá por los tiempos de Delphi 3, si la memoria no me falla; pero en esos momentos de
gloria de la BDE era muy poca gente la que los usaba. También tenían una serie de fallos internos que
se fueron corrigiendo en las versiones posteriores. En este momento en Delphi 6 / Kylix podemos
disfrutar de su madurez y robustez garantizada. Estoy hablando del componente TClientDataset y su
compañero del alma, el TDatasetProvider; estos componentes estuvieron desde un principio asociados
a la tecnología MIDAS (ahora llamada DataSnap) y por lo tanto sólo disponibles en la versión
Enterprise de Delphi. Ahora la cosa ha cambiado, y son una parte integral del esquema de acceso y
tratamiento de datos de Borland.
El esquema general de componentes, desde la base de datos hasta los controles visuales de datos (data-
aware controls) es el siguiente:
Los puntos indicados como ‘posible red’ son los lugares donde podemos separar sin mayores
problemas los bloques.
-
-
Entre el servidor de bases de datos y el cliente correspondiente generalmente hay una separación
física, con transporte de datos entre el servidor y el cliente a través de una red.
Entre los componentes DatasetProvider y ClientDataset podemos interponer componentes de
conexión DataSnap como TSocketConnection, TDCOMConnection o TSOAPConnection para que
se encarguen de la comunicación de paquetes entre el proveedor y el cliente.
El componente ClientDataset nos provee el sistema de almacenamiento de registros en el cliente, que
necesitamos para la navegación bidireccional. Cuando los datos se obtienen a través de un descendiente
de TDataset (como los componentes de acceso a datos de DBExpress) entonces necesitamos el
DatasetProvider para hacer de intermediario entre los componentes. Este componente es capaz de
generar las sentencias SQL de acción automáticamente, controladas por propiedades que se pueden
configurar en el Inspector de Objetos; recibe los cambios del ClientDataset y los envía al servidor SQL,
proveyendo también de algunos eventos que se pueden usar para resolver automáticamente los
conflictos que puedan ocurrir.
Resumiendo: la tecnología DBExpress nos brinda acceso eficiente a cursores unidireccionales
solamente de lectura. Estos componentes no limitan en modo alguno el acceso a las características
avanzadas que pueda tener cada servidor SQL independiente, ya que únicamente exige esos cursores.
Todo lo demás se puede usar a través de SQL o la interface nativa correspondiente.
Sumando a la poción una pareja DatasetProvider – ClientDataset obtenemos lo mismo que teníamos
antes con la BDE solo que más simple, rápido y escalable.
¿Y la transparencia de la base de datos final? Cambiar de servidor de base de datos es tan simple como
reemplazar una DLL por otra (los controladores) y cambiar los parámetros de la conexión como el
nombre del servidor o de la base de datos.
Para la instalación, como veremos en la parte final, solamente hay que copiar en el equipo cliente un
par de librerías dinámicas (actualmente son alrededor de 600 Kb). No hay necesidad de registrar ni
configurar nada.
Además de todo esto, los mismos componentes están disponibles también en Linux para ser usados con
Kylix, y en Solaris –de hecho se escribieron originalmente para esa plataforma, según John Kaster de
Borland.
Espero que esto les haya abierto el apetito. Esta tecnología es muy prometedora y fácil de usar y de
instalar, por lo que se le augura una larga y próspera vida.
Ejemplo
Comenzaremos en forma poco convencional, con un ejemplo en el cual no usaremos ClientDataset sino
que enlazaremos los controles directamente a un SQLTable.
Creamos una nueva aplicación. En la ventana principal –y única- del proyecto colocaremos los
siguientes componentes:
SQLConnection: SQLConnection1
SQLTable: SQLTable1
Datasource: Datasource1
A continuación enlazamos el componente
SQLConnection1 con la base de datos
haciendo doble clic sobre él y seleccionando
‘IBLocal’ como nombre de la conexión.
Debemos colocar el nombre de la base de
datos con la que vamos a trabajar; la vieja y
querida EMPLOYEE.GDB que se instala con
los ejemplos de Delphi. Localice el archivo
(la instalación lo pone normalmente en
\Archivos de programa\archivos
comunes\borland shared\data) y coloque el
nombre
con la ruta completa
en el parámetro
‘Database’. Asegúrese también que los
parámetros User_Name (nombre de usuario,
por defecto ‘sysdba’) y Password (clave de
acceso, por defecto ‘masterkey’) contienen datos válidos para acceder a los datos.
Podemos confirmar que hemos puesto bien los valores presionando el botón
bien, aceptamos los cambios presionando el botón OK.
. Una vez que todo esté
Tenemos la conexión. Ahora nos falta enlazar un componente de tipo Dataset para poder recuperar los
datos. Tenemos varias opciones, que veremos luego en forma individual; para este ejemplo colocamos
un TSQLTable y referenciamos el SQLConnection1 con la propiedad
Connection.
A continuación
seleccionamos el nombre de la tabla EMPLOYEE en la propiedad TableName.
Para poder usar los controles de datos que incluye Delphi, debemos colocar un componente que actúa
como intermediario entre el Dataset y los controles: el componente Datasource. Referenciamos el
Dataset por medio de la propiedad del mismo nombre.
El siguiente esquema muestra las relaciones entre estos tres componentes:
Connection
Dataset
Ahora si podemos colocar los controles de datos. Hacemos doble clic sobre SQLTable1 para mostrar el
editor de campos que se ve en la imagen siguiente. En el menú contextual de este editor (invocado
como siempre con el botón derecho del ratón) seleccionamos la opción ‘Add all fields’ y veremos que
se llena con los
componentes de campo
correspondientes al dataset. Para crear los controles de tipo
DBEdit sobre el formulario, arrastramos los componentes de campo y los dejamos caer en el lugar
donde deseamos el control; se creará automáticamente un DBEdit y un Label con el nombre del campo.
En este momento ya podemos ver cómo se comportarán los controles de datos, si activamos el dataset
poniendo su propiedad Active en True:
Ejecute la aplicación y trate de modificar algún dato; no podrá, así como tampoco podrá volver a un
registro anterior. Las únicas operaciones permitidas con un cursor unidireccional de solo lectura como
el que nos da el dataset SQLTable1 son la navegación hacia adelante y la vuelta al principio.
Puede parecer que no se puede hacer mucho con un cursor así; pero en realidad hay muchas
operaciones que no necesitan más, por ejemplo la impresión de reportes, y este tipo de cursor es el más
rápido que se puede pedir a un servidor SQL. Además ocupa muy pocos recursos, ya que solamente se
almacena en memoria un registro, el actual.
Para hacer que el conjunto de datos sea bidireccional y editable necesitamos algún método para
mantener un grupo de registros en memoria, y proveer un cursor sobre este grupo. Este método existe
desde hace un tiempo, en forma de un componente: TClientDataset.
El componente TClientDataset se estudia en otro lado en relación a las
tablas locales,
o MyBase. Son
los mismos componentes que se usan aquí, y básicamente su función es armar una tabla en memoria,
con todas las posibilidades de un verdadero descendiente de TDataset. No voy a entrar en detalles sobre
el componente TClientDataset, los dejo para la sección dedicada a su utilización con MyBase.
Modificaremos el ejemplo anterior para mostrar la funcionalidad normal del grupo de componentes.
Zgłoś jeśli naruszono regulamin