- Pour les mises à jour avec Dapper, utilisez la méthode
Execute()afin d’exécuter des requêtesUPDATE; elle renvoie le nombre de lignes affectées. - La clause
WHEREest obligatoire, sans elle toutes les lignes de la table seront modifiées ! - À éviter : la construction de SQL par concaténation de chaînes (approche basique de l’illustration), elle introduit une vulnérabilité d’injection SQL.
- Recommandé : les requêtes paramétrées avec
@NomParamètre, associées à des objets entité ou des classes anonymes pour le mappage automatique.
Note d’origine : la logique de mise à jour ressemble à celle de l’insertion ; écrivez votre requête
UPDATEet utilisezWHEREpour ne modifier que les lignes ciblées.
Exemple
// Code dangereux ! Concaténation de chaînes, risque d’injection SQL, exemple à ne pas reproduire
using (IDbConnection db = new MySqlConnection(conn))
{
var id = 1;
string sqlUpdate = "UPDATE student set FirstName='NouveauPrénom',LastName='NouveauNom',Email='NouveauMail' WHERE Id=" + id;
int rows = db.Execute(sqlUpdate);
var info = db.Query<Student>("Select * From student WHERE Id=" + id, new { id }).SingleOrDefault();
}Langage du code : C# (cs)
Implémentation paramétrée standard
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.Requête de mise à jour avec emplacements de paramètres @
string sqlUpdate = @"UPDATE student
SET FirstName=@FirstName, LastName=@LastName, Email=@Email
WHERE Id=@Id";
// 2.Préparer les données à mettre à jour via un objet entité
var stu = new Student()
{
Id = 1,
FirstName = "foxdevelop",
LastName = "com",
Email = "admin@foxdevelop.com"
};
// 3.Exécuter la mise à jour et récupérer le nombre de lignes affectées
int rowsAffected = db.Execute(sqlUpdate, stu);
// 4.Interroger pour vérifier le résultat
var studentInfo = db.Query<Student>(
"SELECT * FROM student WHERE Id=@Id",
new { Id = 1 }
).SingleOrDefault();
}
Console.ReadKey();
}
// Classe entité Student
public class Student
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}Langage du code : C# (cs)
- La clause WHERE est indispensable
OublierWHEREdonneUPDATE student SET xxx: toutes les lignes de la table sont écrasées, ce qui cause des incidents graves. - Correspondance stricte des noms de paramètres
La casse n’est pas prise en compte entre@NomParamètredans le SQL et les propriétés de l’entité ou de la classe anonyme, mais les noms doivent être identiques. - Signification de la valeur retournée
int rowsAffected: supérieur à zéro signifie que des lignes ont été modifiées ; zéro signifie qu’aucun enregistrement ne correspond. - Consigne de sécurité
Ne jamais construire du SQL par concaténation brute. Des saisies externes peuvent déclencher des injections SQL.
Mise à jour sur certains champs seulement
Si vous voulez modifier uniquement l’adresse mail, inutile de lister toutes les colonnes :
UPDATE student SET Email=@Email WHERE Id=@Id
Opération de mise à jour
Previous: Insertion