Mostrando entradas con la etiqueta mysql. Mostrar todas las entradas
Mostrando entradas con la etiqueta mysql. Mostrar todas las entradas

sábado, 29 de noviembre de 2025

LINQ: un lenguaje de consulta para C#

LINQ (Language Integrated Query) es una característica de C# que permite consultar y manipular datos directamente desde el lenguaje, usando una sintaxis coherente y expresiva. En lugar de escribir SQL o recorrer colecciones manualmente, LINQ te deja trabajar con objetos, colecciones, XML o bases de datos de forma declarativa.

Su ventaja primordial es: unificar la forma de consultar datos, sin importar el origen.

Se puede emplear de esta forma:

1. Sintaxis de consulta (query syntax, parecida a SQL):

var resultado = from p in db.Persons
                where p.City == "CDMX"
                orderby p.LastName
                select p;

2. Sintaxis de métodos (method syntax, con lambdas y métodos de extensión):

var resultado = db.Persons
                  .Where(p => p.City == "CDMX")
                  .OrderBy(p => p.LastName)
                  .ToList();

Como se puede observar ambas sintaxis, aunque diferentes, hacen lo mismo.

Usando LINQ en nuestro proyecto

En el post anterior vimos cómo crear una aplicación dotnet que intergra EntityFramework para trabajar con una base de datos de MariaDB. Usemos LINQ como herramienta para hacer SELECT, INSERT, UPDATE y DELETE de forma sencilla.

1. Hacer consultas como un SELECT:

using var db = new AppDbContext();

var personsInCDMX = db.Persons
                      .Where(p => p.City == "CDMX")
                      .OrderBy(p => p.LastName)
                      .ToList();

foreach (var p in personsInCDMX)
{
    Console.WriteLine($"{p.FirstName} {p.LastName} - {p.City}");
}

2. Insertar datos como un INSERT INTO:

db.Persons.Add(new Person {
    PersonId = 2,
    FirstName = "Ana",
    LastName = "García",
    Address = "Av. Reforma 456",
    City = "CDMX"
});
db.SaveChanges();

3. Modificar datos como un UPDATE:

var person = db.Persons.FirstOrDefault(p => p.PersonId == 2);
if (person != null)
{
    person.City = "Guadalajara";
    db.SaveChanges();
}

4. Remover datos como un DELETE:

var person = db.Persons.FirstOrDefault(p => p.PersonId == 2);
if (person != null)
{
    db.Persons.Remove(person);
    db.SaveChanges();
}

El código Program.cs quedaría de la siguiente manera:

using System;
using System.Linq;
using Model;

class Program
{
    static void Main()
    {
        using var db = new AppDbContext();

        // INSERT
        db.Persons.Add(new Person {
            PersonId = 2,
            FirstName = "Ana",
            LastName = "García",
            Address = "Av. Reforma 456",
            City = "CDMX"
            });
        db.SaveChanges();

        // SELECT
        var personsInCDMX = db.Persons
                      .Where(p => p.City == "CDMX")
                      .OrderBy(p => p.LastName)
                      .ToList();
        foreach (var p in personsInCDMX)
        {
            Console.WriteLine($"{p.FirstName} {p.LastName} - {p.City}");
        }
        
        // UPDATE
        var person = db.Persons.FirstOrDefault(p => p.PersonId == 2);
        if (person != null)
        {
            person.City = "Guadalajara";
            db.SaveChanges();
        }

        // DELETE
        if (person != null)
        {
            db.Persons.Remove(person);
            db.SaveChanges();
        }
        
    }
}

Y podríamos hacer más ejemplos.

Filtrar registros (Where):

// Personas que viven en CDMX
var enCDMX = db.Persons
               .Where(p => p.City == "CDMX")
               .ToList();

Seleccionar campos específicos:

// Solo nombres y apellidos
var nombres = db.Persons
                .Select(p => new { p.FirstName, p.LastName })
                .ToList();

Ordenar (ORDER BY):

