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

Bases de données Delphi Discussion :

ADO + Access 2000 + index avec doublon


Sujet :

Bases de données Delphi

  1. #1
    jnc
    jnc est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 21
    Points : 12
    Points
    12
    Par défaut ADO + Access 2000 + index avec doublon
    Bonjour,

    Je pose les composants suivant dans une feuille
    ADOConnection
    ADOTable
    TDataSet
    TDBGrid

    Je connecte l'ADOConnection à une base Access 2000.

    La base Acces contient 2 enregistrements identiques.
    Pas de clés primaire, le premier champs est indexé avec doublon.

    Si je supprime un enregistrement par le dbGrid ou par soft (delete):

    j'ai le message suivant :

    " Key column information is insufficient or incorrect. Too many rows were affected by update"

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Cas frequent lors d'enregsitrements identiques.

    Dans tous système de base de données, des que 2 enregistrements sont identiques, il est impossible de les effacer 1 par 1. pour éviter cela, il faut un moyen de différencier les deux lignes, le plus souvent il suffit de rajouter un champs autoincrémentés à la table (mais aprés faut penser à le gérer dans le reste du programme).
    Donc s'il y a des chances pour que ce problème se reproduise, il te faut absolument un champs autoincrémenté pour gérer cela.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    jnc
    jnc est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Si je fais une application en VB avec à peu prés la même architecture je n'ai pas de problème.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Lit ceci a mon avis les composants VB doivent utiliser une de ces techniques, ceux de delphi, non.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    comment fait ado pour faire un delete de tes champs ? Et bien tout dépend de la configuration de ta connection

    Par exemple, en (curseur client / keyset), il crée une requête SQL

    pour pouvoir effacer ton champ il va se demander comment différencier ta ligne des autres.

    apparement, il ne va pas chercher ce qui pourrait marcher (dans ton cas un index unique), il se contente de voir si la table a une clé primaire.

    si oui, il va pouvoir créer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE FROM TABLE WHERE PRIMARY_KEY_COLUMN = ROW.Fields("PRIMARY_KEY_COLUMN").Value
    sinon, il va t'indiquer qu'il ne peut pas trouver ta ligne avec une requête SQL

    Par contre, dans VB, tu dois être en mode (curseur server)

    ce qui fait que le curseur est maintenu par ta base de donnée. Et la base de donnée va elle utiliser en interne un "pointeur" vers ta bonne ligne. Et donc quand tu va vouloir déleter ton champ, le serveur saura comment faire.

    Teste ce qui se passe en mode curseur server sur Delphi.


    FRANK

  6. #6
    jnc
    jnc est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    J'ai le même résultat avec les deux types de curseurs (client et serveur)

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    j'ai répondu un peu vite. j'avais lu indexé sans doublon, je pensais que c'était juste de la configuration.

    en fait, je viens de le voir, il s'agit d'indexé avec doublon. Dans ce cas effacer une seule à partir d'une clé n'a pas vraiment de sens puisque tu ne peux pas l'identifier avec certitude.

    est-ce que tu peux rajouter un identifiant auto incrémenté sur lequel tu mettrais une clé primaire par exemple ?

    tu dis VB mais n'est-ce pas VBA avec les composants dans Access ?
    le composant VB utilise ADO ou DAO ?
    si tu mets deux lignes parfaitement identique, est-ce qu'un delete avec le composant VB efface une seule ligne ?

    si un ensemble de colonne identifie de manière unique une ligne, pose un index multi colonne et reessaie.
    mais le plus simple c'est l'entier auto incrémenté.

  8. #8
    jnc
    jnc est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Il s'agit de VB5 avec les composants DAO et ils arrivent à supprimer une ligne avec DELETE dans une bases comportant plusieurs lignes identiques sur tous les champs.

    A priori, avec ADO je vais devoir rajouter un champ auto incrémenté.

    Merci pour vos réponses.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/07/2011, 14h36
  2. [Access 2000] Image avec fond transparent
    Par DPhBxl dans le forum IHM
    Réponses: 3
    Dernier message: 30/07/2007, 22h44
  3. Passage d'Access 2000 à 2003 avec VBA
    Par robert_095 dans le forum Access
    Réponses: 2
    Dernier message: 08/08/2006, 16h21
  4. [Access 2000] Problème avec MouseWheel
    Par DeFCrew dans le forum Access
    Réponses: 11
    Dernier message: 03/08/2006, 12h23
  5. Clef primaire access, Indexé avec doublon
    Par Asurmena dans le forum Access
    Réponses: 1
    Dernier message: 05/06/2006, 11h04

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