Cargando

Por Alfonso Ricaño Bringas

Conectándose a InterBase desde Delphi II

En el artículo pasado se vieron a grandes rasgos los componentes que constituyen los InterBase Express. Ahora vamos a verlos en la práctica, vamos a hacer un pequeño programa que haga conectividad con la base de datos definida en el artículo 2.

Antes voy a aclarar algunas cosas: 1.- Por lo común, solamente necesitaremos un solo componente IBDatabase por aplicación, ya que ese componente es el que hará la conexión al servidor IB, aunque en casos excepcionales podremos utilizar cuantos componentes IBDatabase queramos, como cuando queramos conectarnos a dos bases de datos distintas desde nuestra aplicación. 2.- El manejo de las transacciones es quizás el punto más delicado de esto, ya que debemos tener en cuenta cómo queremos aplicar las inserciones/modificaciones/eliminaciones de los datos. Otro punto importante es el "refrescar" los datos de los IBDataSets que tengamos con datos de una tabla a la cual acabamos de modificar datos. 3.- Como se expuso en el artículo anterior, el componente de acceso a las tablas que mejores capacidades y características tiene, es el IBDataSet, por lo que se sugiere desechar la idea de utilizar el IBTable y el IBQuery. Una vez aclarado esto, procederemos a hacer el ejemplo:

Ejemplo de uso de InterBase Express

Vamos a utilizar la base de datos creada en el artículo Número 2 de esta serie, llamada mi_base_ib.gdb. Ahí fue creada una tabla llamada PERSONAS con la siguiente estructura: Bueno, pues vamos a hacer una pequeña aplicación que acceda a los datos de esta tabla, pudiendo agregar/modificar/eliminar y consultar los registros de la tabla. 1: abrimos Delphi 5, y creamos un nuevo proyecto. 2: Colocamos un IBDatabase en la forma de nuestro proyecto, y también un IBTransaction, de esta forma: 3: En la propiedad DefaultTransaction del IBDatabase1 apuntamos a IBTransaction1, y en la propiedad DefaultDatabase del IBTransaction1 apuntamos a IBDatabase1. 4: Ponemos un IBDataset (se llamará automáticamente IBDataset1). 5: Ponemos la ruta hacia la base de datos en la propiedad Databasename del IBDatabase. Si estamos trabajando con un servidor local (instalado en la misma computadora), sólo tenemos que escribir la ruta y el nombre del archivo GDB, en caso de que estemos trabajando con un servidor remoto (en otra computadora) podemos escribir la ruta hacia la base de datos de varias maneras, dependiendo del sistema operativo en el cual resida el servidor y el protocolo por medio del cual nos queremos conectar. En la tabla siguiente se muestra un ejemplo de cómo hacer esto:
Sistema Operativo del Servidor Protocolo Ejemplo
Linux TCP/IP serv:/home/bdib/mi_base_ib.gdb
Windows 9x/NT TCP/IP serv:c:\bdib\mi_base_ib.gdb
Windows 9x/NT NETBEUI \\serv\c:\bdib\mi_base_ib.gdb
donde serv es el nombre del servidor, y la base de datos se llama mi_base_ib.gdb. 6: Ponemos la propiedad Transaction del IBDataset1 apuntando a IBTransaction1, y automáticamente se asignará también la propiedad Database a IBDatabase1. 7: Realizamos la conexión a la base de datos, poniendo la propiedad connected del IBDatabase1 a true. Nos va a pedir el User Name y el Password de algún usuario de InterBase. Si no hemos modificado las contraseñas de InterBase, entonces podemos utilizar como usuario SYSDBA y como password masterkey. 7: Vamos a colocar en la propiedad SelectSQL una instrucción SQL para que consulte los datos de la tabla PERSONA. Debe escribirse así: SELECT * FROM PERSONA Cuando abrimos la propiedad SelectSQL nos aparece un editor de la propiedad, algo así como esto: Aquí vemos cómo este editor nos facilita la creación de las instrucciones SELECT de SQL. Pero simplemente escribimos la instrucción y damos Ok. 8: Ahora ya podemos abrir nuestro IBDataSet1, poniendo la propiedad Active a true. 9: Ahora podemos poner y conectar un componente Datasource (de la paleta de componentes Data Access) y a éste conectarle componentes Data-Aware (dbGrid, dbEdit, dbNavigator, dbText, etc.) de manera semejante a como cuando conectamos un Datasource a un componente de acceso a datos de la BDE (Query, Table). En la siguiente imagen, se ve cómo se colocó un dbGrid, un Datasource y un dbNavigator. El dbNavigator1 no está habilitado, aún cuando está conectado al Datasource1, y el Datasource1 está conectado al IBDataset1, y el IBDataset1 esta abierto. Esto es por las siguientes razones: a) No existen registros en la tabla PERSONAS, por lo que las flechas de navegación (primero, anterior, siguiente, último) no están habilitadas. b) Las propiedades DeleteSQL, ModifySQL e InsertSQL no tienen instrucciones SQL, por lo que el IBDataset1 no puede eliminar, ni modificar, ni agregar registros. Esto nos da una idea del control que podemos tener con un IBDataset, y que no se tiene al manejar Datasets más automatizados (como un IBQuery o IBTable). Como necesitamos que nuestro IBDataset1 pueda agregar/modificar/eliminar registros, vamos a llenar las propiedades de esta manera: a) InsertSQL: Se debe escribir una instrucción INSERT de SQL, donde se enlisten todas las columnas en las que se quieren insertar datos, y en la parte de valores (VALUES) se enlistan las mismas columnas, pero como parámetros, es decir, anteponiendo un signo de dos puntos (:) antes de cada nombre de columna. Por ejemplo, para la tabla PERSONAS, el InsertSQL quedaría así: INSERT INTO PERSONAS(CLAVEPERSONA, NOMBRE, APELLIDOS, TELEFONO, EMAIL) VALUES (:CLAVEPERSONA, :NOMBRE, :APELLIDOS, :TELEFONO, :EMAIL) b) ModifySQL: Se escribe una instrucción UPDATE de SQL, y en la parte SET se enlistan las columnas que pueden ser modificadas, en la parte WHERE se pone la o las columnas que forman parte de la llave primaria, y los parámetros de las columnas de la llave primaria deben llevar el prefijo OLD_. Siguiendo con la tabla PERSONAS, el ModifySQL quedaría así: UPDATE PERSONAS SET CLAVEPERSONA=:CLAVEPERSONA, NOMBRE=:NOMBRE, APELLIDOS=:APELLIDOS, TELEFONO=:TELEFONO, EMAIL=:EMAIL WHERE CLAVEPERSONA=:OLD_CLAVEPERSONA c) DeleteSQL: Es más sencillo, pues únicamente se escribe la instrucción DELETE de SQL indicando que se va a borrar de la tabla PERSONAS, y la parte WHERE debe ir igual que en ModifySQL. Aquí está el ejemplo: DELETE FROM PERSONAS WHERE CLAVEPERSONA=:OLD_CLAVEPERSONA d) RefreshSQL: Aquí sólo hay que poner una instrucción SELECT como la de la propiedad SelectSQL, y se le agrega una sección WHERE como la de ModifySQL y DeleteSQL, pero sin utilizar el prefijo OLD_. SELECT * FROM PERSONAS WHERE CLAVEPERSONA=:CLAVEPERSONA Una vez que hemos llenado estas propiedades, podemos cerrar y abrir el IBDataset1, y el dbNavigator1 debe verse así: Lo que nos indica que ya podemos agregar/modificar (y eliminar, siempre que existan registros) con este IBDataset. Hasta aquí con este pequeño ejemplo, puedes verificar que se pueden agregar/modificar/eliminar los registros, al ejecutar el programa. En el siguiente artículo veremos como manejar las transacciones, con el componente IBTransaction.