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

C++Builder Discussion :

Insertion,update dans une BD à table avec beaucoup de champs


Sujet :

C++Builder

  1. #1
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut Insertion,update dans une BD à table avec beaucoup de champs
    Cette fois-ci, je travaille avec une base de données avec une table

    de 100 champs (énormes non!) et j'utilise ADO pour se connecter à

    cette BD. J'ai voulu effectuer des insertions dans la table: INSERT

    INTO. Mais là, j'ai rencontré beaucoup de

    problèmes:EOleException.
    Des erreurs du genre:Point-virgule absent à la fin de

    l'instruction SQL
    ou Erreur de syntaxe dans INSERT INTO.

    Mais j'ai revérifié mes instructions sql et c'est correct!!

    De plus lorsque j'insère une chaîne par ex: "C:\Documents and

    Settings\All Users.WINDOWS\Documents\Mes images\Échantillons

    d'images\Nénuphars.jpg" l'exception devient: Objet parameter

    défini de manière incorrecte
    .

    Qu'est-ce que cet objet Parameter? je vois pas
    Je pense qu'on ne peut pas utiliser une table avec plusieurs champs

    ou est-ce une faille de ADO, dois-je retourner à BDE?
    Est-ce que vous avez déja rencontré un tel problème.Si oui, quelle solution avez-vous trouvé?
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  2. #2
    bruce-willis
    Invité(e)
    Par défaut
    Moi, je ne sais pas quoi de répondre.
    Moi j'ai déja essayé avec 50 champs, ce fut la galère alors j'ai abandonné.

    Je voudrais savoir ce que les autres en pense!

  3. #3
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    Slt bruce-willis,

    Faut jamais jeter l'éponge mon cher ami. Je ne sais pas si c'est un défaut du composant ADO ou celui de Ms Access: je crois que Access doit supporter cela car il est connu pour être puissant.

    EST-CE QUE QUELQU'UN A UNE SUGGESTION A ME DONNER? PLEASE
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  4. #4
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Peut être déja poster toutes les instructions et requete relatives a la mise a jour de ta table.
    En expliquant les types d'objets utilisés, etc ...
    Je pense qu'on ne peut pas utiliser une table avec plusieurs champs
    Ca m'étonnerais tout de même ...
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  5. #5
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    En fait, j'utilise ADO pour manipuler une BD Ms Access constitué par plusieurs tables avec beaucoup de champs, l'une d'elles possèdent même 110 champs. Vous vous demandez à quoi servent tous ces champs, et oui ils ont une importance capitale.

    Je me demande pourquoi cela génère un EOleException alors que je crois que je n'ai ommis aucunes erreurs dans le code. Par ex,ici une insertion (j'insère des valeurs n'importe quoi mais correctes et j'utilise des ......... pour raccourcir):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("insert into venteterrain(reference,adressebien,...........,section,superficie) values('klmkjml','kmjklm',..................'ipiop',70)");
    ADOQuery1->SQL->Add("insert into venteterrain(prixm2,superficie_mor,prixm2_mor,.............,repere,conseil_jur,conseil_tec) values(70,70,70,...............,'','')");//les champs conseil_jur,conseil_tec sont des Mémo
    ADOQuery1->SQL->Add("insert into venteterrain(prestation,plat_p,..................,voisinage_nb,limitation_nb,autres_nb) values('','',..............,50,50,50)");//le premier champ est un Mémo
    ADOQuery1->SQL->Add("insert into venteterrain(remblaye_nb,acces_nb,arbore_nb,eau_elec_nb,cloture_nb,pente_nb) values(50,50,50,50,50,50)");
    ADOQuery1->ExecSQL();
    Ce code provoque l'erreur:Erreur de syntaxe dans INSERT INTO.
    Certaines chaines vides doivent contenir en fait un chemin (C:\...) et lorsqu'on les remplit avec un chemin, l'erreur:Objet parameter défini de manière incorrecte..Donc ça empire alors que ça marche pour des BD à 5 champs par ex.

    Même cas pour pour l'UPDATE: erreurErreur de syntaxe (Opérateur absent) .... J'ai fait des SQL->SaveToFile() de la liste des requêtes et c'est correct à 100% mais erreur lors du
    ADOQuery1->ExecSQL();
    Même erreur dans l'update lorsqu'on insère un chemin.
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  6. #6
    bruce-willis
    Invité(e)
    Par défaut
    Slt rakoto15,

    t'as bien fait d'effectuer l'insertion en plusieurs lignes car avec un nbr de champs tel que le tien, une ligne ne suffirait pas.

    Sunchaser! Comment as-tu fait si tu dis que c'est possible une table avec plusieurs champs (plus de 100).

  7. #7
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    Pour l'exception Objet parameter défini de manière
    incorrecte
    , l'erreur était en fait l'existence d'apostrophe
    dans les chaînes des chemins ou dans les mémos.

    Mais est-ce qu'on ne peut pas utiliser des apostrophes dans les
    chaînes en SQL?

    Je me demande aussi pourquoi la boîte de dialogue de saisie de mot
    de passe n'apparâit pas alors que Connected=true et
    LoginPrompt=true aussi. Alors que cela apparaît dans mes autres
    projets avec des petites BD.
    Est-ce que cela a qlq choses y avoir avec ces problèmes???
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  8. #8
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par bruce-willis
    Sunchaser! Comment as-tu fait si tu dis que c'est possible une table avec plusieurs champs (plus de 100).

    Meuuuuaaah ....!? J'ai pas dis tout a fait cela moi.
    Et pis d'abord, moi j'essaie de fuir dès que je vois 'MS Access'. Mais bon, ce genre de considération ne fais pas avancer le schmilblick.
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Je n'ai jamais rencontré ce type de PB hormis sur les points suivants:

    Ne jamais mettre de moins (-) dans les noms de champs, jamais de caractère accentué dans ce type de requête.
    Toujours préférer lécriture "..."+QuotedStr("TOTO")+"..." à "...'TOTO'...".

    Pour des requêtes à problème, je les réalise sous accès afin de trouver l'erreur qui est explicite (contrairement à ADO), ensuite je fais un copier coller avec de petites modifications et en enlevant le ";" de la fin.

    Et là pas de PB

  10. #10
    bruce-willis
    Invité(e)
    Par défaut
    Pardonnez Sunchaser, je ne voulais pas te blesser!!!

  11. #11
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    Pour la boite de dialogue qui n'apparaisse pas, c'est résolu. C'est en fait une betise de ma part.

    FBartolo! Je n'utilise pas de - ni d'accents dans les noms de champs.
    Je vais essayer ton truc de QuotedStr() mais je vais te demander quelle est la différence ????

    Pour Pour des requêtes à problème, je les réalise sous accès afin de trouver l'erreur qui est explicite

    Je ne comprends pas!! Peux-tu m'expliquer?
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  12. #12
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par bruce-willis
    Pardonnez Sunchaser, je ne voulais pas te blesser!!!
    A non, non ... pas du tout ...
    Juste que si j'avais eu la solution de suite, je l'aurais postée ...
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  13. #13
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut rakoto15:
    Est ce normal que ton code commence par "ADOQuery1->Close();" ?
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  14. #14
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Citation Envoyé par rakoto15
    Pour la boite de dialogue qui n'apparaisse pas, c'est résolu. C'est en fait une betise de ma part.

    FBartolo! Je n'utilise pas de - ni d'accents dans les noms de champs.
    Je vais essayer ton truc de QuotedStr() mais je vais te demander quelle est la différence ????

    Pour Pour des requêtes à problème, je les réalise sous accès afin de trouver l'erreur qui est explicite

    Je ne comprends pas!! Peux-tu m'expliquer?
    Utilisez QuotedStr pour convertir la chaîne AnsiString S en une chaîne guillemetée. Un caractère simple (') est inséré au début et à la fin de S et les guillemets simples dans la chaîne sont répétés.
    Pour réaliser des requêtes complexes ou problématiques, j'ai pris l'habitude de les réaliser d'abord sous MS Access soit avec le générateur de Query soit directement en SQL.

    l'avantage (soit directement sur une base Access soit via ODBC), c'est que Access te positionne directement sur l'erreur en SQL.
    Ensuite tu n'as plus qu'a copier le code SQL dans ton Query.

    voila c'est tout ce que je voulais dire.

  15. #15
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    Citation Envoyé par blondelle
    Salut rakoto15:
    Est ce normal que ton code commence par "ADOQuery1->Close();" ?
    Pour exécuter des requêtes Insert, Update, Delete, Create database on utilise ExecSql(). Close() est inutile si on n'exécute qu'une fois la requête sinon il faut closer ADOQuery avant d'exécuter qlqchose. Je ne comprends pas très bien aussi mais c'est la méthode utilisée par de nbreux programmeurs renommés.

    J'ai testé QuotedStr() et il n'y a pas de différence, le code me semble toujours correct.
    J'ai essayé une insertion de deux champs seulement, ça marche.
    J'ai essayé avec deux instructions SQL successives, le problème réapparaît.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("insert into location(reference,adressebien,entree_p,chauffeau) values('888888','Ambatomaro','C:\\Program Files\\blabla.bmp',True)");
    ADOQuery1->SQL->Add("update location set adressebien='Itaosy',superficie=444444444,salon_p='C:\\Documents and Settings\\rija.jpg',gardiens=True where reference='12'");
    ADOQuery1->ExecSQL();
    Et je crois que c'est le problème de mon code, les insertions successives.

    je suis revenu au code que j'ai posté avant,j 'ai mis en commentaire les 5 insertions et il ne reste que la 1ère insertion de 20 champs.
    L'exception apparaît mais le débugger conseille de raccourcir l'insertion.

    Bref, je crois que c'est la longueur de la requête qui est le prob. Je vais alors essayé de raccourcir ce code, ça va me prendre encore une nuit d'insomnie.
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  16. #16
    Membre averti Avatar de BOUBOU81
    Profil pro
    system integrator
    Inscrit en
    Juin 2004
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : Allemagne

    Informations professionnelles :
    Activité : system integrator

    Informations forums :
    Inscription : Juin 2004
    Messages : 358
    Points : 315
    Points
    315
    Par défaut
    Deja chaque insertion à la fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("insert into location(reference,adressebien,entree_p,chauffeau) values('888888','Ambatomaro','C:\\Program Files\\blabla.bmp',True)");
    ADOQuery1->ExecSQL();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("update location set adressebien='Itaosy',superficie=444444444,salon_p='C:\\Documents and Settings\\rija.jpg',gardiens=True where reference='12'");
    ADOQuery1->ExecSQL();
    Cela permet de mieux repérer les erreurs et deuxiement je suis pas sur que cela fonctionne.
    Boubou from The SpAcE GaLaXy....
    AhAhAhAhAh

  17. #17
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    BOUBOU1, ça marche car je l'ai déja essayé après avoir posté mon dernier message.
    Et oui, c'est ça la solution, lancer un à un chaque requête.

    Un autre prob existe aussi lorsque j'utilise des chemins (chaînes longues), le champ est trop petit pour accepter la quantité de données ...

    Combien de caractères supporte une ligne de requête en SQL ou en Ms Access????
    __________________________________________________________________
    Autre chose:
    j'aimerais demander au responsable du site pourquoi lorsque je participe à plusieurs discussions en même temps, mes nbr de messages ne sont incréméntés que sur l'une d'elles. Normalement, mes messages seraient plus de 50.
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  18. #18
    Membre averti Avatar de BOUBOU81
    Profil pro
    system integrator
    Inscrit en
    Juin 2004
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : Allemagne

    Informations professionnelles :
    Activité : system integrator

    Informations forums :
    Inscription : Juin 2004
    Messages : 358
    Points : 315
    Points
    315
    Par défaut
    pour ce qui est de la requete tu est tranquile car c'est un AnsiString soit ~2^31 caractères, pour accès cela depand de la longueur de ton champ chaine de caractère ou tu veux mettre le chemin
    Boubou from The SpAcE GaLaXy....
    AhAhAhAhAh

  19. #19
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Citation Envoyé par rakoto15
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ADOQuery1->Close();
    ADOQuery1->SQL->Clear();
    ADOQuery1->SQL->Add("insert into venteterrain(reference,adressebien,...........,section,superficie) values('klmkjml','kmjklm',..................'ipiop',70)");
    ADOQuery1->SQL->Add("insert into venteterrain(prixm2,superficie_mor,prixm2_mor,.............,repere,conseil_jur,conseil_tec) values(70,70,70,...............,'','')");//les champs conseil_jur,conseil_tec sont des Mémo
    ADOQuery1->SQL->Add("insert into venteterrain(prestation,plat_p,..................,voisinage_nb,limitation_nb,autres_nb) values('','',..............,50,50,50)");//le premier champ est un Mémo
    ADOQuery1->SQL->Add("insert into venteterrain(remblaye_nb,acces_nb,arbore_nb,eau_elec_nb,cloture_nb,pente_nb) values(50,50,50,50,50,50)");
    ADOQuery1->ExecSQL();
    Je vois dans tes requêtes SQL que tu ne mets pas le ";" final. Ca ne pose pas de problème lorsque tu n'as qu'une commande dans la requête, mais c'est sûr que c'est un soucis lorsque tu en mets plusieurs. Un peu comme si tu oubliais les ";" dans ton code C++.

    Alors je n'ai jamais essayé, mais peut-être que tu peux passer toutes tes commandes en une seule fois en mettant le ";" de séparation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ADOQuery1->SQL->Add("insert into toto(...) values(...);");
    ADOQuery1->SQL->Add("insert into toto(...) values(...);");
    ADOQuery1->ExecSQL();

  20. #20
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 218
    Points : 1 437
    Points
    1 437
    Par défaut
    C'est vrai que les AnsiString supportent une chaîne très longue mais c'est Delphi qui ne supporte pas dans l'EDI et peut être ADO qui ne supporte une insertion de plusieurs champs en même temps!

    Il y a une erreur que j'ai commis: j'ai effectué l'insertion en plusieurs requêtes donc ça crée des enregistrements différents dans la BD alors que je veux avoir un seul enregistrement avec 100 champs.
    Que peux-je faire alors que Delphi dit "chaîne trop longue" quand j'écris tout en une seule ligne???
    PLEASE
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

Discussions similaires

  1. Réponses: 6
    Dernier message: 19/03/2009, 11h22
  2. Réponses: 2
    Dernier message: 10/03/2009, 13h45
  3. Réponses: 17
    Dernier message: 21/04/2008, 02h21
  4. insertion dans une table puis update dans une autre table
    Par uptoditime dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/10/2007, 19h08
  5. Réponses: 4
    Dernier message: 01/06/2007, 14h54

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