Bonjour

Encore besoin d'aide ...

Je n'arrive pas à comprendre le fonctionnement du SQLiteDataAdapter.

Voulant afficher dans DatagridView le résultat d'une requête avec un JOIN, je me suis trouvé" face à une erreur au moment de valider les données dans la base.

System.Data.DBConcurrencyException*: 'Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.'
En cherchant sur le net, j'ai compris (peut-être à tort) que UpdateCommand ne peut pas faire la mise à jour à partir de ce genre de requête si j'utilise le SQLiteCommandBuilder.

J'ai donc décidé de faire ma propre requête d'update pour ne mettre à jour QUE la table principale utilisée dans la requête.
Mais j'obtiens toujours la même erreur alors que cette requête ne concerne qu'une seule table.

Voilà mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                adapter = new SQLiteDataAdapter();
 
                // Requête qui ne pose pas de problème
                //adapter.SelectCommand = new SQLiteCommand("select d.id, d.name, d.description from documents d", cnx);
 
                // Requête qui déclenche l'erreur au moment de l'update.
                adapter.SelectCommand = new SQLiteCommand("select g.name Groupe, d.name `Nom document`, d.description" +
                    " from documents d inner join groups g on d.group_id = g.id", cnx); 
 
                // Requête en UPDATE qui ne concerne que la table principale
                adapter.UpdateCommand = new SQLiteCommand("update documents set name = @name, description = @description " +
                    "where id = @id", cnx);
                adapter.UpdateCommand.Parameters.Add("@name", DbType.String, 100, "name");
                adapter.UpdateCommand.Parameters.Add("@description", DbType.String, 100, "description");                
                var idParam = adapter.UpdateCommand.Parameters.Add("@id", DbType.Int32, 0, "id");
                idParam.SourceVersion = DataRowVersion.Original; 
 
                table = new DataTable();
 
                adapter.Fill(table);
                _bindingSource.DataSource = table;
Pourquoi cette requête déclenche l'erreur alors que je ne traite qu'une seule table ? :-(