Opération de mise à jour

  1. Pour les mises à jour avec Dapper, utilisez la méthode Execute() afin d’exécuter des requêtes UPDATE ; elle renvoie le nombre de lignes affectées.
  2. La clause WHERE est obligatoire, sans elle toutes les lignes de la table seront modifiées !
  3. À éviter : la construction de SQL par concaténation de chaînes (approche basique de l’illustration), elle introduit une vulnérabilité d’injection SQL.
  4. 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 UPDATE et utilisez WHERE pour 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)
  1. La clause WHERE est indispensable
    Oublier WHERE donne UPDATE student SET xxx : toutes les lignes de la table sont écrasées, ce qui cause des incidents graves.
  2. Correspondance stricte des noms de paramètres
    La casse n’est pas prise en compte entre @NomParamètre dans le SQL et les propriétés de l’entité ou de la classe anonyme, mais les noms doivent être identiques.
  3. 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.
  4. 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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *