Delphi – Mantener un DataSet activo sin conexión con ADO

Una de las prácticas más comunes al desarrollar aplicaciones que se conectan a servidores de bases de datos es la de activar una conexión al servidor desde el inicio del programa y mantenerla abierta hasta el cierre del mismo. Esto que aparentemente no supone un problema en sistemas pequeños puede convertirse en un problema en sistemas  multiusuario de alta demanda. ¿Por qué? Bueno, cada conexión que realizamos a un servidor además de tener un costo en el servidor de base de datos decrementa el número de conexiones disponibles.

En el caso de operaciones de inserción, borrado o actualización la solución puede ser sencilla pues basta con abrir la conexión, ejecutar las operaciones y cerrar la conexión. ¿Pero qué sucede en casos donde debemos mostrar datos de una tabla o consulta al usuario?, es común que esta necesidad es precisamente la que obliga a muchos desarrolladores a mantener la conexión abierta al servidor.   Para solucionar este pequeño inconveniente Delphi a través de sus múltiples controles nos ofrece diversas soluciones algunas muy elaboradas otras menos por lo que en este artículo les mostraré lo que a mi parecer es una de las maneras más sencillas de solucionarlo.

Datasets activos sin conexión con ADO

ADO nos permite a través de sus componentes de acceso a datos mantener un conjunto de registros cargados sin necesidad de tener una conexión activa a la base de datos. El truco es realmente muy sencillo, Abrimos la conexión, ejecutamos la sentencia que nos devolverá el Dataset y establecemos a Nil la propiedad conexión del componente de acceso a datos. En ese momento el Dataset queda cargado en memoria y es posible cerrar la conexión.

Para mostrar un ejemplo de lo anterior usaré Mysql, aclarando que esta técnica es aplicable a cualquier motor de base de datos, pues la característica pertenece a Delphi/ADO más que al motor de base de datos en si mismo.

** Importante. Esto aplica a cualquier versión de Delphi que incluya ADO.

Como primer paso vamos a crear la tabla “Paises” en Mysql

DROP TABLE IF EXISTS paises;
CREATE TABLE `paises` (
  `id` int(3) unsigned NOT NULL default '0',
  `Pais` varchar(30) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Luego en delphi vamos a crear una nueva aplicación VCL Forms y colocaremos un TAdoDataSet, TDataSource y un TDbGrid como se muestra en la siguiente imagen:

unoado

Una vez colocados nuestros componentes vamos a editar la propiedad CommandText del AdoDatasource1 donde escribiremos el siguiente código:

Select Id, Pais
  From Paises

Hecho lo anterior asignaremos a la propiedad Dataset del componente Datasource1 la referencia al componente AdoDataset1 y en el DbGrid en su propiedad Datasource la referencia al componente Datasource1.

Ya configurados nuestros componentes de acceso a datos agregaremos un botón al formulario y en su evento OnClick colocaremos lo siguiente:

procedure TForm1.Button1Click(Sender: TObject);
  Var
    AdoConnection: TADOConnection;
begin
  AdoConnection := TADOConnection.Create(self);
  AdoConnection.LoginPrompt := False;
  AdoConnection.ConnectionString :=
     'Provider=MSDASQL.1;Persist Security Info=False;User ID=root;Data Source=Desarrollo';
  AdoConnection.Open;
  ADODataSet1.Connection := AdoConnection;
  ADODataSet1.Open;
  ADODataSet1.Connection := nil;
  AdoConnection.Close;
  AdoConnection.Free;
end;

Si tienes dudas sobre como conectarte a Mysql desde Delphi te recomiendo una lectura al artículo:  Ejecutar Stored procedures de Mysql con Delphi y ADO Allí se muestra como configurar una conexión a Mysql desde Delphi.

Colocado el código anterior ejecutamos nuestra aplicación y presionamos el botón para obtener el siguiente resultado:

tresAdo

Donde podrás observar que efectivamente es posible mostrar el conjunto de registros sin estar conectado al servidor. Además y esto es importante mencionarlo, puedes ejecutar las operaciones de navegación de los componentes Dataset de delphi y en algunos casos también podrás agregar o eliminar registros del dataset sin que esto se refleje en el servidor de base  de datos.

Si deseas ver las conexiones activas de tu servidor Mysql, esto puedes hacerlo a través del Mysql Administrator que viene incluido en las Gui Tools de mysql

 

dosAdo

4 Comments

    • En esa situación lo óptimo sería generar un proceso separado donde abras la conexión, insertes/actualices/borres, y cierres la conexión. De esa manera optimizas conexiones al servidor de bases de datos separando la lógica de presentación de la de operación.

      Saludos amigo

  1. Me parece de lo más útil este mecanismo, Edgar. Me recuerda un poco lo que puedes hacer con un TClientDataSet, reconociendo que ADO es un terreno interminable de características. 🙂

    Poniéndonos un poco filosóficos, ahora que lo pienso, quizá todos los derivados de TDataSet bidireccionales deberían permitir trabajar con su contenido ya cargado en memoria (al menos para lectura), sin que necesariamente la conexión siga abierta / existente. Es decir, que su propiedad Active no esté supeditada al cierre o desasignación del objeto conexión, cual es el caso de la mayoría.

    Un saludo y gracias por el artículo.

    Al González.

    • Muy atinada tu observación amigo mio. Supongo que por su espíritu “RAD” Delphi no lo hace así para precisamente permitir al desarrollador generar aplicacciones de manera sencilla y rápida sin preocuparse demasiado por el rendimiento. Claro que cuando comenzamos a desarrollar software más especializado debemos entonces si realizar este tipo de operaciones cuidando el rendimiento de nuestros servidores.

      Un abrazo…

Deja un comentario