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 :

[C++B5]Problème avec une requëte SQL sur BDD ACCESS


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 25
    Points
    25
    Par défaut [C++B5]Problème avec une requëte SQL sur BDD ACCESS
    Bonjour,

    J'ai donc un problème avec une requête comme le titre l'indique, en fait lorsque je lance mon programme, j'entre des infos qui sont ensuites envoyés à la base de donnée via INSERT INTO, mais lors de l'envoie, C++ builder m'indique cette erreur :



    voici le code de ma methode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    void __fastcall TForm1::bInsererClick(TObject *Sender)
    {
       int sizeNom = lineNomJeux->SelLength;
       int sizeDesc = txtDescription->SelLength;
       int sizeNote = lineNote->SelLength;
     
       char *nom = new char[sizeNom];
       char *desc = new char[sizeDesc];
       char *note = new char[sizeNote];
       char req[100];
     
       lineNomJeux->GetSelTextBuf(nom, sizeNom); //On affecte à nom le contenu du champs Nom du jeux.
       txtDescription->GetSelTextBuf(desc, sizeDesc);
       lineNote->GetSelTextBuf(note, sizeNote);
     
       SessionJeux->Open();
       Database1->Open();
       requeteInsertion->SQL->Clear();
     
       sprintf(req, "INSERT INTO jeux(Nom,Description,Note) VALUES('%s','%s','%s')", nom, desc, note);
       requeteInsertion->SQL->Add(req);
       requeteInsertion->ExecSQL();
     
       Database1->Close();
       SessionJeux->Close();
    }
    J'ai écumé Google mais j'ai pas trouvé de réponse à mon problème.

    Merci d'avance.

  2. #2
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Salut, première remarque, sous Builder il y as des objet plus évolué qui permette de remplacé le char* et le sprintf (qui est du C à la base alors qu'ici nous somme normalement en C++), mais tu peut avoir tes raisons à utiliser cette méthode.
    Si non pour ton problème, ton message d'erreur indique une erreur du coté de la requête SQL, il as plusieurs possibilité :
    • Le nom de ta table n'est pas jeux dans ta base (il faut que la case soit identique)
    • la table jeux ne contient pas de colonne Nom, Description ou Note (il faut que la case soit identique)
    • Dans ta table, une de ces colonne n'est pas définit comme chaine de caractère et dans ce cas la il faut retiré les guillemet à la valeur correspondante.
    • L'un de tes char* nom, desc ou note contient une guillemet ce qui interfère avec celle de la requête et dans ce cas il faut doublé la guillemet contenus dans ta variable
    Je pense que c'est tout ce que je peut dire pour le moment

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 25
    Points
    25
    Par défaut
    En effet j'utilise des tableaux de char pour une certaines raison, j'utilise aussi des AnsiString fournis par C++ Builder, mais le problème ne provient pas de là, et mes chaines nom, desc, note... ne contiennent pas de guillemet, en tout cas même si il n'y en a pas ça donne toujours l'erreur.

    Je suis finalement parvenu à faire ce que je voulais, par un moyen détourné, j'ai utilisé le composant TTable et ses possibilités notamment dans ce cas là sa methode Insert().
    Mais, je ne veux pas m'en arrêter là et je veux comprendre pourquoi avais-je cette erreur. J'ai bien lu tes propositions, mais aucune n'étaient à mettre en cause (j'ai vérifié). De mon côté je suppose peut-être qu'il s'agit d'un problème de driver ou quelque chose dans le genre puisque lorsque j'affiche la requête créé, les champs dans VALUES() aparaissent vident, ce qui normalement ne devrait pas posé de problème puisque la requête est tout de même valide.
    Ensuite la question est, pourquoi apparaissent-ils vident?

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Si ton champs VALUES est vide, ce n'est pas un problème de requete, mais un problème de concatenation de chaine, le sprintf ne fonctionne pas correctement et tu as du coup une requete invalide, t'as méthode est la bonne (celle du premier message), il faut juste réussir as produir la requete correctement.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 25
    Points
    25
    Par défaut
    Ok je vais trouver une autre façon de faire dans ce cas là pour remplir la chaine req avec ma requête.

    Sinon tu as dit, "t'as méthode est la bonne (celle du premier message)", est-ce mauvais d'utiliser un TTable et Insert() ?
    Désolé de t'embêter avec ces questions, mais j'ai besoin de me former là-dessus au vu de mon stage de fin d'année.
    Merci de ton aide.

  6. #6
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Ce n'est pas mauvais, mais si tu n'en as pas l'utilité dans ton programme, il y as d'autre méthode beaucoup plus efficace pour lancer une requête à une base de données, notamment la première utilisé

    PS : tu n'embête personne, le forum est fait pour cela

  7. #7
    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
    Est-ce que tu as testé la requête "INSERT INTO" directement dans Access?

    1) Exporter le contenu exact de ta variable req (elle pourrait être tronquée car char[100] c'est petit!, mal formée, etc.)
    2) Ouvrir ta BDD dans Access
    3) Aller dans "Requêtes" et en faire une nouvelle. Passer en mode SQL et coller ta requête
    4) Tester la requête en l'exécutant

    Access donne souvent des messages bien plus précis quant à l'origine de l'erreur

    Sinon tu peux aussi essayer de transmettre le contenu de req comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requeteInsertion->SQL->Text=req;

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 82
    Points : 25
    Points
    25
    Par défaut
    J'ai résolu l'histoire de la requête en fait le nom de champs Note devait être un mot-clé ou je ne sais quoi, j'ai modifié le nom et j'ai plus de problème.

    Merci, à vous deux, de votre aide.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 03/06/2011, 00h53
  2. Problème avec une requête sql
    Par mika0102 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/10/2007, 15h50
  3. [SQL] Problème avec une requête sql
    Par bodysplash007 dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 11/05/2007, 17h30
  4. [MySQL] Problème avec une requête SQL
    Par chobol dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 11/05/2006, 12h29
  5. [VB]Problème avec une requête SQL
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 18/03/2006, 17h47

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