none
Problème avec une requête paramétrée

    Question

  • Bonjour,

    J'ai la requête suivante:

    var query = "UPDATE tblLR " +
                            "SET Location = @location " +
                            ", SortedLocation = @sortedLocation" +
                            ", ShortName= @shortName " +
                            ", Latitude = @latitude" +
                            ", Longitude = @longitude " +
                            " WHERE IDLR = @idLr;";
     
     
                var dBcon = new OleDbConnection(Legacy.ConString);
                var cmd = new OleDbCommand(query, dBcon);
                cmd.Parameters.Add("@idLr"OleDbType.Numeric).Value = topLegacy.Idlr;
                cmd.Parameters.Add("@location",OleDbType.VarChar).Value= topLegacy.Location.Replace("'""''");
                cmd.Parameters.Add("@sortedLocation",OleDbType.VarChar).Value= topLegacy.Location.Replace("'""''");
                cmd.Parameters.Add("@shortName",OleDbType.VarChar).Value= topLegacy.ShortName.Replace("'""''");
                cmd.Parameters.Add("@latitude",OleDbType.VarChar).Value= topLegacy.Latitude;
                cmd.Parameters.Add("@longitude",OleDbType.VarChar).Value= topLegacy.Longitude;

    Lors de son exécution j'ai une erreur de type.

    Je subodore que c'est lié au paramètre @idLr. Ce champs dans la table est un entier long.

    J'ai défini le type par OleDbType.Numeric , ai essayé avec BigInt , Int , VarNumeric mais sans succès.

    Quel est le correspondant de Entier Long ?

    Merci

    Bernard


    Bernard Bouree

    jeudi 14 décembre 2017 15:12

Réponses

Toutes les réponses

  • Bonjour,

    Ah, oui, le fameux problème de type dont il a été question dans un autre fil ...

    Hum ... Je ne suis pas incollable là-dessus comme ça du tac au tac.

    J'ai jeté un coup d'oeil à la doc de OleDbType qui a été utilisé :

    OleDbType énumération

    Il faut aussi jeter un coup d'oeil à la doc d'Access. Un temps elle était fournie en ligne avec Access, il suffisait d'appuyer sur F1 pour la lire. Quelques années après ça s'était dégradé, où est-ce qu'on en est maintenant ?

    Avec les deux docs côte à côte on peut trouver quel champ a la même longueur et la même gestion des signes que celui qu'on veut émuler.


    jeudi 14 décembre 2017 16:01
  • Re Bonjour

    J'ai les deux docs et j'ai essayé avec tous les unsigned int sans succès!

    L'entier long dans Access est codé sur 4 octets mais la liste des OleDbType énumération n'indique pas le nombre d'octets utilisés.

    Je commence à me demander si l'erreur n'est pas ailleurs.

    Le problème est que le message de l'erreur n'indique pas quel est le paramètre impliqué.

    Merci pour votre aide.

    Bernard


    Bernard Bouree

    jeudi 14 décembre 2017 17:44
  • 4 octets, ça fait 32 bits (du moins si j 'ai bien retenu ce que j'ai appris à l'école : 4*8=32).

    Donc, si je lis bien la doc dont j'ai fourni le lien, il faut essayer le type Int32.

    Ah, c'est déjà fait ?

    Que dit l'exception, exactement ?

    Attention il n'y a pas forcément que le message, l'exception peut aussi avoir d'autres propriétés.

    jeudi 14 décembre 2017 22:04
  • ça fait un moment que je n'utilise plus Access, et du coup mon expérience risque bien de ne pas être à jour.

    Ici je lis qu'on fait part de limitations concernant le support des types Access par les pilotes, notamment une limitation à 28 bits au lieu de 32 pour les entiers longs. Pourquoi diable, ça, on n'en dit pas plus.

    Autre question, d'ailleurs : dans la mesure où l'introduction parle de "The Microsoft ODBC Desktop Database Drivers", est-il abusif de ma part d'y faire référence si on parle d'une application web ? En effet, Desktop et web, ce n'est pas vraiment la même chose ...

    ça peut valoir le coup de chercher si en Anglais on trouve un forum plus spécialisé suffisamment fréquenté.

    jeudi 14 décembre 2017 22:17
  • Manifestement la recherche en est à son tout début.

    Inspiré par quelques résultats au-delà dans celle que j'ai déjà citée, j'ai aussi cherché "Access .Net type mapping", qui peut mériter la lecture.

    Puis, après une petite pause j'ai essayé "Access long to C#".

    Ceci laisse entendre que peut-être je me suis fourvoyé :

    https://stackoverflow.com/questions/31539010/correct-data-type-in-access-for-a-insert-long-integer-into-database

    • Marqué comme réponse BernardBouree vendredi 15 décembre 2017 20:55
    jeudi 14 décembre 2017 22:48
  • Bonsoir

    Problème résolu, c'était

    OleDbType.BigInt

    Merci pour votre aide

    Bernard


    Bernard Bouree

    vendredi 15 décembre 2017 20:56
  • Je dois avouer que je ne l'ai pas vu venir, celui-là.

    La bonne méthode était le tâtonnement, alors ?

    vendredi 15 décembre 2017 21:27