[HELP]Problème avec insertion ADOQuery

Signaler
Messages postés
27
Date d'inscription
dimanche 15 juin 2003
Statut
Membre
Dernière intervention
29 janvier 2010
-
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
-
Bonjour, j'ai un gros problème d'insertion avec ADOQuery.

J'insère ans une base de donnée MySQL. je vous montre le code qui bug :

with ADOQuery2 do
      begin
        ParamNom := parameters.AddParameter;
        ParamPrenom := parameters.AddParameter;
        ParamAdr := parameters.AddParameter;
        ParamVille := parameters.AddParameter;

        With ParamNom do
        begin
          DataType:=ftString;
          Name:='nom';
          Direction:=pdInput;
        end;

        With ParamPrenom do
        begin
          DataType:=ftString;
          Name:='prenom';
          Direction:=pdInput;
        end;

        With ParamAdr do
        begin
          DataType:=ftString;
          Name:='adresse';
          Direction:=pdInput;
        end;

        With ParamVille do
        begin
          DataType:=ftInteger;
          Name:='ville';
          Direction:=pdInput;
        end;
        Prepared := True;
        Parameters.ParamByName('nom').Value:=edNom.Text;
        Parameters.ParamByName('prenom').Value:=edPrenom.Text;
        Parameters.ParamByName('adresse').Value:=edAdr.Text;
        Parameters.ParamByName('ville').Value:=ID;

        SQL.Add('INSERT INTO responsables(nomResp, prenomResp, adrResp, idVille) VALUES(:nom, :prenom, :adresse, :ville');
        Connection := ADOConnection;
        ExecSQL;
      end;


L'erreur est :

Une ou plusieurs erreurs se sont produites lors du traitement de la commande. D'apres l'execution pas à pas, l'erreur survient sur le ExecSQL.

J'en peut plus, c'est pour le BTS, je comprend pas :'(
A voir également:

8 réponses

Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Salut,

première chose: tu n'as pas fermé la parenthèse après la liste de 'values'!!
Messages postés
27
Date d'inscription
dimanche 15 juin 2003
Statut
Membre
Dernière intervention
29 janvier 2010

Oui, pardon c'est modifié dans mon projet delphi :)
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Re,

Dans l'extrait de code que tu nous montre, tu ne vides pas la propriété SQL du Query. (ADOQuery.SQL.Clear;); ADOQuery.SQL est un TStrings, si tu ne le vides pas avant de mettre une nouvelle requête, tu risques d'en empiler et de ne pas obtenir le résultat attendu

Personnellement, moi je le ferais comme ça:

const  //constantes: déclaration des requêtes
  SQLInsertResponsable = 'insert into responsables(nomResp, prenomResp, adrResp, idVille) VALUES(%s, %s, %s, %d)';
  ...
  with ADOQuery2 do
    begin
      SQL.Clear;
      SQL.Add(Format(SQLInsertResponsable, [QuotedStr(edNom.Text), QuotedStr(edPrenom.Text),
                                            QuotedStr(edAdr.Text), ID]));
      ExecSQL;
    end;



En ce qui me concerne, je n'ai jamais utilisé les TParameters... Je ne dis pas que c'est mieux, en tout cas j'ai jamais de pb avec mes requêtes.
Messages postés
27
Date d'inscription
dimanche 15 juin 2003
Statut
Membre
Dernière intervention
29 janvier 2010

Toujours la même erreur avec ta méthode :(
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Tu n'as rien de plus précis comme message d'erreur?
As-tu surveillé ta requête en debug et est-elle bien mise en forme?
Si oui, prends la requête telle qu'elle est construite par ton programme et exécute-la directement dans MySQL:
si ça passe pas, c'est ta requête qui chie; sinon tu as un pb entre les 2:
-vérifie la chaîne de composants et leurs propriétés (connectés etc...),
-vérifie la gestion des transactions (autocommit ou pas, BeginTrans/CommitTrans...),
-vérifie la syntaxe (double-quote au lieu de simple-quote par exemple) et l'encodage de la base. Si par exemple ta base est en Utf8 et que tu as des caractères accentués dans tes paramètres, tu dois les convertir en utilisant la fct AnsiToUtf8 avant de les envoyer dans ta requête.
Messages postés
27
Date d'inscription
dimanche 15 juin 2003
Statut
Membre
Dernière intervention
29 janvier 2010

En fait, te requete est bonne (syntaxe). Les showmessage que j'ai fait montre que le code est bon. Pourtant, l'ajout ne se fait pas à mysql, et l'erreur (pas détaillée) persiste.

Je pense que cela vient de ma connexion à la base. Je fais un copier coller de mon composant ADOConnection ;
object ADOConnexionDate: TADOConnection
  ConnectionString = 
    'Provider=MySqlProv.3.9;Data Source=centre;Integrated Security=""' +
    ';Password="";User ID=root;Location=localhost;Extended Properties' +
    '=""'
  Mode = cmReadWrite
  Provider = 'MySqlProv.3.9'
  Left = 432
end
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Malheureusement, je n'ai pas MySQL sous la main, ça fait un petit moment que j'ai pas bossé dessus...

Tu peux peut-être essayer de mettre une requête de sélection à la place de ta requête d'insertion; si elle passe, c'est certainement un pb de droits ou de gestion de transactions..
Messages postés
139
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
10 mai 2010
2
Apparemment, d'après ce que j'ai vu en fouillant un pti peu, le délimiteur pour les chaînes dans MySQL est la double-quote " et non la simple '.

Donc ta requête doit plutôt ressembler à ça (je repars de ma méthode mais c'est pareil):
const  //constantes: déclaration des requêtes
  SQLInsertResponsable = 'insert into responsables(nomResp, prenomResp, adrResp, idVille) VALUES("%s", "%s", "%s", %d)';
  ...
  with ADOQuery2 do
    begin
      SQL.Clear;
      SQL.Add(Format(SQLInsertResponsable, [edNom.Text, edPrenom.Text, edAdr.Text, ID]));
      ExecSQL;
    end;