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 :

[D7][IB 6.5]Enregistrements non enregistrés


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 62
    Points : 54
    Points
    54
    Par défaut [D7][IB 6.5]Enregistrements non enregistrés
    Bonjour,
    j'ai un gros soucis avec interbase, j'ai déjà passé pas mal de temps pour comprendre et je ne vois pas.
    J'ai développé une application sous Delphi 7 utilisant un base de données interbase (avec la version interbase 6.5 livré avec D7).

    La base fonctionne en local, les machines sont sous XP.

    Sur ma machine avec Delphi et Interbase d'installé aucun soucis, cependant sur une machine ou ni Delphi ni Interbase ne sont installés, seulement l'exécutif de l'appli et les fichiers pour la partie cliente d'interbase (les dossiers udf, intl, et la dll gds32), les enregistrements ne s'enregistre pas.

    Plus concrètement, quand je rentre des données depuis l'appli elles semblent présentes, mais si je ferme et que je réouvre elles ne sont plus là !!!
    J'ai fait d'autres essais de test en modifiant mon code, tant que la connexion avec la base est active je peux entrer, supprimer des enregistrements, mais dès que je ferme la connexion et que je la réouvre, c'est comme si je n'avais rien fais !!! On dirait que tout ce passe en mémoire mais que rien ne s'enregistre sur disque, de quoi cela peut-il venir ??

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    D'un Commit mal fait ou oublié ?

    tu ne nous indiques pas comment tu te connectes à la base , quels composants, quel type de transaction , quel mode de connexion donc la réponse ne peut être que vague
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 62
    Points : 54
    Points
    54
    Par défaut
    J'utilise, dans un DataModule les composants TIBDatabase, TIBTransaction et TIBSQL.
    Pour la connexion, j'ai une fonction connect(dbFullPathName: string),où dbFullPathName est un chemin local, dans le dataModule dont j'initialise les paramètres dynamiquement

    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
    [...]
      IBDatabase1.DatabaseName:= dbFullPathName;
      IBDatabase1.Params.Clear;
     
      IBDatabase1.Params.Append('user_name=SYSDBA');
      IBDatabase1.Params.Append('password=masterkey');
      IBDatabase1.Params.Append('sql_role_name=ADMIN');
      IBDatabase1.Params.Append('lc_ctype=ISO8859_1');
     
      IBDatabase1.SQLDialect:= 3;
     
      //Crée la base si elle n existe pas
      if ( not FileExists(dbFullPathName) ) then
      begin
        CreateDb(dbFullPathName);
      end;
     
      IBDatabase1.Connected:= true;
    L'insertion et la suppression de données est faites par le TIBSQL et une fonction générique du dataModule
    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
    30
    31
    32
    33
    function TIBDataModule.ExecuteSQL(_sql: string): boolean;
    begin
     
      if not IBTransaction1.Active then
        IBTransaction1.Active:= true;
     
      try
        IBSQL.Close;
        IBSQL.SQL.Clear;
     
        FLastQuery:= _sql;
     
        IBSQL.SQL.Add(_sql);
        try
          IBSQL.ExecQuery;
          if (not IBSQL.Prepared) then
            IBSQL.Prepare;
          IBSQL.Transaction.CommitRetaining;
     
          Result:= True;
        except
          if IBSQL.transaction.InTransaction then
          begin
            IBSQL.transaction.Rollback;
            result:=False;
          end;
        end;
      finally
        FLastAffectedRowSCount:= IBSQL.RowsAffected;
        IBSQL.Close;
      end;
     
    end;
    Un test supplémentaire a été d'ajouter ces deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      IBDatabase1.Close;
      IBDatabase1.Open;
    à la fin de cette fonction, mais le résultat est inchangé sur la machine où delphi et interbase sont installés tout est correcte, sur les machines où ils ne sont pas installés (testé sur une autre machine XP et une Vista), les enregistrements ne sont pas là, de plus après avoir copier la base pour la regarder avec l'ibconsole sur la machine se trouve interbase, le générateur d'id pour les enregistrement est bien incrémenté (j'appelle une procédure stockée pour générer un id, avant de construire la requête sql que j'envoie à ma fonction ExecuteSQL.

    Je ne comprends pas.
    J'ai aussi testé le fait de copier ma base ayant déjà des enregistrements sur une des machines où Interbase n'est pas installé, et je vois correctement les enregistrements déjà présents, si j'en ajoute il ne s'enregistre pas, par contre si j'en supprime, ils sont bien supprimés.
    Que faire.. ? Est-ce le client interbase qui est mal installé ?

    L'autre question est de savoir, quel serait la quantité de modification de manière générale (composants, façon de se connecter, script sql pour la création des tables,..) à faire pour utiliser FireBird à la place d'Interbase, mon appli n'étant pas encore très grosse pour ce qui est de la partie base de données (4 tables). Par exemple, est-il possible d'utiliser les composants TIb... de Delphi ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 62
    Points : 54
    Points
    54
    Par défaut
    Mea culpa,

    En fait il doit se passer une erreur quelque part car c'est le rollback qui agit, et je viens de voir que je ne testais pas la valeur de retour de la fonction ExecuteSQL.
    Ce que je ne comprends pas encore c'est pourquoi sur la machine avec Delphi et Interbase il n'y a pas d'erreur alors que sur les autres oui.

    Cependant, je suis toujours preneur d'information en ce qui concerne la quantité et le type de changement à prévoir pour utiliser Firebird au lieu d'interbase.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 62
    Points : 54
    Points
    54
    Par défaut Erreur, complétement localisé
    Bon j'ai fini par localiser et comprendre cette fichu erreur, elle provient de la requête et du séparateur décimal...
    comble de coïncidence sur la machine avec Delphi et Ib, le séparateur décimal est '.', sur les autres ',' ce qui déclenchait une erreur sql 804 (mauvais nombre de colonnes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      'INSERT INTO TSH (CSH_ID, CSH_FRIENDLYNAME, CSH_PRICE) VALUES (6, 'Test insertion', 45.00)'
      'INSERT INTO TSH (CSH_ID, CSH_FRIENDLYNAME, CSH_PRICE) VALUES (6, 'Test insertion', 45,00)'
    J'ai résolu pour le moment en forçant le séparateur décimal à '.' avant l'insertion dans mon string sql des champs numériques, cependant j'aimerais savoir s'il n'y a pas un autre moyen d'insérer les champs numériques sans avoir à modifier le séparateur décimal

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par jaffael Voir le message
    J'ai résolu pour le moment en forçant le séparateur décimal à '.' avant l'insertion dans mon string sql des champs numériques, cependant j'aimerais savoir s'il n'y a pas un autre moyen d'insérer les champs numériques sans avoir à modifier le séparateur décimal
    OUI , en utilisant des requêtes paramétrées (chose que je ne répète jamais assez )

    Cependant, je suis toujours preneur d'information en ce qui concerne la quantité et le type de changement à prévoir pour utiliser Firebird au lieu d'interbase.
    Pas grand chose à faire , pour l'instant les TIBxxxxxx semblent encore fonctionner . Un backup avec Interbase puis l'installation de Firebird et d'un restore semble suffisants dans la plupart des cas ! je recommanderai toutefois d'en rester à la version 2.05 de firebird à cause de ces composants . Ce qui est dommage !!
    Le passage vers la 2.1 et plus devra s'accompagner d'une remise en cause des composants à utiliser (alternatives gratuites UIB, ZEOSDBO ...ou payantes FIbPlus ....)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 62
    Points : 54
    Points
    54
    Par défaut
    Merci de ta réponse pour Firebird, je vais y réfléchir sérieusement.

    OUI , en utilisant des requêtes paramétrées (chose que je ne répète jamais assez )
    Ce que je fais quand j'ai des champs blobs à entrer, mais veux-tu dire par là d'entrer tout les champs en paramétrés et donc de ne mettre dans le string sql que des :param1,.., :paramX

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Absolument sauf peut-être les constantes , je ne veux pas être trop rigoureux non plus
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    J'ajoute qu'au delà du problème de séparateur, l'emploi de requêtes paramétrées permet de s'affranchir de la gestion des apostrophes dans une chaine...
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

Discussions similaires

  1. Réponses: 22
    Dernier message: 05/06/2018, 09h36
  2. [Debutant] Enregistrement non trier
    Par Natsboss dans le forum Access
    Réponses: 4
    Dernier message: 20/08/2006, 23h48
  3. [Débutant] Enregistrement non souhaité.
    Par Monsieur Peck dans le forum Access
    Réponses: 1
    Dernier message: 11/06/2006, 14h40
  4. Réponses: 4
    Dernier message: 08/06/2006, 23h04
  5. [ToutlookApplication] Classe non enregistrée
    Par nico33410 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/08/2005, 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