IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Requete Access. La conversion de la chaîne " ' , ' " en type 'Double' n'est pas valide.


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 17
    Points
    17
    Par défaut Requete Access. La conversion de la chaîne " ' , ' " en type 'Double' n'est pas valide.
    Bonjour
    Voici les codes :

    Déclaration des variables en vb.net
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private IDLocalite As Integer
    Private IDPays As Integer
    Private CP As Integer
    Private NomCommune As String
    La requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd = New OleDbCommand("insert into Localite(ID_Pays,Denomination,CP) values('" & IDPays + "','" + NomCommune + "','" + CP & "')", con)
    Dans la base de données access
    ID Pays : Numérique entier
    CP : Numérique entier long

    Message d'erreur :
    La conversion de la chaîne " ' , ' " en type 'Double' n'est pas valide.
    J'ai l'impression qu'il essaye d'écrire du double alors que le champ dans la BDD est en entier. Comment contourner le problème ?

    Merci beaucoup !

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    le ' n'est nécessaire qu'autour des chaines
    les nombres sont à passer directement

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    J'en avais pas mis à la base.. le problème est le même.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    C'est pas partout ou null part qu'on met ces guillemets.

    C'est uniquement sur les valeurs de type Text !

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    J'avais bien compris

    Pour éviter tout malentendu voici le code sans ' inutiles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                cmd = New OleDbCommand("insert into Localite(ID_Pays,Denomination,CP) values(" & IDPays + ",'" + NomCommune + "'," + CP & ")", con)

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    le nom de ta commune n'aurais pas un ' dedans ?

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Non pas de ' dans le nom de la commune

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Remplace NomCommune par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomCommune.Replace("'","''")
    Si ca ne marche toujours pas, il nous faut la valeur interprétée de ta requête SQL au moment ou l'exception est lancée. Pour ceci je te conseille de modifier ton code comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim query As String = "insert into Localite(ID_Pays,Denomination,CP) values(" & IDPays & ",'" & NomCommune.Replace("'","''") & "'," & CP & ")"
    cmd = New OleDbCommand(query , con)
    P.S. Evite aussi de concatener une string avec des + au passage!

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Voici une capture d'écran :

    Depuis l'utilisation de cmd=new OleDbCommand sur avis de sinople. Le message d'erreur (générée a partir du catch) n'est plus le meme. Le message est maintenant le suivant : "0"



    Possible que ce soit la , entre les variables qui pose problème ?

  10. #10
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    A priori de ce que je vois la requête à l'air correcte. As-tu vérifier qu'il n'y a pas un enregistrement dans la base?

    Par contre tu fais un mix un peu bizarre avec ton code en commentaire.

    Pour la requête Insert on utilise en principe un

    Qui renvoie un Integer t'indiquant le nombre de ligne enregistrée/modifiée.

    Pour vérifier que ta requête soit correcte il te suffit de copier la valeur de query et de coller ça sous Access dans une nouvelle requête en SQL.

    Mais 0 n'est pas un message d'erreur à ma connaissance (tu confonds pas avec ta messageBox, vu que à priori un ExecuteScalar sur un Insert j'ai des doutes que ça renvoie quelque chose et que 0 est la valeur par défaut de la variable IDlocalité).

    Si tu veux récupérer l'IDlocalité, probablement un champ autoincrémenté, ça marche pas comme ça en ADO.NET...

    Solution 1:

    Gérer l'autoincrémentation dans l'application en faisant 2 requête dans une transaction (Un select pour trouver l'id le plus grand et Un Insert pour le nouvel enregistrement avec le nouvel ID fait à la main). Et non pas l'inverse hein...

    Solution 2:

    Si un ou plusieurs autres champs représentent une contrainte d'unicité, Il est possible de faire un SELECT en ce basant sur ces champs pour retrouver l'enregistrement (Très boiteux et rarement applicable comme solution...)

    Solution 3 (avec DataSet seulement):

    Supprimer le row nouvellement inséré dans le dataset (qui a un ID faux car pas générer par la base de donnée) puis réalisé un merge qui permettera de récupérer les nouvelles enregistrements avec l'ID correct dans la base de donnée sans écrasé d'autre modification en local actuellement en suspend (pourquoi je suis sur que la moitié des lecteurs ont décroché là... Lisez le cours ADO.NET dedieu )

    Solution 4:

    Ce dire que le VBA c'était pas si mal finalement

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    je plussoie en grande partie
    ici executescalar va retourner nothing, qui mit dans un entier non nullable se transforme en 0 (edit en relisant : sinople a aussi expliqué ca ^^)

  12. #12
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 17
    Points
    17
    Par défaut
    Parfait !

    Voici les 3 lignes finales :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                Dim query As String = "insert into Localite(ID_Pays,Denomination,CP) values(" & IDPays & ",'" & NomCommune & "'," & CP & ")"
                cmd = New OleDbCommand(query, con)
                cmd.ExecuteNonQuery()
    En ce qui concerne l'auto incrémentation, je vais utiliser ta solution 1, elle est effectivement mieux pensée

    Merci beaucoup, topic résolu !

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    pour l'auto incrément sur une vrai sgbdr, on laisse la base de données s'en occuper, et on récupère l'id créé après l'insert

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] la conversion de type 'DbNull' en type 'Double' n'est pas valide
    Par billinfopro dans le forum VB.NET
    Réponses: 2
    Dernier message: 28/09/2014, 01h29
  2. [Débutant] Erreur La conversion de la chaîne "" en type 'Double' n'est pas valide.
    Par dragondu83 dans le forum VB.NET
    Réponses: 5
    Dernier message: 24/07/2014, 20h06
  3. [Débutant] La conversion de la chaîne "" en type 'Double' n'est pas valide.
    Par amine_maximus dans le forum VB.NET
    Réponses: 6
    Dernier message: 09/06/2012, 23h11
  4. Réponses: 6
    Dernier message: 04/07/2011, 15h53
  5. Réponses: 16
    Dernier message: 06/06/2007, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo