OleDB : UPDATE d'un champ Oui/Non provoque une erreur

MGD Software Messages postés 188 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 4 juillet 2024 - 13 août 2019 à 12:23
MGD Software Messages postés 188 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 4 juillet 2024 - 16 août 2019 à 19:31
Bonjour,

Encore une bizarrerie avec OleDB accédant à une base Access:

J'ai une requête qui met à jour une table dans laquelle un champ est booléen.
Tout va bien lorsqu'on le passe à True.
Mais lorsqu'on le passe à False, j'ai une exception "Type de données incompatible dans l'expression du critère."

Code :
Sql = "UPDATE T_Autorisations SET [Menu]=@menu, [Statut_ID]=@ID, [Autor]=@autor WHERE Autoris_ID=@autorid";
Cmd = new OleDbCommand(Sql, Common.gCnx);
Cmd.Parameters.AddWithValue("autorid", AutorID);
Cmd.Parameters.AddWithValue("menu", MenuKey);
Cmd.Parameters.AddWithValue("ID", CatID);
if (chkAutoris.Checked)
    Cmd.Parameters.AddWithValue("autor", true);
else
    Cmd.Parameters.AddWithValue("autor", false);

Ne vous étonnez pas des deux lignes du paramètre "autor", c'est provisoire pour pouvoir donner à la valeur du champ différentes valeurs.

J'ai essayé avec DBNull.value à la place de false, ça ne provoque plus d'erreur mais le champ n'est pas mis à jour.

J'ai eu beau chercher sur le Web, tous les exemples emploient false sans poser de problème. J'ai eu beau relire mon code à la recherche d'une erreur de paramètre, je n'ai rien trouvé d'anormal. D'ailleurs, cela fonctionne avec True.

Quelqu'un a une idée ?

3 réponses

vb95 Messages postés 3508 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 2 septembre 2024 169
16 août 2019 à 18:19
Bonjour
Peut-être vous mettre sur une piste : http://www.info-3000.com/access/cours/lecon09/lecon09.php
Car je me rappelle que les champs Oui/Non Access sont représentés par des valeurs numériques comme le souligne le lien fourni plus haut

Faux est représenté par 0
Vrai est représenté par -1 ( en vérité toute valeur différente de 0 )

Ce qui donnerait ce code pour être en adéquation avec Access au niveau de la base de données

if (chkAutoris.Checked)
    Cmd.Parameters.AddWithValue("autor", -1); // true
else
    Cmd.Parameters.AddWithValue("autor", 0); // false


sous toute réserve j'ai très peu pratiqué Access !
0
MGD Software Messages postés 188 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 4 juillet 2024 2
16 août 2019 à 19:13
C'est vrai, je n'ai pas essayé ça.
En VB6, vrai valait -1 et faux 0. Il n'y avait pas de problème.

En C#, vrai vaut 1, mais faux équivaut à null ou une chaine nulle.
Je vais essayer les valeurs 0 et 1 (ou plutôt -1)

C'est bête, mon appli est quasi finie, j'avais trouvé une solution annexe : supprimer l’enregistrement et le recréer sans fournir de paramètre pour la valeur booléenne si elle vaut faux. C'est tordu car cela demande 2 requêtes, mais ça marche.

Je vais quand même retoucher mon code, dans un souci d'optimisation (en gardant en réserve la solution actuelle).
Je donnerai le résultat.

Le moteur d'Access (Jet) est resté en 16 bits (oledb ne fonctionne pas en 32 bits, en tous cas la version 4.0 avec laquelle je travaille) et je pense qu'il est resté compatible avec VB6, qui est encore son langage de macros.

Merci pour le conseil.
0
MGD Software Messages postés 188 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 4 juillet 2024 2
16 août 2019 à 19:31
Hélas, 3 fois Hélas !

J'ai essayé la solution 0 / -1, mais pour 0 j'ai toujours l'erreur "Type de données incompatible dans l'expression du critère."
Normal, on passe au moteur de base de données une valeur numérique alors qu'il attend un booléen. Le C# est très chatouilleux sur les types de variable.
J'ai même essayé "(bool)0", mais là c'est le compilateur qui râle.

Je craque...

Je vais donc garder ma solution "annexe".

Merci quand même.
0
Rejoignez-nous