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 :

[Bases de données] Gérer un numéro auto en insérant


Sujet :

VB.NET

  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Par défaut [Bases de données] Gérer un numéro auto en insérant
    Bonjour,

    Je suis en train de coder un programme en vb.net, et j'utilise en même temps une base de données access.
    Mon problème est le suivant: Dans l'une de mes tables, j'ai défini un numéro automatique comme clé primaire (censé donc être incrémenté de 1 pour chaque nouvel enregistrement), mais le hic c'est que, lorsque j'essaye d'insérer en codant (en utilisant le "insert ...") je suis obligé de passer moi-même une valeur ce qui fait que mon objectif (insertion automatique de la clé primaire) n'est du coup pas atteint.

    y aurait-il une façon de remédier à celà SVP ?

    PS: Si je me suis pas très bien exprimé, veuillez me le dire afin que je reformule.

    Merci ^^

  2. #2
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 51
    Par défaut
    Normalement, si tu ne spécifies pas le numéro, ta base de données le gèrera pour toi si tu as bien mis le type/contrainte dans access..

    Sinon, peux-tu nous montrer ton code de Insert?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Par défaut
    Bonsoir

    +1 avec Pacane, si vous avez défini un champs comme PrimaryKey avec auto-incrément, vous ne devez pas le mettre dans la requête INSERT.

  4. #4
    Membre averti
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Par défaut
    Eh bien quand je spécifie pas de numéro, ma base de donnée génère une exception Oledb avec le message suivant
    Le nombre de valeurs de la requête doit coïncider avec le nombre de champs destination.
    Sinon, voici ma ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connexionBD.mettreAJour("insert into CR_EMPLO values (1, """ & logonEmploye & """, """ & nouveauCr.cr.numCr & """, """ & nouveauCr.dateDebutCr & """, """ & nouveauCr.dateFinCr & """)")
    Le premier argument de insert (le 1) c'est lui qui est censé être un numéro auto, je le hardcode afin que ça s'exécute.

    Merci pour vos réponses

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 51
    Par défaut
    Premièrement tu vas utiliser des paramètres dans tes requêtes, ça ira mieux.

    Je montre un exemple.
    PS: Je ne sais pas si Access fonctionne comme MSSQL, mais voici comment ça devrait être

    PS2: J'ai fait avec cette syntaxe de mémoire, il risque d'avoir quelques trucs qui clochent, mais l'idée est là...

    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim MaConnexion as new SQLConnection()
    MaConnexion.ConnectionString = "MonConnectionString"
     
    Dim MaRequete as new SQLCommand()
    MaRequete.Connection = MaConnexion
    MaRequete.Parameters.Add("nom", sqldbtype.varchar, 30).Value = "Bob"
    MaRequete.Parameters.Add("age", sqldbtype.int32).Value = 20
     
    'S'il y a un autoIncrémente, il va se faire tout seul.
    MaRequete.CommandText = "Insert into table values (@nom, @age)"
     
    MaRequete.ExecuteNonQuery()

    J'espère que cela t'a aidé.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Par défaut
    Bonjour

    Re +1 avec Pacane et je me répète

    Si vous avez défini un champs comme PrimaryKey avec auto-incrément, vous ne devez pas le mettre dans la requête INSERT.

  7. #7
    Membre averti
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Par défaut
    Merci pour vos réponses.
    Malheureusement, ça m'aide pas, la syntaxe de Pacane ne m'est pas familière, je ne pense pas que ce soit applicable à Access et de toute façon je ne pense pas que ma syntaxe soit la source du problème.

    @Geo2A, Aussi étrange que cela pourrait te paraître, quand je ne mets rien, une exception se lève.

  8. #8
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Sous Access, les champs autoincrément ne doivent pas être spécifiés dans la command insert.

    Pour récupérer la valeur du champ après l'insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Id=new OleDbCommand("SELECT @@IDENTITY FROM MaTable").ExecuteScalar() ;

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    291
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 291
    Par défaut
    Bonjour,

    Eh bien quand je spécifie pas de numéro, ma base de donnée génère une exception Oledb avec le message suivant
    Citation:
    Le nombre de valeurs de la requête doit coïncider avec le nombre de champs destination.
    Sinon, voici ma ligne de code:
    Code :

    connexionBD.mettreAJour("insert into CR_EMPLO values (1, """ & logonEmploye & """, """ & nouveauCr.cr.numCr &
    Manifestement le nombre de valeurs ne coïncide pas avec le nombre de champs, ce en ne tenant pas compte du champs autoincrement.

    2) Un requête INSERT INTO est tout de même plus propre et plus lisible comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     INSERT INTO MaTable ( champs1, champs2 ) VALUES ( valuechamps1, valuechamps2);

  10. #10
    Membre éclairé Avatar de Cereal123
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2004
    Messages : 414
    Par défaut
    Effectivement, comme le dit Geo2A, tu dois préciser les colonnes que tu vas renseigner avant la clause "VALUES" de ta requête. Si tu ne les précise pas, la base de données attend à ce que tu fournisses une valeur pour chacune des colonnes de la table, dans l'ordre de création des colonnes.
    Dans ton cas, précise le nom de toutes les colonnes sauf celle qui est autoincrémentée.

    D'une manière générale, il est prudent de systématiquement préciser l'ordre de colonnes car si tu est amené à travailler avec plusieurs versions de la même base et que les colonnes n'ont pas été créées dans le même ordre, cela évitera que ta requête tente d'insérer des valeurs dans les mauvaises colonnes. Au mieux, tu aurais un message d'erreur... au pire tu n'y verra que du feu pour peu que les colonnes inversées soient du même type.

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 151
    Par défaut
    Je confirme que auto-increment fonctionne sur ACCESS. il suffit de ne pas mettre ton champs en auto increment dans ta requête.

    et +1000 avec Cereal123 !!! C'est pour cela que tu as une erreur je pense.

  12. #12
    Membre averti
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Par défaut
    Eh bien c'était effectivement à cause de ma requête Insert. Je ne savais pas qu'il y avait deux façons d'écrire cette reqête, et il fallait l'écrire comme Geo2A l'a écrit.

    Oufff, je commençais à perdre espoir .

    Je vous remercie tous infiniment

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

Discussions similaires

  1. [VBA-E]gérer une petite base de données
    Par massilia80 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/02/2006, 14h59
  2. [PDO] Utiliser l'Objet de PHP pour gérer sa base de données
    Par Viau dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/01/2006, 19h16
  3. [XML] [SNMP] Gérer du XML comme une base de données, faisable ?
    Par __fabrice dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 21/12/2005, 11h46
  4. gérer une base de donnée MySql via C++
    Par thiane dans le forum Bibliothèques
    Réponses: 9
    Dernier message: 19/05/2005, 17h19
  5. Comment gérer efficacement des listes en Base de données ?
    Par alexk dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 12/04/2005, 21h21

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