SQLite usado en aplicaciones WEB VS2017 C#

Tenía pendiente este artículo ya que cuando lo enfrenté la primera vez me costó mucho trabajo el resolverlo. Como muchos hoy en día la web se ha convertido en la gran biblioteca virtual y a ella recurrí para tales efectos, y lo encontré en un post en inglés.

Se bien que SQLite es una base de datos para uso local por lo que a continuación detallo es para fines experimentales y cultura general.

Platicando con mis alumnos de Ingeniería sobre todo, me encuentro que en las empresas donde laboran – afortunadamente el estado tiene varias empresa de TIC’s – se usan mucho los llamados ORM.

Una descripción de lo que es el Object-Relational Mapping nos dice “Para facilitar los programas de aplicación que utilizan bases de datos relacionales, se han desarrollado herramientas de mapeo de objeto-relacional. En general, las bases de datos relacionales almacenan datos en tablas teniendo renglones (registros) y columnas (campos). Las tablas generalmente están interrelacionadas, y con ésto, hay una estructura lógica impuesta en la base de datos. La estructura lógica es conocida como un esquema. Las herramientas de mapeo de objeto-relacional leen una base de datos y automáticamente generan código fuente. Este código que se genera contiene un número de clases cuya interrelación refleja la estructura lógica o esquema de la base de datos.Una clase, por ejemplo en Java, es una estructura de datos que contiene tanto miembros de datos que almacenan datos y miembros de función (o métodos) que actuan sobre los datos. El código fuente contiene una clase para cada tabla en la base de datos y cada clase contiene un miembro de datos para cada columna en la tabla correspondiente. De forma adicional, las clases contienen miembros de función que son usados tanto para leer como escribir los miembros de datos y eventualmente actualizar la base de datos.

Usando una herramienta de mapeo de objeto-relacional, un programador puede escribir de manera fácil aplicaciones de base de datos. Después de que la herramienta de mapeo genera el código, el programador escribe el código para interactuar solo con las clases del código generado y no con la base de datos, con esto se oculta la complejidad de interactuar con la base de datos.” [1]

Y para acompañar a la anterior explicación sobre ORM, comparto para ustedes el siguiente gráfico de un trabajo universitario que quizás tiene un error en la fecha o de alguna manera Google puede viajar al futuro y traer material aun no publicado :).

El trabajo de donde cito la imagen es de Bubacarr Jallow y Shafagh Kashef estudiantes de la Université Libre de Bruxeles intitulado “Object relational Mapping and Entity Framework” y como les menciono tiene fecha del 18/12/2018.

Después de esta breve introducción les comento que llevo algunos años primero en Java y después en C# desarrollando clases para hacer mi vida profesional más confortable y tratando de englobar varios motores de bases de datos potencializando los diccionarios de datos con los que cuentan los motores de base de datos.

Un artículo que también esta en proceso por mi mente es el diccionario de datos de SQLite, por ahora vamos a la parte de .NET.

En el Instituto, específicamente en el área donde laboro SQLite a pesar de ser un “pequeña” base de datos nos ha sorprendido por su respuesta, facilidad de uso, el lenguaje SQL que maneja y une sin fin de ventajas que nos hace verlo como un excelente producto.

Sin embargo es de reciente creación y no hay mucha documentación en la red y en su sitio oficial no ahonda mucho en particularidades, es por eso que me parece valioso este pequeño artículo, ya que como siempre por las prisas no se documenta la solución y perdimos un día para re-encontrar o recordar la misma.

El problema comenzó cuando estábamos programando una solución para hacer archivos en REDATAM y frecuencias en el ámbito de SQLite.

Todo estaba funcionando bien en el entorno del IDE de VS. A iniciativa de Mauricio publicamos el sitio en una máquina habilitando el IIS que nos costó un poco de tiempo pero lo levantamos y publicamos la solución aunque no la probamos.

Cuando la probamos empezó a enviar un mensaje que castellanizado era que no se podía abrir la base de datos, ahí fue donde perdimos un día buscando y aplicando las posibles soluciones que veíamos en los foros.

Lo solucionamos primero en Azure y después usando nuestro servidor local, aquí detallamos la solución.

En primera se muestra la solución ORM en mi diagrama de clases (no actualizado al 100%) donde pudiera parecer inspirado en el patrón de diseño Factory.

Una cosa interesante que las .dlls generadas nuestro antivirus lo detecta como virus y los borra, por lo que reconstruyo los proyectos que se interrelacionan entre si.

La idea de mi ORM es que las clases se derivan de una clase padre que sería lo común a la mayoría de los motores que usuamos (por ejemplo el caracter apóstrofo “’” para referirnos a las cadenas de datos que comparten Oracle, SQLite y SQL Server) y ya en cada clase implementar los métodos abstractos, y los necesarios específicos para el motor en específico.

Lo primero es buscar el conector, paquete o como se le llame específico para SQLite, buscando en la red nos encontramos con System.Data.SQLite que se supone que es la oficial para .Net y que además descarga el Entity Framework y LINQ.

Cosa muy importante es que cuando compilamos nuestros proyectos, homogeneicemos las versiones, al momento de escribir este post se cuenta con la 1.0.108.

Al momento de generar nuestra dll se generan dos carpetas fundamentales x86 y x64.

Dlls generadas para el proyecto.

Contenido de x64 y x86.

Por último vamos al sitio que probará dichas clases y se publicarán en Azure.

Para fines de práctica una página fea y sin formato que explote 2 de los servicios de la clase:

  • Versión de SQLite
  • Tablas de la base de datos.

Página en modo diseño.

Como buen profesor ya entrado en años, al meter la dll, incluí todas las dlls de la solución de ServicesSQLite solo por si las dudas.

En la carpeta App_Data paso mi base de datos de SQLite, y aquí lo fundamental, crear las carpetas x86 – x64 y agregar las dll en su correspodiente carpeta al nivel del proyecto, no abajo de las dlls generadas como viene el proyecto de ServicesSQLite, esto lo leí en Stack Overflow.

Uno de los problemas es que en nuestro server local no manda el error de SQLite.Interop solo hasta que publicamos en Azure.

Ya como cultura general vemos el pequeño código de C#.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using Inegi.Dges.Dgreyra.ServiciosDb;

using Inegi.Dges.Dgreyra.ServiciosBDSQLite;

namespace WAppMyOrm

{

public partial class ConnSQLite : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

string pathDB = Server.MapPath(“~/App_Data/MyTable.db”);

ServicesSQLite myAdmin = new ServicesSQLite(“DataSource=”+pathDB);

Lbl_version.Text = myAdmin.ObtenerVersionDMBS();

string[] atablas = myAdmin.RegresaTablas();

foreach(var stabla in atablas)

{

LstBoxTables.Items.Add(stabla);

}

}

}

}

Lo publicamos en Azure y en el server local y maravilla, funcionó.

Y bueno, esto solo es para aquellos curiosos que quieran usar SQLite para probar otras cosas.

Saludos y los que tengan vacaciones sigan disfrutándolas.

Atte.

Profesor Miguel Araujo.

Deja un comentario