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 :

Firedac + SQLite et détection de modification


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 091
    Par défaut Firedac + SQLite et détection de modification
    Bonjour,

    pour tester les possibilités de Firedac avec SQLite, j’ai chargé en mémoire ma base SQLite (base de 10 Mo) au chargement de mon appli, les pers sont excellente.

    En sortie, je voudrais pouvoir décidé de sauver sur disque ma base en mémoire mais seulement si elle a reçu des modifications.

    J’ai pas trouvé comment déterminer avec exactitude si la base a été modifiée, auriez-vous une idée ou une solution ?

    Merci d’avance de vos propositions.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 978
    Par défaut
    Puisque tu as décidé de tout mettre en mémoire, pourquoi ne pas tout simplement mettre l'information qu'il te manque en mémoire également ?
    Il suffit de mettre à jour cette information de la même manière que tu mets à jour le reste.

    Edit :
    Au passage, cette approche est dangereuse.
    S'il y a le moindre plantage non géré dans ton application, tu risques de perdre toutes tes modifications en mémoire.
    Une base SQLite est faite pour travailler en local, de sorte que tu n'a normalement pas de problème d'accès.
    Je te suggère de lire et écrire dans la base uniquement lorsque c'est nécessaire et uniquement sur les données qui sont nécessaires.

  3. #3
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 457
    Par défaut
    Bonjour,
    Citation Envoyé par der§en Voir le message
    En sortie, je voudrais pouvoir décidé de sauver sur disque ma base en mémoire mais seulement si elle a reçu des modifications.
    Je ne connais pas FIREDAC mais l'interface
    sqlite3_changes()
    ou
    sqlite3_total_changes()
    sont là exprès

    Cordialement

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par der§en Voir le message
    En sortie, je voudrais pouvoir décidé de sauver sur disque ma base en mémoire mais seulement si elle a reçu des modifications.
    Hum, A moins que tu veuilles faire une copie de la base, je ne comprends pas bien le terme "sauver" sauf si tu utilises des tables en mode CacheUpdates.
    Ensuite tu peux toujours utiliser une variable booléenne globale, false par défaut et que tu mettrais à true dès le premier "POST".
    Sache également que tu peux obtenir le nombre de lignes modifiées si tu utilises des querys (exemple ndeleted:=FDQuery.ExecSQL('DELETE FROM MATABLE WHERE N=1'))

    Pour moi c'est trop flou comme demande
    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

  5. #5
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 091
    Par défaut
    Ma base est principalement pour des accès en lecture seule, mais il peux arriver qu’il faille faire des MAJ.

    Je me demandais si Firedac, était capable de me dire si il a eu des modifications dans la base sans avoir à mettre ma propre gestion, histoire de ne pas réinventer la roue.

    Quand je parle de sauver, il s’agit pour moi de créer une copie de la base en mémoire après avoir appliquer TFDSQLiteValidate.Sweep !

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    C'est le "en mémoire" qui me chiffonne !
    Il me semble que tu pourrais le faire directement en utilisant un FDConnection.EXECSQL('VACUUM INTO Copiebase.sdb'); mais ça demande quelques tests, https://www.sqlite.org/lang_vacuum.html
    j'ai déjà utilisé d'autres "commandes" SQLite en direct mais pas celle-ci
    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 chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 091
    Par défaut
    Si tu veux, une fois remplacé ma base perso par une plus générique, je peux publier mon datamodule avec un exemple utilisant TFDQuery pour que tu puisses voir comment j’ai chargé en mémoire ma base SQLite !

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Maintenant que je me suis un peu remis au codage, oui, pourquoi pas
    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
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    j'ai déjà utilisé d'autres "commandes" SQLite en direct mais pas celle-ci
    Voilà j'ai retrouvé au moins une utilisation dans mes codes, pour gérer les changements possibles de la structure d'une base de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    version:=FDCnxcomptes.ExecSQlScalar('PRAGMA user_version');
    Code à retrouver dans ce dépôt unité Udm.pas

    Comme cette histoire de chargement me chiffonne, j'ai effectivement lu que c'était possible via les API SQLite https://www.sqlite.org/inmemorydb.html
    Toutefois, à moins que cela m'ait échappé, je ne crois pas que cette fonctionnalité soit offerte dans Firedac mais j'avoue ne pas avoir cherché

    Bon, pour commencer ma journée (en attendant l'installation de la dernière version Bêta de D13) je vais faire ces deux tentatives à partir d'un projet vide.
    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

  10. #10
    Membre émérite
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 457
    Par défaut
    Bonjour,
    Citation Envoyé par SergioMaster Voir le message
    Voilà j'ai retrouvé au moins une utilisation dans mes codes, pour gérer les changements possibles de la structure d'une base de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    version:=FDCnxcomptes.ExecSQlScalar('PRAGMA user_version');
    Pour pouvoir vérifier la version utilisateur, encore faut il la mettre à jour car celle ci nest jamais mise à jour par SQLITE.
    The user_version pragma will get or set the value of the user-version integer at offset 60 in the database header. The user-version is an integer that is available to applications to use however they want. SQLite makes no use of the user-version itself.
    Par contre le pragma Data_version peut être intéressant
    PRAGMA schema.data_version;

    The "PRAGMA data_version" command provides an indication that the database file has been modified. Interactive programs that hold database content in memory or that display database content on-screen can use the PRAGMA data_version command to determine if they need to flush and reload their memory or update the screen display.

    The integer values returned by two invocations of "PRAGMA data_version" from the same connection will be different if changes were committed to the database by any other connection in the interim. The "PRAGMA data_version" value is unchanged for commits made on the same database connection. The behavior of "PRAGMA data_version" is the same for all database connections, including database connections in separate processes and shared cache database connections.

    The "PRAGMA data_version" value is a local property of each database connection and so values returned by two concurrent invocations of "PRAGMA data_version" on separate database connections are often different even though the underlying database is identical. It is only meaningful to compare the "PRAGMA data_version" values returned by the same database connection at two different points in time.
    EDIT 29/08/2025 9H56 Ceci ne semble vérifié que pour les autres connections à la base de données
    Cordialement

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Peut-être la comparaison des valeurs de PRAGMA schema.data_version à condition qu'elle soit récupérée par une connexion à ta base en mémoire différente de celle qui la modifie ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  12. #12
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut Pourquoi pas un Trigger
    Je pense que l'utilisation de "trigger" est aussi une solution. +D'infos si tu le souhaites. Si tu nous envoies un exemple j’essaierai de te faire un essai avec le solution que je propose.

Discussions similaires

  1. Monitor Firedac sqlite et MySQL
    Par Papy214 dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/09/2018, 15h58
  2. Firedac SQLite + pooled
    Par Papy214 dans le forum Langage
    Réponses: 13
    Dernier message: 18/09/2018, 15h08
  3. Problème avec Delphi Firedac SQLite et les commit
    Par duss57 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/09/2018, 14h30
  4. Firedac + SQlite => erreur incomprise : interrupted
    Par Papy214 dans le forum Langage
    Réponses: 7
    Dernier message: 06/09/2018, 09h38
  5. Epées et FireDac SQLite
    Par Zacheus dans le forum Delphi
    Réponses: 8
    Dernier message: 12/11/2015, 17h11

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