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 :

EIBInterbaseError : invalid transaction handle (expecting explicit transaction start)


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2010
    Messages : 104
    Par défaut EIBInterbaseError : invalid transaction handle (expecting explicit transaction start)
    Bonjour à tous,
    Toujours dans le cadre de la migration d'un programme fait avec Delphi XE2 et interbase de l'époque vers Delphi 10.4 community et interbase 2020.

    J'ai l'erreur suivante :
    EIBInterbaseError : invalid transaction handle (expecting explicit transaction start)
    lorsque le code suivant s'exécute :
    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
     IBQuery5.Close;
     for i:=1 to 16 do begin
      Tires.Clear; Paquet.Clear;
     
      With Form3 do begin
       IBQuery5.Sql.clear;
       IBQuery5.Params.Clear;
       IBquery5.Params.CreateParam(ftinteger,'categorie', ptUnknown);
       IBQuery5.ParamByName('categorie').AsInteger := i;
       Requete:='select count(*) FROM DONNE where CAT =:categorie';
       IBQuery5.Sql.Add(Requete);
       IBQuery5.Open;                <== Ligne qui provoque l'erreur. 
       Nbre:=Form3.IBQuery5.Fields[0].AsInteger;  
       ........
       ........
    Merci de vos suggestions
    JL

  2. #2
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Bonjour

    Un composant "transaction" est-il disponible sur la connexion Interbase ou attaché au(x) query(s) ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2010
    Messages : 104
    Par défaut
    Voici les composants qu'il y a :
    IBTransaction5, IBDatabase5, IBTable5, datasource5, IBQuery5, IBUpdatesSQL5

    et voici le code pour configurer tout ça :

    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
    27
    28
    29
    procedure TForm3.Config_Connection(Nom_Base: TFilename);  
    begin
     IBDataBase5.Params.Clear;    
     with IBDatabase5 do begin
      DatabaseName:=Nom_Base;
      Params.Add('user_name=ABCDE'); 
      Params.Add('password=abcde'); 
      Params.Add('PAGE_SIZE=4096');
      LoginPrompt:=False;             
      DefaultTransaction:=IBTransaction5;
     end;
     
     IBTransaction5.defaultDatabase:=IBDatabase5;
     IBDatabase5.connected:=True;         
     IBTransaction5.active:=True;
     
     with IBTable5 do begin
      database:=IBDatabase5;
      TableName:='DONNE';
     end;
     DataSource5.DataSet:=IBQuery5;
     IBTable5.Active:=True;   
     Form100.DBGrid5.DataSource:=DataSource5;
     IBQuery5.Database:=IBDataBase5;
     
     IBUpdateSQL5.modifySQL.Clear;
     IBUpdateSQL5.modifySQL.Add('UPDATE * FROM DONNE');
     IBTable5.UpdateObject:=IBUpdateSQL5;
     IBQuery5.UpdateObject:=IBUpdateSQL5;

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 575
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    ouch :calim: que de nombreuses réactions ai-je eu à la lecture de ces deux codes !

    le code du premier post
    si je comprend bien il s'agit d'obtenir le nombre d'éléments d'un catégorie à afficher dans une forme différente ?
    ce n'est pas clair et de toute façon ce with gâche tout et l'utilisation de nom de composants "autogénérés" n'arrange pas le schmilblic
    de plus faire une boucle pour obtenir les nombres pour les 16 catégories me semble bien consommateur,

    seconde question alors est-ce que la table DONNE contient toujours les 16 catégories et uniquement celles-ci ?
    1. si c'est le cas un select cat,count(1) as nombre FROM DONNE group by cat sera nettement moins consommateur de ressources.
    2. s'il n'y a qu'au maximum 16 catégories mais pas forcément les 16, hélas INTERBASE ne proposant pas les CTE récursives one ne peut écrire un SQL "hyper compact", mais l'appel à une procédure interbase pourrait faire l'affaire (au besoin me demander comment l'écrire


    Cette première mise au point faite, en reprenant le code (avec une requête créée au runtime)

    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
    with TIBSQL.Create do 
     begin  
        database:=IBDataBase1;
        transaction:=IBTransaction1; // pas obligatoire si vous avez indiqué une Defaulttransaction au niveau IBDatabase 
        SQL.Text:='select count(*) as nombre FROM DONNE where CAT =:categorie';
        Prepare;
     end;
    IBTransaction1.StartTransaction;  // si vous tenez à gérer les transactions (IBTransaction1.allowautostart:=false)
    for i:=1 to 16 do
      begin
         ParamByName('categorie').asInteger:=i;
         Open;
         // traitement valeur fieldByname('nombre').asInteger
         Close;
      end; 
    IBTransaction1.Commit; // ou RollBack puisque pas de modifications
    En bref pour le premier post vous confondez Active:=true et StartTransaction

    Le second code
    d'entrée de jeu ce IBUpdateSQL5.modifySQL.Add('UPDATE * FROM DONNE'); me choque : Syntaxe SQL incorrecte et ce quelque soit le SGBD.
    Le "bon" SQL serait quelque-chose comme
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE DONNE
    SET ID = :NEW_ID, CODE = :NEW_CODE, LIBELLE = :NEW_LIBELLE
    WHERE ID= :OLD_ID
    ou, à tout le moins quelque chose d'approchant (n'ayant pas la structure de DONNE, j'en utilise une "bidon" ID Integer NOT NULL PRIMARY KEY,CODE char(2) NOT NULL,LIBELLE VARCHAR(60))

    La suite du code est à l'aune du premier, si vous voulez gérer les transactions, c'est effectivement plutôt sur de TIBUpdate que vous devriez avoir un composant IBtransaction pouavnt avoir un comportement différent de la transaction par défaut

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2010
    Messages : 104
    Par défaut
    Bonjour à tous,
    je vois que quelques explications sont nécessaires.
    Ce programme que j'essaie de migrer sur delphi 10.4 date de plus de 5 ans. C'est mon premier programme avec une base de données.
    Je suis arrivé avec ce programme à une version "fonctionnelle" (dans le sens que le programme fonctionne ou plus trivialement : "il fait le job")
    N'étant pas informaticien, je vois qu'il va falloir modifier un certain nombre de choses pour que la migration soit réussie.

    Pour répondre à Sergio :
    La base de données comporte 4 tables.
    La principale est la table "DONNE" qui comporte actuellement près de 5000 enregistrements. Mais elle s'enrichit régulièrement de nouveaux enregistrements.
    Cette table comporte 30 champs (integer ou char) et un index primaire num (NUM int NOT NULL Primary key).
    Parmi ces 30 champs, il y en a un : CAT qui est un integer et qui peut prendre la valeur de 1 à 16 uniquement.
    Il y donc à peu près 300 enregistrements de catégorie 1, 300 avec CAT=2 ...

    Ce que je veux faire :
    -extraire les enregistrements de cat=1 et en choisir un au hasard et stocker son numéro dans la deuxième table
    _ idem pour cat =2
    je fais ça 40 fois. A la 17ème extraction, , on recommence à partir de cat=1. De même avec 33.

    Ce qui coinçait jusqu'à présent, c'était l'extraction uniquement des enregistrements de même catégorie.
    Mais ça marche maintenant : J'ai modifié (ou enlevé) une propriété à un composant "IBx" mais je ne sais pas lequel

    Merci pour votre aide
    JL

Discussions similaires

  1. OpenProcess renvoie Invalid Process Handle
    Par ktsys dans le forum C++
    Réponses: 2
    Dernier message: 31/07/2007, 12h07
  2. Invalid transaction handle (expecting explicit transaction start)
    Par WebPac dans le forum Bases de données
    Réponses: 9
    Dernier message: 25/06/2007, 18h04
  3. Réponses: 2
    Dernier message: 23/05/2007, 11h02
  4. Réponses: 2
    Dernier message: 18/01/2007, 15h29
  5. [Hibernate] Transaction not successfully started
    Par ypoupou dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/05/2006, 10h36

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