Categoría: C#

C# sin Visual Studio [dotnetfiddle.net]

En algunas ocasiones se necesita probar algún concepto o ver si es posible hacer algo de forma rápida.

Actualmente trabajo bastante con C# y dado que es molesto tener que crear un proyecto solo para probar algo sencillo y ejecutar el mastodonte que es Visual Studio solo para algo tan pequeño, encontré una solucion que se adapta este caso en especifico.

Se trata de dotnetfiddle.net, es un compilador online de C#, permite crear proyectos sencillos de Consola, MVC, Script y Nancy; entre sus opciones también permite seleccionar la versión de C# que queremos usar.

Esta herramienta me gusta bastante porque es bastante sencilla, permite crear snippets de código y probarlos desde el navegador, también puedes generar un enlace para compartirlo o incluso puedes trabajar al mismo tiempo sobre el mismo código con alguien más(esto último no lo he probado aún).

Para muestra un botón, sabia que existian los Extension Methods pero jamás los habia usado y me puse a revisar, ya que necesito formatear objetos DateTime a string pero quiero evitar el tener que escribir ToString(@”yyyy-MM-dd\THH:mm:ss”) cada vez que lo necesito, así que se me ocurrió intentar crear un Extension Method , así aprendia a usarlas y ademas me servia, ya que si en algun momento el formato de fecha que debo usar cambia, solo cambio el formato es la Extension Method.

Así que este fue el resultado:

StrongTypingException: The value for column ‘IsPrimaryKey’ in table ‘TableDetails’ is DBNull

En ocasiones me ha pasado que al querer actualizar o generar algún ADO.NET Entity Data Model en Visual Studio me ha aparecido este error:

Asi que hoy voy a compartirles la forma en que solucciono este problema.

  1. Cerrar Visual Studio
  2. Ejecutar la siguiente consulta en nuestra base de datos:
  3. Abrir nuestro proyecto en Visual Studio
  4. Generar o actualizar nuestro modelo

Buscando en internet he visto que se pide que se reinicie el servicio de MySQL, en mi caso no ha sido necesario, antes al contrario, si lo hacia tenia que volver a ejecutar la consulta.

Cabe resaltar que lo he probado con MySQL 5.7.X en conjunto con EF6.

Evitando la Fatiga Visual en Visual Studio

Por internet ronda el meme de que existen 2 tipos de desarrolladores, los que usan el tema claro y los que usan el tema oscuro.

En lo personal creo que me encuentro en la zona gris, donde el tema claro me gusta más pero llega a ser molesto y el tema oscuro me es algo incómodo al haber un contraste más alto entre el texto y el fondo del editor de código.

Recientemente utilizando Android Studio encontré el tema Cyan Light Theme que la verdad me gusto muchísimo y no me molesta en lo absoluto. Puedo trabajar durante el tiempo que sea necesario tranquilamente.

Pero la verdad es que en general paso más tiempo usando Visual Studio y al no haber encontrado un tema con el que me sintiera tan cómodo, decidí hacer mi “propia” versión para Visual Studio.

Cabe resaltar que en lo personal me gusta usar este estilo con el tema “Azul” de Visual Studio (que más bien se ve morado), dando como resultado algo como lo siguiente

Vista previa de Visual Studio con el Tema Cyan Light Theme

Pueden descargar el tema desde aquí.

Migrando de SQLite a Firebird 3

Un poco de contexto

En mi trabajo se ofrece un punto de venta a tiendas pequeñas como incentivo para que adquieran los productos que ofrece mi empresa empleadora. Seguramente se estarán preguntando “Pero… ¿porqué usan SQLite para un punto de venta?”, la razón es que esta aplicación no se contempló como un sistema demasiado robusto, más bien buscaba cubrir una necesidad común de forma que fuera llamativo el consumir los productos que ofrece la empresa en la que trabajo.

Pero ya que este punto de venta se convirtió en un medio para hacer llegar anuncios o comunicados directamente a los clientes llegó al punto en que muy de ves en cuando la base de datos se bloqueaba, debido a que SQLite tiene la limitante de que solo soporta una conexión escribiendo en la base de datos. Además de que una de las nuevas funcionalidades que se requería agregar al punto de venta era que soportara múltiples usuarios, por lo que necesitábamos un nuevo motor de base de datos que soportara concurrencia.

