Índice
En este post vamos a ver como conectar nuestro código a una base de datos, en nuestro caso MySQL.
Para ello es requisito indispensable, por supuesto tener instalado MySQL, si no lo tienes instalado puedes descargarlo desde la página oficial.
1 - Conectarse a MySQL con .NET
Primero de todo vamos a ver como conectarnos a MySQL con C# de una forma “pura” sin utilizar ningún framework ni ningún ORM.
Para ello desde nuget necesitaremos instalar desde Nuget el paquete MySql.Data
y por supuesto necesitaremos saber la conexión a la base de datos en mi caso : Server=127.0.0.1;Port=3306;Database=ejemplo-conexion;Uid=root;password=test;
Para realizar consultas lo único que tenemos que hacer ahora es instanciar la conexión.
Para ello instanciamos la clase MySqlConnection
pasando por parámetro la conexión a la base de datos que hemos especificado.
string connectionString = "Server=127.0.0.1;Port=3306;Database=personal;Uid=root;password=test;";
MySqlConnection conexion = new MySqlConnection(connectionString);
Recuerda que cuando terminas una llamada a la base de datos tienes que limpiar la conexión, para ello, debemos llamar al método .Dispose()
de MySqlConnection
.
conexion.Dispose();
O en su defecto, que es como más me gusta a mi, utilizar un bloque using
dentro de nuestro método, el cual llama automáticamente al método .Dispose()
al terminar.
using (MySqlConnection conexion = new MySqlConnection(connectionString))
{
//Codigo
}
El motivo por el que prefiero utilizar using
es porque es más fácil de mantener.
Con este sencillo paso ya estaremos capacitados de hacer consultas e inserciones a la base de datos.
1.2 - Abrir la conexión con la base de datos
Primero de todo, tenemos que tener contenido dentro de nuestra base de datos.
En este ejemplo he creado dos tablas Articulo
y Autor
y entre estas dos tablas el autor tiene relación directa con el artículo. Junto a las tablas he creado dos filas para poder ver algún resultado.
Para realizar cualquier consulta o inserción lo primero que debemos hacer es abrir una conexión con la base de datos.
Lo realizaremos con el método open
de la conexión
conexion.Open();
Ahora solo nos queda crear el comando para consultar a la base de datos.
Debemos utilizar el objeto MySqlCommand
el cual nos permite crear un comando para realizar consultas, inserciones o actualizaciones, Dentro de MySqlCommand
debemos indicar la conexión y el comando a ejecutar.
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conexion;
cmd.CommandText = "select/insert/update aqui";
Como vemos dentro de .CommandText
podemos escribir texto, y esto se tragará cualquier tipo de texto, debemos tener cuidado, ya que si concatenamos las variables dentro de la consulta, puede llevar a que suframos SQL Injection.
string articuloId; //Elemento pasado desde el controlador principal a través de un httpPost/httpGet
cmd.CommandText = $"select * from Articulo where id = {articuloId}"; //OJO SQL INJECTION
Como vemos ese código puede llevarnos a recibir SQL Injection ya que, si el atacante intercepta la llamada desde el navegador al servidor y cambia el articulo id por algo como lo siguiente: 1'; drop table articulo;
El valor de nuestra consulta a la base de datos sería
"select * from Articulo where id = 1'; drop table articulo;";
Lo que nos borraría la tabla.
1.3 - Prevenir SQL Injection en C#
Podemos evitar el escenario de tener SQL injection si en nuestro comando de consulta no insertamos valores directamente, sino que los pasamos como parámetro.
Para ello debemos indicar los parámetros a utilizar en el comando SQL con un carácter interrogante ?
al principio del nombre del parámetro.
En nuestro ejemplo anterior, la variable articuloId
deja de ser una variable como tal y pasa a ser parte del comando con la forma ?articuloId
.
cmd.CommandText = $"select * from Articulo where id = ?articuloId";
Ahora mismo, el valor de articuloid que vamos a consultar es ?articuloId
lo cual no es correcto, ya que debemos asignarle el valor del artículo a consultar.
El propio objeto MySqlCommand
nos proporciona una lista de parámetros en la que podemos insertar para ello accedemos a .Parameters
y dentro al método .Add
cmd.Parameters.Add("?articuloId", MySqlDbType.Int32).Value = articuloId;
Debemos pasar dentro del .Add
el nombre del parámetro dentro de nuestra consulta y el tipo que va a ser, de esta forma evitamos posibles inyecciones, además, si seleccionamos string, comprobará lo que metemos y evitará una inyección SQL.
Finalmente, con la propiedad Value
le asignamos el valor que vamos a utilizar.
2 - Consultar información de la base de datos con .NET (select)
Para realizar una consulta en una base de datos MySQL desde .net únicamente debemos llamar al método cmd.ExecuteReader().
El cual nos devuelve un tipo MySqlDataReader
el cual tiene un método llamado .Read()
que nos devuelve un boolean
el cual nos indicará que debemos seguir leyendo.
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conexion;
cmd.CommandText = $"select * from Articulo where id = ?articuloId";
cmd.Parameters.Add("?articuloId", MySqlDbType.Int32).Value = articuloId;
Articulo articulo = new Articulo();
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
articulo.Id = Convert.ToInt32(reader["id"]);
articulo.Titulo = reader["Titulo"].ToString();
}
}
return articulo;
Debemos devolver un objeto, en vez del reader, debemos instanciar el tipo que queremos devolver, y asignarle los valores cuando leemos. Para asignarle los valores, debemos leer el contenido del reader con reader[“campo”]
y convertir en el tipo que necesitemos, ya que cuando leemos el tipo siempre es string
.
En caso de que la consulta devuelva una lista, cada bucle while
representa una fila.
3 - Insertar valores en una base de datos con .NET (insert)
Para insertar valores debemos crear nuestra conexión, como hemos hecho hasta ahora, pero esta vez deberemos llamar al método .ExecuteNonQuery()
, Debemos de pasar los parámetros de la misma forma que cuando hacemos consultas.
using (MySqlConnection conexion = new MySqlConnection(connectionString))
{
conexion.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conexion;
cmd.CommandText = "INSERT INTO `ejemplo-conexion`.`Articulo` (`Titulo`, `Contenido`, `AutorId`, `Fecha`) VALUES (?titulo, ?contenido, ?autorid, ?fecha);";
cmd.Parameters.Add("?titulo", MySqlDbType.VarChar).Value = $"nuevo titulo";
cmd.Parameters.Add("?contenido", MySqlDbType.VarChar).Value = $"nuevo contenido";
cmd.Parameters.Add("?AutorId", MySqlDbType.Int32).Value = 1;
cmd.Parameters.Add("?fecha", MySqlDbType.DateTime).Value = DateTime.Now;
cmd.ExecuteNonQuery();
}
3.1 - recoger el ID insertado
Por defecto cuando ejecutamos .ExecuteNonQuery()
nos devuelve el número de filas aceptadas, pero si estamos insertando datos, muchas veces queremos el Id del elemento que hemos insertado. Para ello existe la propiedad LastInsertedId
dentro de MySqlCommand
.
cmd.ExecuteNonQuery();
var ultimoId = cmd.LastInsertedId;
Para recoger el id insertado, la query tiene que haber sido ejecutada.
4 - Actualizar valores de una base de datos con .NET (update)
Exactamente igual que a la hora de insertar, una vez tenemos nuestro comando con los parámetros a actualizar y por supuesto nuestro filtro en el where
de la consulta SQL.
using (MySqlConnection conexion = new MySqlConnection(connectionString))
{
conexion.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conexion;
cmd.CommandText = "update `ejemplo-conexion`.`Articulo` SET `Titulo` = ?titulo where ID = ?id;";
cmd.Parameters.Add("?titulo", MySqlDbType.VarChar).Value = $"titulo actualizado";
cmd.Parameters.Add("?id", MySqlDbType.Int32).Value = 3;
cmd.ExecuteNonQuery();
}
Conclusión
- En este post hemos hecho foco en conectarnos a una base de datos MySQL desde una aplicación escrita en .NET, da igual si es ASP.NET o si es una aplicación de consola ya que el código es el mismo
- Prevenir SQL Injection en una aplicación escrita en .NET
- Realizar consultas a una base de datos desde .NET
- Insertar registros en una base de datos desde .NET
- Actualizar registros en una base de datos desde .NET