Bonjour,
Dans mon Form.Load, j'initialise mes datatables.
Me.montableAdapter.Fill(Me.MonDataSetTypé.MaDataTable)
J'en ai ainsi une dizaine à charger de cette manière.
J'ai remarqué, que la première de la liste provoque une erreur :
{"Impossible d'activer les contraintes. Une ou plusieurs lignes contiennent des valeurs qui violent les contraintes de type non null, unique ou de clé externe."}
Si je l'entoure par un Try/Catch, avec rien dans le Catch, et la suite dans un Finally, je peux laisser l'appli continuer comme si de rien n'était. Actuellement mon code ressemble donc à cela :
1 2 3 4 5 6 7 8 9
| Try
Me.montableAdapter1.Fill(Me.MonDataSetTypé.MaDataTable1)
Catch
Finally
Me.montableAdapter2.Fill(Me.MonDataSetTypé.MaDataTable2)
Me.montableAdapter3.Fill(Me.MonDataSetTypé.MaDataTable3)
...
Me.montableAdapterN.Fill(Me.MonDataSetTypé.MaDataTableN)
End Try |
Vous admettrez que ce n'est pas très élégant.
J'ai vérifié que l'erreur ne se produit pas sur toutes les lignes. J'en ai en fait 2 qui provoquent cette erreur. Par exemple MaDataTable1 et MaDataTable 3
Mais si j'écris :
1 2 3 4 5 6
| Try
Me.montableAdapter1.Fill(Me.MonDataSetTypé.MaDataTable1)
Catch
Finally
Me.montableAdapter2.Fill(Me.MonDataSetTypé.MaDataTable2)
Me.montableAdapter3.Fill(Me.MonDataSetTypé.MaDataTable3) |
L'erreur sur MaDataTable1 est bien catchée et aucune erreur ne se déclenche sur MaDataTable3.
Idem si j'écris :
1 2 3 4 5 6
| Try
Me.montableAdapter3.Fill(Me.MonDataSetTypé.MaDataTable3)
Catch
Finally
Me.montableAdapter2.Fill(Me.MonDataSetTypé.MaDataTable2)
Me.montableAdapter1.Fill(Me.MonDataSetTypé.MaDataTable1) |
L'erreur sur MaDataTable3 est bien catchée et aucune erreur ne se déclenche sur MaDataTable1.
Cela ne me semble pas très logique. Si j'avais vraiment un pb de SQL dans ma requête sous-jacente, l'erreur devrait se produire à chaque fois que je charge la DataTable, non ?
Or l'erreur ne se produit qu'une fois dans tout le code. c'est pour ça que ma méthode qui consiste à entourer la première occurrence de cette instruction dans un Try/catch marche. Je n'ai pas besoin de le faire si je réitère cette même instruction ailleurs.
Evidemment, j'ai aussi regardé ce qui se passe dans ma SQL. Il s'agit d'une requête sur plusieurs tables dont certaines comportent des champs dont le nul est interdit relié à une autre table par un LEFT JOIN.
Par exemple, en simplifiant :
1 2 3 4 5 6
| SELECT table1.champ1, table2.champ2
FROM table1
LEFT JOIN table2 ON table1.clé = table2.clé
' dans cet exemple champ2 n'existe que dans table2 et n'accepte pas les valeurs nulles dans table2
' mais la requête peut aboutir à afficher un champ2 nul en toute logique.
' C'est le principe même du LEFT JOIN |
- Pourquoi l'erreur ne se produit qu'une fois dans le code ?
- Eventuellement, qqun a-t-il une solution pour supprimer "proprement" l'erreur ?
Partager