Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 43
    Points
    43

    Par défaut C++Builder6/Firebird sql error=-303

    Bonjour,
    j'essaie d'executer un procedure stockée avec c++builder

    voici le code pour lancer cette procedure :


    Code c++ :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    bool __fastcall TDataModule1::_UPDATE_PERSONNE(TClientDataSet * pCds)
    {
            //TODO: mise a jour d'un enreg table personne
     
      TParams *Param=new TParams();
      bool succes=false;
     
      try{
          try{
     
              IBStoredProc1->StoredProcName="UPDATE_PERSONNE";
     
              // creation de parametres
              Param->CreateParam(ftInteger,"ID_PERS",ptInput);
              Param->CreateParam(ftString,"NOM",ptInput);
              Param->CreateParam(ftString,"PRENOM",ptInput);
              Param->CreateParam(ftString,"ADRESSE",ptInput);
              Param->CreateParam(ftString,"VILLE",ptInput);
              Param->CreateParam(ftInteger,"CODE_POSTAL",ptInput);
              Param->CreateParam(ftString,"ENTREPRISE",ptInput);
     
              // regardez si on lit
              //ShowMessage(pCdsDelta->FieldB&yName("NOM")->AsString);
     
     
              Param->ParamByName("ID_PERS")->AsInteger=pCds->FieldByName("ID_PERS")->AsInteger;
              Param->ParamByName("NOM")->AsString=pCds->FieldByName("NOM")->AsString;
              Param->ParamByName("PRENOM")->AsString=pCds->FieldByName("PRENOM")->AsString;
              Param->ParamByName("ADRESSE")->AsString=pCds->FieldByName("ADRESSE")->AsString;
              Param->ParamByName("VILLE")->AsString=pCds->FieldByName("VILLE")->AsString;
              //ShowMessage( pCds->FieldByName("CODE_POSTAL")->AsString.Length());
     
              Param->ParamByName("CODE_POSTAL")->AsInteger=pCds->FieldByName("CODE_POSTAL")->AsInteger;
              Param->ParamByName("ENTREPRISE")->AsString=pCds->FieldByName("ENTREPRISE")->AsString;
     
              DataModule1->IBStoredProc1->Params=Param;
              DataModule1->IBStoredProc1->Prepare();
              DataModule1->IBStoredProc1->ExecProc();
     
     
              delete Param;
              succes=true;
     
          }
     
          catch(...)
          {
          succes= false; // en cas d'erreur
          }
        }
     
      __finally{ // en cas de succès ou non
     
           DataModule1->IBStoredProc1->UnPrepare();
           delete Param;
           return succes;
      }
     
    }

    Voici la procedure stockée:

    Code sql :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    BEGIN
      /* MISE A JOUR D'UNE PERSONNE */
     
        UPDATE PERSONNE
     
        SET  PERSONNE.NOM=:NOM,
             PERSONNE.PRENOM=:PRENOM,
             PERSONNE.ADRESSE=:ADRESSE,
             PERSONNE.CODE_POSTAL=:CODE_POSTAL ,
             PERSONNE.VILLE=:VILLE, /* MODIF */
             PERSONNE.ENTREPRISE=:ENTREPRISE
     
        WHERE PERSONNE.ID_PERS=:ID_PERS  ;
     
    END

    le type des paramètres :
    Code firebird :
    1
    2
    3
    4
    5
    6
    7
    8
     
    ID_PERS :INTEGER
    NOM :VARCHAR(20)
    PRENOM :VARCHAR(20)
    ADRESSE :VARCHAR(50)
    CODE_POSTAL :INTEGER
    VILLE :VARCHAR(20)
    ENTREPRISE :VARCHAR(20)

    quant j'essaie d'executer ceci avec C++builder 6 j'ai ce message

    ---------------------------
    Notification d'une exception du débogueur
    ---------------------------
    Le projet AnnuaireOfficiel.exe a provoqué une classe d'exception EIBInterBaseError avec le message 'Dynamic SQL Error
    SQL error code = -303
    conversion error from string "Belcaire"'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    ---------------------------
    OK Aide
    ---------------------------

    Cette procédure s’exécute bien avec IbExpert mais avec BCB ?
    d’où cela vient je vois pas....qui peut m'expliquer et que faire?

    Je tourne en rond

    merci de vos réponses et bonnes fêtes
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  2. #2
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 43
    Points
    43

    Par défaut

    Bonsoir,

    J'ai enlver remis des paramètre afin de savoir,je confirme c'est le champ et paramètre "ville" qui me pose problème
    mais je ne vois pas comment y remédier.....


    j'ai regardé la taille des champs sous BCB et firebird taille 20
    Code :
    1
    2
    3
    4
     
    FIrebird (TABLE PERSONNE) champ VILLE VARCHAR (20)
    FIreBird(Paramètre entré) VILLE VARCHAR (20)
    C++BUILDER6=>Composant IBQUERY=>IBQPERSVille TSTRINGField Size(20)
    Si vous pouvez m'aider

    merci
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  3. #3
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Inscrit en
    avril 2002
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2002
    Messages : 1 307
    Points : 3 555
    Points
    3 555

    Par défaut

    Bonjour,
    Citation Envoyé par o_live Voir le message
    Cette procédure s’exécute bien avec IbExpert mais avec BCB ?
    d’où cela vient je vois pas....qui peut m'expliquer et que faire?
    Déjà, IbExpert (développé avec Lazarus à ce que je sache) n'utilise pas le composant TIBStoredProc qui est un composant dédié à Interbase (6), et dont la compatibilité avec les nouvelles versions de Firebird devient de plus en plus aléatoire...
    Comparer leur fonctionnement n'est pas pertinent.

    Cela étant, Quel est la version de Firebird ? 2.1 (d'après la signature) ?
    La bibliothèque client utilisée (fbclient.dll ou son renommage en gds32.dll) est elle la bonne ?
    Quel est le charset de la base ? du composant de connexion TIBDatabase ?
    Philippe.

  4. #4
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 43
    Points
    43

    Par défaut

    Bonjour,
    la version de Fb est exactement 2.1.2.18118 soit la 2.1.2

    les composant utilisés:
    IBDatabase, IbTransition,TIBQuery,TIBStoredProcedure,TDatasetProvider, TClientDataSet,DataSource le tout dans un module

    Je ne comprend pas sur la même table lorsque je fais un insert cela fonctionne très bien , et de plus je lis bien mes enregistrements
    même en mode conception

    Sur l'update (le code est visible ici) il suffit que j'ajoute la param ville pour que cela plante
    alors que sur l'insert cela fonctionne très bien

    est ce que il y a pas autre chose? composant? erreur de lecture disque ? charset ?

    Code c++ :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    bool __fastcall TDataModule1::_INSERT_PERSONNE(TClientDataSet *pCdsDelta)
    {
            /*TODO 3 -o_live: insertion de personne
            le commit() ou rollback() sont fait dans le methode
             TDataModule1::ApplyUpdatePers()     */
     
    TParams *Param=new TParams();
    bool succes=false;
     
      try{
     
        try
        {
            IBStoredProc1->StoredProcName="INSERT_PERSONNE ";
     
            Param->CreateParam(ftString,"NOM",ptInput);
            Param->CreateParam(ftString,"PRENOM",ptInput);
            Param->CreateParam(ftString,"ADRESSE",ptInput);
            Param->CreateParam(ftString,"VILLE",ptInput);
            Param->CreateParam(ftInteger,"CODE_POSTAL",ptInput);
            Param->CreateParam(ftString,"ENTREPRISE",ptInput);
     
            //// regardez si on lit
    //        ShowMessage("nom="+pCdsDelta->FieldByName("NOM")->AsString
    //        );
     
            Param->ParamByName("NOM")->AsString=pCdsDelta->FieldByName("NOM")->AsString;
            Param->ParamByName("PRENOM")->AsString=pCdsDelta->FieldByName("PRENOM")->AsString;
            Param->ParamByName("ADRESSE")->AsString=pCdsDelta->FieldByName("ADRESSE")->AsString;
            Param->ParamByName("VILLE")->AsString=pCdsDelta->FieldByName("VILLE")->AsString;
            Param->ParamByName("CODE_POSTAL")->AsInteger=pCdsDelta->FieldByName("CODE_POSTAL")->AsInteger;
            Param->ParamByName("ENTREPRISE")->AsString=pCdsDelta->FieldByName("ENTREPRISE")->AsString;
     
            DataModule1->IBStoredProc1->Params=Param;
            DataModule1->IBStoredProc1->Prepare();
            DataModule1->IBStoredProc1->ExecProc();
     
     
            succes=true;
     
        }
        catch(...)
        {
     
        succes= false; // en cas d'erreur
        }
     
      }
      __finally{
     
      DataModule1->IBStoredProc1->UnPrepare();
      delete Param;
      return succes;
     
      }
    }

    La procedure stockéé
    Code sql :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    begin
      /* Ajout de personne */
      INSERT INTO PERSONNE (NOM,PRENOM,ADRESSE,
                            VILLE,CODE_POSTAL,
                            ENTREPRISE)
     
      VALUES (:NOM ,:PRENOM,:ADRESSE,
              :VILLE,:CODE_POSTAL,
              :ENTREPRISE) ;
      suspend;
    end

    La bibliothèque client utilisée (fbclient.dll ou son renommage en gds32.dll) est elle la bonne ?
    Ou voir ceci ?
    j'ai les deux Dll sur le pc

    Quant au charset , je laisse firebird le choisir par défaut jeu de caractère aucun

    sur le composant IBDatabase SQLDIalect=3 jeu de caractère aucun

    Que prendre ?

    Encore merci de m'aider et bonnes fêtes a vous !
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  5. #5
    Expert Confirmé
    Avatar de Ph. B.
    Homme Profil pro Philippe
    Inscrit en
    avril 2002
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2002
    Messages : 1 307
    Points : 3 555
    Points
    3 555

    Par défaut

    Citation Envoyé par o_live Voir le message
    IBDatabase, IbTransition,TIBQuery,TIBStoredProcedure,TDatasetProvider, TClientDataSet,DataSource le tout dans un module
    Personnellement, je n'utiliserais pas les TIB* pour interagir avec Firebird.
    Même si cela peut fonctionner dans la plupart des cas, on peut très bien tomber sur un cas difficile à résoudre...
    Citation Envoyé par o_live Voir le message
    Le lien n'est plus valide...
    Citation Envoyé par o_live Voir le message
    La procedure stockéé
    Code sql :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    begin
      /* Ajout de personne */
      INSERT INTO PERSONNE (NOM,PRENOM,ADRESSE,
                            VILLE,CODE_POSTAL,
                            ENTREPRISE)
    
      values (:NOM ,:PRENOM,:ADRESSE,
              :VILLE,:CODE_POSTAL,
              :ENTREPRISE) ;
      suspend;
    end
    Pourquoi mettre un suspend sur une procédure non sélectionnable ?

    Citation Envoyé par o_live Voir le message
    Ou voir ceci ?
    j'ai les deux Dll sur le pc
    A votre place, je regarderais ce point en premier et m'assurerais que c'est bien la dll client de Firebird qui est appelée et pas celle d'Interbase...
    Les composants TIB* appellent par défaut la dll gds32.dll. Substituez la dll client fbclient.dll à l'actuelle gds32.dll et refaites le test. Assurez vous aussi qu'il n'y ait pas une autre gds32.dll dans le path windows.

    Citation Envoyé par o_live Voir le message
    Quant au charset , je laisse firebird le choisir par défaut jeu de caractère aucun

    sur le composant IBDatabase SQLDIalect=3 jeu de caractère aucun

    Que prendre ?
    Tout étant à none, aucune conversion n'est faite sur ce que le client envoie. donc à priori, pas de souci de ce côté la.
    Bien que personnellement, j'utiliserais UTF8 pour la base et ANSI pour BCB6.
    Philippe.

  6. #6
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 43
    Points
    43

    Par défaut

    Envoyé par o_live Voir le message
    IBDatabase, IbTransition,TIBQuery,TIBStoredProcedure,TDatasetProvider, TClientDataSet,DataSource le tout dans un module
    Personnellement, je n'utiliserais pas les TIB* pour interagir avec Firebird.
    Même si cela peut fonctionner dans la plupart des cas, on peut très bien tomber sur un cas difficile à résoudre..
    Bonsoir,
    quel composant utiliseriez vous?

    voici le code C++buider

    Code c++ :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    bool __fastcall TDataModule1::_UPDATE_PERSONNE(TClientDataSet * pCds)
    {
            /*TODO: mise a jour d'un enreg table personne
            le commit() ou rollback() sont fait dans le methode
             TDataModule1::ApplyUpdatePers() */
     
      TParams *Param=new TParams();
      bool succes=false;
     
      try{
          try{
     
              IBStoredProc1->StoredProcName="UPDATE_PERSONNE";
     
              // creation de parametres
              Param->CreateParam(ftInteger,"ID_PERS",ptInput);
              Param->CreateParam(ftString,"NOM",ptInput);
              Param->CreateParam(ftString,"PRENOM",ptInput);
              Param->CreateParam(ftString,"ADRESSE",ptInput);
              Param->CreateParam(ftString,"VILLE",ptInput);
              Param->CreateParam(ftInteger,"CP",ptInput);
              Param->CreateParam(ftString,"ENTREPRISE",ptInput);
     
              // regardez si on lit
              //ShowMessage(pCdsDelta->FieldB&yName("NOM")->AsString);
     
     
              Param->ParamByName("ID_PERS")->AsInteger=pCds->FieldByName("ID_PERS")->AsInteger;
              Param->ParamByName("NOM")->AsString=pCds->FieldByName("NOM")->AsString;
              Param->ParamByName("PRENOM")->AsString=pCds->FieldByName("PRENOM")->AsString;
              Param->ParamByName("ADRESSE")->AsString=pCds->FieldByName("ADRESSE")->AsString;
              Param->ParamByName("VILLE")->AsString=pCds->FieldByName("VILLE")->AsString;
              //ShowMessage( pCds->FieldByName("CODE_POSTAL")->AsString.Length());
     
              Param->ParamByName("CP")->AsInteger=pCds->FieldByName("CODE_POSTAL")->AsInteger;
              Param->ParamByName("ENTREPRISE")->AsString=pCds->FieldByName("ENTREPRISE")->AsString;
     
              DataModule1->IBStoredProc1->Params=Param;
              DataModule1->IBStoredProc1->Prepare();
              DataModule1->IBStoredProc1->ExecProc();
     
     
              succes=true;
     
          }
     
          catch(...)
          {
     
          succes= false; // en cas d'erreur
          }
        }
     
      __finally{ // en cas de succes ou non
     
           DataModule1->IBStoredProc1->UnPrepare();
           delete Param;
           return succes;
      }
     
    }

    l'ordre des parametre a t il une importance sous l’outil IBExpertFree?
    Code SQL :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    SET TERM ^ ;
     
    CREATE OR ALTER PROCEDURE UPDATE_PERSONNE (
        id_pers integer,
        nom varchar(20),
        prenom varchar(20),
        adresse varchar(50),
        cp integer,
        ville varchar(20),
        entreprise varchar(20))
    AS
    BEGIN
      /* MISE A JOUR D'UNE PERSONNE */
     
     /*
        ID_PERS
    NOM
    PRENOM
    ADRESSE
    CODE_POSTAL
    VILLE
    ENTREPRISE   */
     
     
     
        UPDATE PERSONNE
     
     
     
        SET  PERSONNE.NOM=:NOM,
             PERSONNE.PRENOM=:PRENOM,
             PERSONNE.ADRESSE=:ADRESSE,
             PERSONNE.CODE_POSTAL=:CP ,
             PERSONNE.VILLE=:VILLE, /* plante ici */
             PERSONNE.ENTREPRISE=:ENTREPRISE
     
        WHERE PERSONNE.ID_PERS=:ID_PERS  ;
     
     
     
    END
    ^
     
    SET TERM ; ^
     
    COMMENT ON PARAMETER UPDATE_PERSONNE.CP IS
    'code postal';

    Je vais regarder les histoire de dll et voir
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  7. #7
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 43
    Points
    43

    Par défaut A n'y rien comprendre...

    Bonsoir cela fonctionne ouf !

    Voila la manip faite :

    1)sous Ibexpert Free j'ai viré tous les paramètres d'entrées( il y en avait 7) sauf cela l'ID_PERS et la VILLE(celui qui posait problème)

    J'ai recomplilé le tout et a lancé un requête SQL "manuelle depuis" IbexpertFree,elle est passée

    2)J'ai modifié mon code BCB6 pour avoir aussi l'ID_PERS et VILLE
    j'ai compilé, lancé et bizarrement c'est passé

    3) j'ai tout modifié cote serveur et code BCB6 pour avoir les sept paramètres
    j'ai compilé, lancé et bizarrement c'est passé

    bref les mystères de l'informatique, en tout cas j'aimerais bien savoir ce qui s'est passé , si quelqu'un peut m'expliquer ????

    Pouvait vous répondre aux questions du post précédent ?
    merci

    merci a vous et BONNE ANNÉE 2013
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •