- Las actualizaciones en Dapper usan el método
Execute()para ejecutar sentenciasUPDATEy devuelven el número de filas afectadas. - Es obligatorio añadir la condición
WHERE, si se omite se actualizarán todas las filas de la tabla. - No recomendado: construir SQL mediante concatenación de cadenas (el enfoque sencillo del texto original), genera una vulnerabilidad de inyección SQL.
- Recomendado: consultas parametrizadas con
@NombreParametro, usando objetos de entidad o clases anónimas para el mapeo automático.
Nota original: la lógica de actualización es similar a la de inserción; redacta la sentencia
UPDATEy usaWHEREpara modificar únicamente las filas objetivo.
Ejemplo
// Código peligroso! Concatenación de cadenas con riesgo de inyección SQL, solo como ejemplo incorrecto
using (IDbConnection db = new MySqlConnection(conn))
{
var id = 1;
string sqlUpdate = "UPDATE student set FirstName='NuevoNombre',LastName='NuevoApellido',Email='NuevoCorreo' WHERE Id=" + id;
int rows = db.Execute(sqlUpdate);
var info = db.Query<Student>("Select * From student WHERE Id=" + id, new { id }).SingleOrDefault();
}Lenguaje del código: C# (cs)
Implementación parametrizada estándar
using System.Data;
using MySql.Data.MySqlClient;
using Dapper;
using System.Configuration;
static void Main(string[] args)
{
var conn = ConfigurationManager.ConnectionStrings["StudentConnection"].ConnectionString;
using (IDbConnection db = new MySqlConnection(conn))
{
// 1.SQL de actualización con marcadores de parámetro @
string sqlUpdate = @"UPDATE student
SET FirstName=@FirstName, LastName=@LastName, Email=@Email
WHERE Id=@Id";
// 2.Preparar datos de actualización usando un objeto entidad
var stu = new Student()
{
Id = 1,
FirstName = "foxdevelop",
LastName = "com",
Email = "admin@foxdevelop.com"
};
// 3.Ejecutar actualización y obtener filas afectadas
int rowsAffected = db.Execute(sqlUpdate, stu);
// 4.Consultar para comprobar el resultado
var studentInfo = db.Query<Student>(
"SELECT * FROM student WHERE Id=@Id",
new { Id = 1 }
).SingleOrDefault();
}
Console.ReadKey();
}
// Clase entidad Student
public class Student
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}Lenguaje del código: C# (cs)
- La condición WHERE es imprescindible
Si olvidasWHEREobtendrásUPDATE student SET xxx, modificando toda la tabla y provocando fallos graves. - Coincidencia estricta de nombres de parámetros
No distingue mayúsculas y minúsculas entre@NombreParametrodel SQL y las propiedades de la entidad o clase anónima, pero los nombres deben coincidir. - Significado del valor devuelto
int rowsAffected: mayor que cero significa filas actualizadas; cero significa que no hubo registros coincidentes. - Aviso de seguridad
Nunca construyas SQL concatenando cadenas. Las entradas externas pueden generar ataques de inyección SQL.
Actualizar solo algunos campos
Si solo quieres cambiar el correo electrónico, no hace falta escribir todas las columnas:
UPDATE student SET Email=@Email WHERE Id=@Id
Operación de actualización
Previous: Inserción