Uso de Bases de Datos en Apps Web

WebDatabase

Usar bases de datos con apps web no es muy distinto de hacerlo con las aplicaciones de escritorio, si bien hay algunas cosas que conviene tener en cuenta. El cambio más importante es que la app web permite el acceso de múltiples usuarios.

Esto significa que querrás que la conexión con la base de datos sea única para cada uno de los usuarios que conecte con la app web, en vez de que sea una conexión global a la app propiamente dicha (tal y como ocurre en el caso de las apps de escritorio). El modo más simple de asegurarlo es creando una conexión a la base de datos en el manejador de evento WebSession.Open, guardando así una referencia a la conexión en una propiedad añadida a WebSession.

Añade esta propiedad en el objeto Session:

DB As SQLiteDatabase

En el manejador de evento Open, conecta con la base de datos:

Dim dbFile As FolderItem = GetFolderItem("MiBaseDeDatos.sqlite")
DB = New SQLiteDatabase
DB.DatabaseFile = dbFile
If Not db.Connect Then
' Muestra una página de error y registra el error
' Dado que no deberías de mostrar los detalles al usuario
PaginaDeError.Show
End If

Si bien el anterior fragmento de código conecta con una base de datos SQLite, puedes utilizar la misma técnica para conectar a una base de datos diferente, como pueda ser PostgreSQL o MySQL.

Al disponer de la propiedad DB como una propiedad de la sesión, te asegurarás de que las transacciones con la base de datos son específicas para cada uno de los usuarios conectados como sesión, reduciendo así el riesgo de que los datos queden expuestos a la sesión errónea.

Con SQLIte, el archivo de base de datos se encuentra generalmente en el mismo servidor en el que también está ubicada la app web (o en una carpeta relacionada). Asegúrate de haber aplicado los permisos correctos al archivo de base de datos o, de lo contrario, no podrás guardar los cambios sobre ella. En la mayoría de los servidores Linux, has de utilizar generalmente los permisos “755”, pero esto puedo variar en cada servidor. Una vez que estés conectado al servidor, podrás realizar este cambio con un comando del terminal como este:

chmod 755 MiBaseDeDatos.sqlite

Una vez hayas configurado tu proyecto de esta forma, podrás referenciar la base de datos así:

Session.DB

De modo que, para recuperar datos, podrías utilizar un fragmento de código similar a este:

Dim rs As RecordSet
rs = Session.DB.SQLSelect("SELECT * FROM Person")
If Session.DB.Error Then
' Guarda y registra los errores de Session.DB.Error y Session.DB.ErrorMessage
' No deberías de mostrar este tipo de información a tus usuarios
​Return
End If

While Not rs.EOF
ListBox1.AddRow(rs.idxField(1).StringValue)
rs.MoveNext
Wend
rs.Close

Instrucciones Preprocesadas (Prepared Statements)

Para evitar un riesgo de seguridad denominado inyección SQL, deberías de utilizar siempre las Instrucciones Preprocesadas (Prepared Statements) con aquellas instrucciones que incorporen parámetros proporcionados como entradas del usuario.

5 comentarios en “Uso de Bases de Datos en Apps Web

  1. Leonardo Velazquez

    Hola que tal. excelentes tus articulos… han sido de muchisima ayuda…

    me interesa la opcion Web, pero tengo una duda, si utilizas web session para establecer la conexion, como quiera se consume “una” conexion en el caso de por ejemplo Valentina que soporta solo 5 y 10 para SQLite, si se conectan 5 se consumen 5

    el evento Open es cuando se abre el navegador o cuando se carga por primera vez la aplicacion web en el servidor ?

    1. Javier Rodriguez

      Hola Leonardo,

      Gracias por tus palabras! Me alegra que encuentres útiles los artículos sobre Xojo.

      Si Valentina es tan restrictivo sobre la cantidad máxima de conexiones simultáneas que puede mantener… igual te interesaría contemplar otros motores de bases de datos, desde el SQLite a PostreSQL o MySQL/MariaDB, en los que no encontrarás este tipo de restricciones.

      Si prefieres Valentina, entonces puedes cerrar la conexión una vez que hayas adquirido el cursor con los datos y los hayas utilizado; por ejemplo, tras actualizar un listado. Es decir, abrir-utilizar-cerrar en cada una de las operaciones. Esto podría minimizar los “choques” en cuanto a los límites de accesos.

      Sobre el evento WebApplication.Open, este se invoca en la ejecución de la aplicación web.

      1. Leonardo Velazquez

        Hola muchas gracias.. aclarado el punto 😉 voy a revisar y aprender PostgreSQL, lo digo por lo de la licencia de MySQL…

        Saludos y gracias de nuevo

  2. Alejandro Truyol Canessa

    Hola Javier. Estoy tratando de usar MySql en mi aplicación Desktop pero cuando intento conectarme a mi BD me da el siguiente error : “Authentication plugin ‘caching_sha2_password’ cannot be loaded: No se puede encontrar el módulo especificado.”

    Te agradecería me pudieras orientar al respecto.

    Saludos y gracias por tu permanente ayuda.

    1. Javier Rodriguez

      Estimado Alejandro,

      Le he respondido directamente a la dirección de email proporcionada.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *