articulo

C# y MS SQL Server en el contenedor

c# mssql y fedora

C# como lenguaje de programación, mssqlserver como gestor de base de datos y fedora como sistema operativo donde permita crear una aplicación sencilla. No era algo rentable hasta ahora. Claro que con una versión de mssqlserver en docker es posible.

Una vez que ya se tiene instalado el contenedor con mssqlserver, ya si instalo .netcore. No queda otra cosa que probar la conexión desde c# un clásico, insertar, actualizar, eliminar y mostrar el contenido de la tabla afectada.

Para el ejercicio se creo una tabla con el nombre TestDB, el cual contiene una tabla llamada inventario, donde tendrá tres campos, un identificador (ID) de tipo entero, un nombre de tipo nvarchar con una longitud de 50 y para terminar un campo cantidad de tipo entero. El código usado para crear la base de datos y la tabla fue el siguiente:

Todos los archivos los encuentras en el github

Create datababase TestDB;
go
Use TestDB;
go
Create table inventario (id int, nombre nvarchar(50), cantidad int);
go

Librerías

Las librerías que se usaron para la creación de este ejercicio fueron

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

Funciones

Se crearon cuatro funciones la primera que se creo fue la de mostrar los datos de la tabla, una de insertar un registro, otra para actualizar un registro y finalmente una para eliminar el registro de la tabla. Es con fines didácticos y probar el comportamiento de .net core y mssql server en una distribución linux.

Función Mostrar datos

Esta función permitió mostrar el contenido de la tabla inventario después de cada acción que se realizo (inserción, actualización y eliminación). Y le pide al usuario que pulse una tecla para que continue con el proceso.

void MuestraDatos()
                            {
                                SqlDataAdapter adaptador = new SqlDataAdapter("Select * from inventario",connection);
                                DataTable dt = new DataTable();
                                adaptador.Fill(dt);
                                Console.WriteLine(">>> Mostrando contenido de la tabla inventario <<<");
                                Console.WriteLine("ID    -|- Nombre          -|- Cantidad");
                                Console.WriteLine("--------------------------------------");
                                foreach (DataRow item in dt.Rows)
                                {
                                    Console.WriteLine(item["id"].ToString() + "     -|- "+item["nombre"].ToString() + "        -|- " + item["cantidad"]);
                                }
                                Console.WriteLine(">>> Fin del contenido de la tabla inventario <<< ");
                                Console.WriteLine("Pulse una tecla para continuar");
                                Console.ReadKey(true);
                            }

Función Registrar datos

Esta función permitió agregar un registro a la tabla inventario y manda a llamar a la función MostrarDatos(), para visualizar el registro que se agrego. Vea imagen 1

void RegistraDatos()
                            {
                                String sql = "";
                                Console.WriteLine("Preparando insercición de registros en inventario");
                                sql="Use TestDB; Insert Into inventario values (1,'Manzanas',300);";
                                SqlCommand command = new SqlCommand(sql,connection);
                                command.ExecuteNonQuery();
                                Console.WriteLine("Registro insertado con éxito");
                                MuestraDatos();
                            }

Función Actualizar datos

Esta función permitió agregar un registro a la tabla inventario y manda a llamar a la función MostrarDatos(), para visualizar la afectación a la fila realizada. Vea imagen 2

void ActualizaDatos()
                            {
                                String sql = "";
                                Console.WriteLine("Cambiar el nombre Manzanas por Sandias");
                                sql="Use TestDB; Update inventario set nombre = 'Sandias' where id=1";
                                SqlCommand commandA = new SqlCommand(sql,connection);
                                commandA.ExecuteNonQuery();
                                Console.WriteLine("Registro Actualizado con éxito");
                                MuestraDatos();
                            }

Función Eliminar datos

Finalmente esta función, vacía el registro de la tabla inventario y manda a llamar a la función MostrarDatos(), para que se visualice la eliminación. Vea imagen 3

void EliminaDatos()
                            {
                                String sql = "";
                                Console.WriteLine("Vaciar la tabla inventario");
                                sql="Use TestDB; Delete inventario";
                                SqlCommand commandE = new SqlCommand(sql,connection);
                                commandE.ExecuteNonQuery();
                                Console.WriteLine("Tabla inventario vaciada con éxito");
                                MuestraDatos();
                            }

Código completo usado

Tenía mas de un par de décadas que no tocaba c# y mssql. Parte del código se consolido con la documentación que ofrece Microsoft para la comprobación de conexión con mssql en el docker.

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SqlServerColumnstoreSample
{
    class Program 
    {
        static void Main(string[] args)
        {
            Console.WriteLine(" Conectando con sqlserver desde c# ");
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
            builder.DataSource = "localhost";
            builder.UserID = "sa";
            builder.Password = "Nemesis28;";
            builder.InitialCatalog = "master";
            Console.WriteLine("Conectando con sqlserver");
            using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
            {
                            void MuestraDatos()
                            {
                                SqlDataAdapter adaptador = new SqlDataAdapter("Select * from inventario",connection);
                                DataTable dt = new DataTable();
                                adaptador.Fill(dt);
                                Console.WriteLine(">>> Mostrando contenido de la tabla inventario <<<");
                                Console.WriteLine("ID    -|- Nombre          -|- Cantidad");
                                Console.WriteLine("--------------------------------------");
                                foreach (DataRow item in dt.Rows)
                                {
                                    Console.WriteLine(item["id"].ToString() + "     -|- "+item["nombre"].ToString() + "        -|- " + item["cantidad"]);
                                }
                                Console.WriteLine(">>> Fin del contenido de la tabla inventario <<< ");
                                Console.WriteLine("Pulse una tecla para continuar");
                                Console.ReadKey(true);
                            }
                            void RegistraDatos()
                            {
                                String sql = "";
                                Console.WriteLine("Preparando insercición de registros en inventario");
                                sql="Use TestDB; Insert Into inventario values (1,'Manzanas',300);";
                                SqlCommand command = new SqlCommand(sql,connection);
                                command.ExecuteNonQuery();
                                Console.WriteLine("Registro insertado con éxito");
                                MuestraDatos();
                            }
                            void ActualizaDatos()
                            {
                                String sql = "";
                                Console.WriteLine("Cambiar el nombre Manzanas por Sandias");
                                sql="Use TestDB; Update inventario set nombre = 'Sandias' where id=1";
                                SqlCommand commandA = new SqlCommand(sql,connection);
                                commandA.ExecuteNonQuery();
                                Console.WriteLine("Registro Actualizado con éxito");
                                MuestraDatos();
                            }
                            void EliminaDatos()
                            {
                                String sql = "";
                                Console.WriteLine("Vaciar la tabla inventario");
                                sql="Use TestDB; Delete inventario";
                                SqlCommand commandE = new SqlCommand(sql,connection);
                                commandE.ExecuteNonQuery();
                                Console.WriteLine("Tabla inventario vaciada con éxito");
                                MuestraDatos();
                            }
                connection.Open();
                Console.WriteLine("Conexión establecida con exito");
                RegistraDatos();
                ActualizaDatos();
                EliminaDatos();                
            }
        }
    }
}

Creando la Aplicación

Me genero cierta sorpresa que se tenga que usar el commando dotnet (después de instalarlo el .netcore) muy al estilo de java, rust, python, go e incluso ruby. En el sentido que para crear la aplicación se tiene que ejecutar el comando:

dotnet new console -o NombreAplicacion

Lo que genera una carpeta donde viene el xml, y main del programa ya solo se tiene que editar el fichero Program.cs y después de eso ejecutar el comando:

dotnet run

Claro que se tiene que estar dentro de la carpeta que se creo con el comando anterior para que se ejecute, cada modificación que se realice al fichero Program.cs, se debe de ejecutar el comando dotnet.cs

Imagen 1. Insertando registro en la tabla inventario. Fuente: tumblr.com
Imagen 2. Actualizando registros en la tabla inventario. Fuente: Tomado de tumblr.com
Imagen 3. Eliminando registros en la tabla inventario. Fuente: tumblr.com

Finales

Es satisfactorio poder ahora crear aplicaciones en csharp con conexión en mssql, sobre todo que ya hay soporte para distribuciones linux, se espera que pronto salga las versiones arm para que puedan ser ejecutadas y creadas en las nuevas Mac.

La aplicación de consola es muy sencilla, pero permitió ver la facilidad de conexión, quizá en otra entrada se dedique una con interfaz gráfica. Recuerdo que antes solo se usaba una versión de mono para poder crear aplicaciones en csharp, pero al quererlas ejecutar en windows era un rollo. Solo faltaría ver si eso se ha quitado o no.

No se debe de olvidar que el servicio de docker debe de estar en ejecución para que la conexión pueda generarse.

Leave a Reply

Your email address will not be published. Required fields are marked *