// Ordenar por apellido
var ordenados = db.Persons
                  .OrderBy(p => p.LastName)
                  .ToList();

Combinar condiciones:

// Personas en CDMX o Guadalajara
var filtrados = db.Persons
                  .Where(p => p.City == "CDMX" || p.City == "Guadalajara")
                  .ToList();

Agrupar (GROUP BY):

// Agrupar personas por ciudad
var agrupados = db.Persons
                  .GroupBy(p => p.City)
                  .Select(g => new { Ciudad = g.Key, Total = g.Count() })
                  .ToList();

Unir tablas (JOIN):

var consulta = db.Persons
                 .Join(db.Orders,
                       p => p.PersonId,
                       o => o.PersonId,
                       (p, o) => new { p.FirstName, p.LastName, o.OrderDate })
                 .ToList();

Paginar (Skip y Take):

// Obtener los primeros 10 registros
var primeros10 = db.Persons
                   .Take(10)
                   .ToList();

// Saltar los primeros 10 y traer los siguientes 5
var pagina2 = db.Persons
                .Skip(10)
                .Take(5)
                .ToList();

Y otras cosas más.

Contar registros (Count):

// Total de personas en la tabla
int total = db.Persons.Count();

// Personas en CDMX
int enCDMX = db.Persons.Count(p => p.City == "CDMX");

Sumar valores (Sum):

// Suma de todas las edades
int sumaEdades = db.Persons.Sum(p => p.Age);

Obtener promedio (Average):

// Edad promedio
double promedioEdad = db.Persons.Average(p => p.Age);

Agrupación con agregados:

// Número de personas por ciudad
var personasPorCiudad = db.Persons
    .GroupBy(p => p.City)
    .Select(g => new {
        Ciudad = g.Key,
        Total = g.Count()
    })
    .ToList();

Búsquedas con Any/All:

// ¿Existe alguien en Monterrey?
bool existeMonterrey = db.Persons.Any(p => p.City == "Monterrey");

// ¿Todos viven en CDMX?
bool todosCDMX = db.Persons.All(p => p.City == "CDMX");

Proyección de cálculos:

// Proyectar nombre completo y longitud del apellido
var consulta = db.Persons
    .Select(p => new {
        NombreCompleto = p.FirstName + " " + p.LastName,
        LargoApellido = p.LastName.Length
    })
    .ToList();

LINQ es una herramienta que nos ayuda a realizar consultas de una manera sencilla.

Enlaces:

https://codemonkeyjunior.blogspot.com/2025/11/entity-framework-un-orm-para-net.html
https://learn.microsoft.com/es-es/dotnet/csharp/linq/
https://www.netmentor.es/entrada/linq-csharp

Entity Framework: un ORM para .NET

Para los programadores Java que han usado Hibernate o cualquier otro ORM sabrán que son herramientas muy útiles para el mapeo de tablas y clases Java. Pues ahorran una gran cantidad de código y horas de esfuerzo.

.NET tiene un ORM llamado EntityFramework (EF), el cual es:

"... un mapeador objeto-relacional (ORM) de Microsoft para .NET que permite a los desarrolladores interactuar con bases de datos relacionales usando objetos de C# en lugar de escribir consultas SQL".

Un ORM nos permite manipular la información de las tablas como objetos. Esto nos evita tener que lidiar con SQL nativo.

Al usar EntityFramework podemos:

  • Mapear las tablas de nuestra base de datos como si fueran clases. 
  • Manipular la información de las tablas sin necesidad de sentencias SQL. 
  • Contar con las operaciones CRUD ya "integradas". 
  • Compatibilidad con LINQ (un lenguaje para realizar consultas con C#). 
  • Permitir conectarnos distintas fuentes de datos como MS SQL Server, MySQL, PostgreSQL, etc. 
  • Simplificar nuestro código.

También debemos tener cuidado de:

  1. Observar el rendimiento de las consultas. 
  2. Entender cómo se usa LINQ.

Al usar un ORM debemos entender:

  1. Qué base de datos vamos a usar. 
  2. Qué es lo que queremos mapear (tablas). 
  3. Convertir la estructura de las tablas a objetos (mapeo). 
  4. Qué operaciones vamos a realizar sobre esos objetos (operaciones CRUD).

Comenzando con EntityFramework

Crearemos una sencilla aplicación C# usando el ORM EntityFramework.

Requisitos:

  • Contar con la herramienta dotnet instalada. 
  • Contar con MariaDB instalado. 
  • Tener nociones de C#.

1. Es necesario contar con una base de datos ("cursomariadb") y al menos una tabla en la misma (persons).

CREATE OR REPLACE TABLE persons(
personid int, 
lastname varchar(255), 
firstname varchar(255), 
address varchar(255), 
city varchar(255)
);

3. Crearemos el proyecto con la herramienta dotnet y nos ubicaremos en el directorio creado:

$ dotnet new console -n DemoEFMariaDB
$ cd DemoEFMariaDB

4. Instalar los paquetes nugets necesarios:

$ dotnet add package Microsoft.EntityFrameworkCore --version 8.0.0
$ dotnet add package Pomelo.EntityFrameworkCore.MySql --version 8.0.0

Con estos instalamos EntityFramework y el conector a MariaDB (recordar que es un fork de MySQL).

5. Dentro del directorio del proyecto crearemos una carpeta llamada Model y dentro una clase C# que homologue a la tabla.

Person.cs

namespace Model
{
    public class Person
    {
        public int PersonId { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string Address { get; set; }

        public string City { get; set; }

        public Person()
        {
            PersonId = 0;
            LastName = string.Empty;
            FirstName = string.Empty;
            Address = string.Empty;
            City = string.Empty;
        }

    }

}

6. Ahora crearemos una clase contexto para la conexión a la base de datos.

AppDbContext.cs

using Microsoft.EntityFrameworkCore;
using Model;


public class AppDbContext : DbContext
{
    public DbSet<Person> Persons { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseMySql(
            "server=localhost;database=cursomariadb;user=root;password=secreta",
            new MySqlServerVersion(new Version(10, 11, 2)) 
        );
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>().ToTable("persons"); 
        modelBuilder.Entity<Person>().HasKey(p => p.PersonId);
    }
}

7. Modificaremos el programa principal del proyecto para agregar las operaciones CRUD. Comenzaremos con la operación INSERT INTO .

Program.cs

using System;
using System.Linq;
using Model;

class Program
{
    static void Main()
    {
        using var db = new AppDbContext();

        // INSERT
        var newPerson = new Person
        {
            PersonId = 4,
            FirstName = "Juan",
            LastName = "Pérez",
            Address = "Calle Falsa 123",
            City = "CDMX"
        };
        db.Persons.Add(newPerson);
        db.SaveChanges();
        Console.WriteLine("Insertado correctamente.");
    }

}

Seguiremos con la instrucción SELECT:

// SELECT
        var persons = db.Persons.ToList();
        Console.WriteLine("Listado de personas:");
        foreach (var p in persons)
        {
            Console.WriteLine($"{p.PersonId} - {p.FirstName} {p.LastName} - {p.City}");
        }

Ahora con la instrucción UPDATE:

 // UPDATE
        var personToUpdate = db.Persons.FirstOrDefault(p => p.PersonId == 4);
        if (personToUpdate != null)
        {
            personToUpdate.City = "Guadalajara";
            db.SaveChanges();
            Console.WriteLine("Actualizado correctamente.");
        }

Finalmente con la instrucción DELETE:

// DELETE
        var personToDelete = db.Persons.FirstOrDefault(p => p.PersonId == 4);
        if (personToDelete != null)
        {
            db.Persons.Remove(personToDelete);
            db.SaveChanges();
            Console.WriteLine("Eliminado correctamente.");
        }

Código completo:

using System;
using System.Linq;
using Model;

class Program
{
    static void Main()
    {
        using var db = new AppDbContext();

        // INSERT
        var newPerson = new Person
        {
            PersonId = 4,
            FirstName = "Juan",
            LastName = "Pérez",
            Address = "Calle Falsa 123",
            City = "CDMX"
        };
        db.Persons.Add(newPerson);
        db.SaveChanges();
        Console.WriteLine("Insertado correctamente.");

        // SELECT
        var persons = db.Persons.ToList();
        Console.WriteLine("Listado de personas:");
        foreach (var p in persons)
        {
            Console.WriteLine($"{p.PersonId} - {p.FirstName} {p.LastName} - {p.City}");
        }

        // UPDATE
        var personToUpdate = db.Persons.FirstOrDefault(p => p.PersonId == 4);
        if (personToUpdate != null)
        {
            personToUpdate.City = "Guadalajara";
            db.SaveChanges();
            Console.WriteLine("Actualizado correctamente.");
        }

        // DELETE
        var personToDelete = db.Persons.FirstOrDefault(p => p.PersonId == 4);
        if (personToDelete != null)
        {
            db.Persons.Remove(personToDelete);
            db.SaveChanges();
            Console.WriteLine("Eliminado correctamente.");
        }
    }
}

8. Ejecutamos la aplicación:

$ dotnet run

Salida:

Insertado correctamente.
Listado de personas:
1 - Carmen Moreno - EDOMEX
2 - Jimena Torres - Toluca
3 - Torres Manuel - Cuajimalpa
4 - Juan Pérez - CDMX
Actualizado correctamente.

¡Hemos creado una aplicación C# con EntityFramework !

Conclusiones:

  • EntityFramework es una herramienta poderosa que nos ahorra tiempo de desarrollo simplificando el acceso datos y su manipulación. 
  • LINQ hace que las operaciones sobre las tablas sea más sencillo.
  • Su soporte a varias fuentes de datos es muy útil y no nos limita a usar una sola.
  • La complejidad de código se reduce abruptamente, ¡parece magia!
  • Aunque tiene muchas ventajas hay que considerar el rendimiento cuando existe una gran cantidad de datos.

Seguiremos con esta serie sobre C#.

Enlaces:

https://andresledo.es/csharp/entity-framework-core/
https://medium.com/@ravipatel.it/a-beginners-guide-to-entity-framework-core-ef-core-5cde48fc7f7a
https://codemonkeyjunior.blogspot.com/2025/08/programando-en-c-no-9-usando-nuget.html
https://codemonkeyjunior.blogspot.com/2019/06/instalar-paquetes-nuget-con-dotnet.html
https://es.wikipedia.org/wiki/Language_Integrated_Query
https://blog.georgekosmidis.net/using-mariadb-in-an-aspnet-core-api-with-entity-framework-core.html
https://www.entityframeworktutorial.net/
https://www.learnentityframeworkcore.com/
https://learn.microsoft.com/es-es/ef/

jueves, 5 de enero de 2017

JDBI con Groovy

En esta ocasión usaremos Groovy para crear una aplicación usando JDBI. Prácticamente es el mismo código usado la vez anterior que se dio un vistazo a JDBI. La diferencia radica en el uso de @Grapes y Grab para importar y cargar las librerías necesarias.
He aquí el código


domingo, 17 de mayo de 2015

Programando en C# no. 4

En esta ocasión crearemos un programa que nos permita conectarnos a una base de datos MySQL desde C# (usando Mono).

Necesitamos lo siguiente:
  • Usar la base de datos "test" de MySQL
  • Crear una tabla llamada "persona"
  • Descargar la librería MySql para .Net

Tabla persona:
create table persona(id int auto_increment,nombre varchar(45),apellidoP varchar(45));

insert into persona(nombre,apellidoP) values ("Armando","Cadena"), ("Juan","Villa"), ("Maria","Estevez");

Una vez descargada la librería la instalamos (desde la terminal Linux):
sudo gacutil -i MySql.Data.dll

ConexionBD.cs

using System;
using System.Data;
using MySql.Data.MySqlClient;

public class ConexionBD{
    public static void Main(string[] args){
        string connectionString =
          "Server=localhost;" +
          "Database=test;" +
          "User ID=root;" +
          "Password=5432;" +
          "Pooling=false";
       IDbConnection dbcon;
       dbcon = new MySqlConnection(connectionString);
       dbcon.Open();
       IDbCommand dbcmd = dbcon.CreateCommand();
       string sql =
           "SELECT nombre, apellidoP " +
           "FROM persona"
;
       dbcmd.CommandText = sql;
       IDataReader reader = dbcmd.ExecuteReader();
       while(reader.Read()) {
            string FirstName = (string) reader["nombre"];
            string LastName = (string) reader["apellidoP"];
            Console.WriteLine("Nombre: " +
                  FirstName + " " + LastName);
       }

       reader.Close();
       reader = null;
       dbcmd.Dispose();
       dbcmd = null;
       dbcon.Close();
       dbcon = null;
    }
}



Compilación:
mcs Monaso.cs -r:System.Data.dll -r:/home/Codemonkey/Documentos/librerias/mysql-connector-net-6.9.6-noinstall/v4.0/MySql.Data.dll

Ejecución:
mono Monaso.exe

Links
http://www.monodevelop.com/documentation/

domingo, 23 de noviembre de 2014

Programando en Java ... no. 8

Este ejercicio es muy sencillo, no es nada del otro mundo, crearemos una conexión a una base de datos MySQL, un método para insertar, actualizar, borrar y mostrar todos los datos de una tabla.

Herramientas:
  • Eclipse Luna
  • Librería  mysql-connector-java-5.1.34-bin.jar

Creamos la base de datos
create database test;

Creamos la tabla persona
create table persona(id int auto_increment primary key, nombre varchar(55),apellidoP varchar(55),apellidoM varchar(55),edad int, peso float,talla float);

Insertar valores a la tabla
insert into persona (nombre,apellidoP,apellidoM,edad,peso,talla) values ("Ernesto","Huerta","Flores",44,78.2,1.70), ("Mariana","Garcia",Torres",23,56.0,1.67);

Código de la conexión a la base de datos (Conexion.java)

La clase Persona.java tendrá las mismas propiedades de la tabla persona

public class Persona {
    private Integer id;
    private String nombre;
    private String apellidoP;
    private String apellidoM;
    private int edad;
    private Float peso;
    private Float talla;
   
    public Persona(){}

    //...demás métodos
}


Método para consultar los datos de la tabla



Método para crear persona

;


Método para actualizar persona
Método para eliminar persona

martes, 13 de diciembre de 2011

Ejemplo de uso de MySQL: una pequeña bitácora




Tener una bitácora nos ayuda a tener un mejor control de nuestra información:

  • Ver quien hace cambios por “error”.
  • Ver la fecha de la operación,
  • Tipo de operación (inserción, actualización y/o borrado).


Bueno he aquí los pasos para crear una pequeña bitácora


1. Crear la base de datos

$ create database prueba1;
$ show databases;
$ use prueba1;
2. Crear una tabla llamadas personas

create table personas (id_persona int auto_increment primary key, 
nombre varchar (50), 
apellido_p varchar (50), 
apellido_m varchar(50), 
edad int, 
peso double, 
talla double);
3. Crear un procedimiento almacenado para insertar registros


DELIMITER $$
DROP PROCEDURE IF EXISTS `prueba1`.`Insertar` $$
CREATE PROCEDURE `prueba1`.`Insertar`(in nombre varchar (50), apellido_p varchar (50), apellido_m varchar(50), edad int, peso double, talla double)

BEGIN
INSERT INTO personas (nombre,apellido_p, apellido_m , edad , peso , talla) VALUES (nombre,apellido_p, apellido_m , edad , peso , talla );

END $$

DELIMITER ;

4. Crear un procedimiento almacenado para actualizar registros
DELIMITER $$
DROP PROCEDURE IF EXISTS `prueba1`.`Actualizar` $$
CREATE PROCEDURE `prueba1`.`Actualizar` (in id_personax int,edadx int,pesox double)
BEGIN
update personas set edad=edadx,peso=pesox where id_persona=id_personax;
END $$

DELIMITER ;



5. Crear un procedimiento almacenado para eliminar registros


DELIMITER $$

DROP PROCEDURE IF EXISTS `prueba1`.`Borrar` $$
CREATE PROCEDURE `prueba1`.`Borrar` (in id int)
BEGIN
delete from personas where id_persona=id;
END $$

DELIMITER ; 


6. Invocar los procedimientos almacenados

Call Insertar (Horacio,Gomez,Carmona,25,65,1.68);
Call Insertar (Hugo,Torres,Mendez,32,67,1.70);
Call Actualizar (1, 26, 66);
Call Borrar (2);

Ver registros

select * from personas;

7. Crear un procedimiento almacenado que muestre todos los registros

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_verPersonas` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_verPersonas`()
select *from personas $$

DELIMITER ;


Para invocarlo

CALL sp_verPersonas();




8. Crear tabla que lleve un control de quien hace cambios en la base de datos prueba1

CREATE TABLE infobase (usuario varchar (50), 
descripcion varchar (50),
fecha TIMESTAMP default now());


9. Crear trigger para la inserción

delimiter $$

create trigger tr_insercion
befote insert on personas
for each row
begin
insert into infobase values(user(),persona creada,now());

end $$


10. Crear trigger para la actualización

delimiter $$

create trigger tr_actualizacion
befote update on personas
for each row
begin
insert into infobase(usuario,descripcion,fecha) values(user(),persona modificada,now());

end $$


11. Crear trigger para la eliminación

delimiter $$

create trigger tr_borrado
befote delete on personas
for each row
begin
insert into infobase values(user(),persona eliminada,now());

end $$


Ver cambios

select * from infobase;


12. Crear procedimiento almacenado para ver un registro en particular

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_verPersona` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_verPersona`(in id_buscar int)
select *from personas where id_persona=id_buscar $$

DELIMITER ;

13. Ahora hacer una operación: calcular el I.M.C. (Índice de Masa Corporal) de las personas registradas

Fórmula: peso/(talla*talla)

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_verImc` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_verImc`()
select id_persona,nombre,edad,peso,talla,peso/(talla*talla) from personas $$

DELIMITER ;


14. Programa en Java para ver los registros
package control.pruebas;

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;

public class Codemonkey {

public static void main(String[] args) {
try{
 Class.forName("com.mysql.jdbc.Driver");
 Connection conecta=(Connection)  DriverManager.getConnection("jdbc:mysql://localhost:3306/prueba1","root","root");
 System.out.println("\tConexión exitosa\n");
 Statement sentencia= conecta.createStatement();
ResultSet registro=sentencia.executeQuery("select id_persona,nombre,edad,peso,talla,peso/(talla*talla) from personas");

   while(registro.next()){
    System.out.println("\t\nId: "+registro.getInt("id_persona"));
    System.out.println("Nombre: "+registro.getString("nombre"));
    System.out.println("Edad:"+registro.getInt("edad"));
    System.out.println("Peso:"+registro.getDouble("peso"));
    System.out.println("Talla: "+registro.getDouble("talla"));
    System.out.println("IMC: "+registro.getDouble("peso/(talla*talla)"));
  }
   conecta.close();
   System.out.println("\tConexión cerrada");
}catch(Exception ex){
    ex.printStackTrace();
}

}


}



Enlaces:

https://dev.mysql.com/doc/refman/8.4/en/create-procedure.html


Jai un lenguaje de programación inspirado en C++

Hoy hablaremos de un nuevo lenguaje de programación llamado Jai . Se trata de un lenguaje de programación que está desarrolland...

Etiquetas

Archivo del blog