Pero además ya existía una base de usuarios algo considerable, por lo que tener el soporte que implicaría cambiarlos a firebird podría requerir de mucho tiempo, así que tampoco era viable migrar a todos los usuarios a firebird, ya que la funcionalidad de múltiples usuarios de momento solo la usaría uno de nuestros clientes. Así que se necesitaba que el punto de venta trabajara con ambas bases de datos (pero solo una a la ves).

¿Porque Firebird 3?

Como dije antes, este punto de venta en realidad no era tan robusto, por lo que tener que agregar el instalador de MySQL que ocupa ~300MB no lo hacia el favorito.

Instalador de MySQL
Instalador de MySQL

Así que recordé que hay un punto de venta bastante grande y popular que utiliza Firebird… Microsip, así que revisé y Firebird tiene un tamaño bastante reducido de 12MB y así que se convirtió en la primera opción.

Instalador de Firebird
Instalador de Firebird

Descripción del Problema

Al revisar la clase que se encargaba de la persistencia de datos me topé con una clase de más de 6,500 lineas de código y al rededor de 140 funciones. Entonces analizando, la primera opción y la más “simple” seria copiar esta clase, cambiarle el nombre y comenzar a cambiar las consultas SQLite por consultas de Firebird.

POSDatabaseManager (Ejemplo)
POSDatabaseManager (Ejemplo)

Pero considerando que migrar de motor de base de datos no es algo que se deba tomar a la ligera (menos si tienes mas de 6,500 lineas de código y 140 funciones consultando datos). Decidí que además de crear una clase nueva con las consultas a Firebase, tenia que buscar la forma de que me fuera fácil cambiar de SQLite a Firebird.

Así que resumiendo, el problema al que nos enfrentamos a groso modo seria:

Implementar un mecanismo que nos permita que la aplicación pueda trabajar indistintamente tanto con SQLite como con Firebird.

¡Manos a la Obra!

Lo primero que vamos a hacer cambiar el nombre a la clase POSDatabaseManager a SQLiteDatabaseManager.

SQLiteDatabaseManager
SQLiteDatabaseManager

Luego crearemos una interfaz llamada IDatabaseManager que implementará SQLiteDatabaseManager y copiamos las firmas de las funciones de SQLiteManager a la interfaz. Quedando de la siguiente manera:

Implementando IDatabaseManager para SQLite
Implementando IDatabaseManager para SQLite

Bien ahora, lo que hay que hacer es cambiar todas las referencias de SQLiteManager en la aplicacion por referencias a IDatabaseManager, compilamos y no debería existir ningún error.

Todo esto no altera el funcionamiento de la aplicación y además ya tenemos todo preparado para comenzar la migración a Firebird. ¿Como lo haremos? pues fácil, crearemos la clase FirebirdDatabaseManager que también implementará la interfaz IDatabaseManager.

Implementando FirebirdDatabaseManager
Implementando FirebirdDatabaseManager

Ahora, solo resta implementar todas las funciones en la clase FirebirdDatabaseManager con sus respectivas consultas SQL para Firebird.

Bien, ahora, ¿como cambiamos de SQLite a Firebird o viceversa?, ¡Facil!, sería de la siguiente manera:

Con esto ya hemos terminado, ahora solo debemos recordar que cuando vayamos a usar el acceso a la base de datos SIEMPRE debemos utilizar referencias de la interfaz IDatabaseManager, de este modo a la aplicación le será indiferente si esta usando SQLite o Firebird.

Si se necesitara agregar alguna función nueva que acceda a la base de datos se debe declarar en IDatabaseManager de esta panera nos aseguramos de que se implemente tanto en SQLiteDatabaseManager como en FirebirdDatabaseManager.

Capturar Teclado Tipo Keylogger en C#

En esta ocasión les traigo un pequeño tutorial de como capturar las pulsaciones del teclado desde un programa en C#, es un keylogger sencillo que solo captura las pulsaciones del teclado y las muestra en un TextBox, antes que nada quiero agradecer a Hernan Vivani ya que me basé en un código que él compartió para hacer el keylogger, solo lo modifique para trabajar bajo el paradigma orientado a objetos para hacer uso de eventos para actualizar el textbox con el contedido del buffer que almacena las teclas pulsadas.

Aquí pueden ver el código original y esta es la clase ya modificada.

Ejemplo de Uso

Voy a usar un botón tanto para activar la detección como para desactivarla, este es el código del botón.

Este es el código del evento que usé para actualizar el TextBox al modificar el buffer el objeto KeyboardHook: