Sqlite database disk image is malformet

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Sqlite database disk image is malformet

Message par microdevweb »

Bonjour à tous,

Voici le soucis pour logiciel client voici le message quand on essaye d'ouvrir la base de données. "database disk image is malformet", je n'ai aucune idée de ce qui à peu se passer. J'ai bien trouvé des logiciels pour la lire, mais payant (180 dollars) si je veux sauvegarder la base de données.

Merci de vos suggestions.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Sqlite database disk image is malformet

Message par falsam »

Voila ce que c'est que de faire de la pseudo POO sur une base de données. :mrgreen:

Charge la version de http://sqlitebrowser.org/

Puis regarde ce lien https://sysinfotools.com/blog/fix-error ... malformed/ (Step 3 et 4)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Sqlite database disk image is malformet

Message par microdevweb »

Merci falsam,
J'avais déjà regardé ce lien, mais tous le problème est la même DB Broswer ne veux ouvrir la db. Donc je ne voie pas comment envoyé la requête
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marcel
Messages : 24
Inscription : jeu. 18/févr./2010 21:52
Localisation : Darmstadt - Allemagne
Contact :

Re: Sqlite database disk image is malformet

Message par Marcel »

Bonjour,
avec Firefox j'utilise Add-On SQLite Manager
Win 10 - PB 5.31 et 5.71
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Sqlite database disk image is malformet

Message par microdevweb »

Merci Marcel,

Cela peut être utilise.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Sqlite database disk image is malformet

Message par Marc56 »

Cela ne t’aidera pas, cela aurait dû être fait avant, mais normalement tout système professionnel utilisant une base de donnée doit faire une sauvegarde en binaire et un dump.
Donc même sur une petite application, prévoir une copie (horodatée) qui se fait automatiquement à l'ouverture.

(Aparté pour les débutants en base de données)
- La sauvegarde en binaire (= copie) est effectuée en fin de journée car elle nécessite que la base soit arrêtée.
- Le dump (appelé aussi "déchargement de base de donnée") peut par contre être effectué à chaud.
Le "Dump" est un fichier texte qui contient toute les commandes qu'on devrait taper à la main si on voulait créer la base.

Pour faire le Dump complet d'une base SQLite

Code : Tout sélectionner

sqlite3.exe base_de_données .dump > fichier_text
(on peut ajouer un pipe pour comprimer en même temps)

Le Dump est plus lent, mais sera toujours lisible et permet aussi de migrer facilement.

Sur les plus gros systèmes, on fait une sauvegarde en binaire à partir de la copie de base effectuée par le système de journalisation, ce qui évite de devoir arrêter la base.

Avec PB, la copie est facile à faire puisqu'il suffit d'un simple FileCopy() avant d'ouvrir la base.

:wink:
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Sqlite database disk image is malformet

Message par microdevweb »

@Marc56,

Il y avais heureusement un système de backup manuel et à la fermeture. Donc fort heureusement peut de données on été perdue et ont peux ainsi être restaurées.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Sqlite database disk image is malformet

Message par Marc56 »

Je n'ai jamais essayé, mais il semble que SQLite fait aussi de la journalisation
https://sqlite.org/tempfiles.html

Dans le cas contraire, tu peux aussi créer ton propre journal et sauvegardant au niveau de ton programme chaque requête elle-même (et non pas son résultat) dans un simple fichier texte.
En cas de problème, tu corriges le fichier journal, puis tu le réinjecte (<) dans la sauvegarde du jour précédent.

Ça permet aussi de mettre ça sous le nez de des utilisateurs qui disent toujours "j'ai touché à rien pourtant ?" :mrgreen:

:wink:
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Sqlite database disk image is malformet

Message par microdevweb »

Ha c'est vrai que c'est pas con... Mais pour ce soft, cela représenterais peut-être beaucoup de travail, quoique toutes les requête passe par un module db donc se serais faisable.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: Sqlite database disk image is malformet

Message par Marc56 »

microdevweb a écrit :Ha c'est vrai que c'est pas con... Mais pour ce soft, cela représenterais peut-être beaucoup de travail, quoique toutes les requête passe par un module db donc se serais faisable.
Tu ajoutes juste 3 lignes :)
Exemple basé sur celui de la doc https://www.purebasic.com/french/docume ... se.pb.html

Ne pas oublier:
- Mettre le log en mode ajout à la fin (#PB_File_Append) (inutile avec ça de faire un FileSeek)
- Ajouter un ; à la fin de chaque ligne si le code n'en met pas
- Ajouter un saut de ligne.

Code : Tout sélectionner

UseSQLiteDatabase()

Procedure CheckDatabaseUpdate(Database, Query$)
     ; --- Sauvegarde de la requête 
     OpenFile(0, GetTemporaryDirectory() + "SQL_Log.sql", #PB_File_Append)
     WriteString(0, Query$ + ";" + #CRLF$)
     CloseFile(0)
     ; --- 
     Result = DatabaseUpdate(Database, Query$)
     If Result = 0
          Debug DatabaseError()
     EndIf
     
     ProcedureReturn Result
EndProcedure

DatabaseFile$ = GetTemporaryDirectory()+"Database.sqlite"

If CreateFile(0, DatabaseFile$)
     CloseFile(0)
     
     If OpenDatabase(0, DatabaseFile$, "", "")
          
          CheckDatabaseUpdate(0, "CREATE TABLE food (name CHAR(50), weight INT)")
          
          CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
          CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('pear', '5')")
          CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('banana', '20')")
          
          If DatabaseQuery(0, "SELECT * FROM food WHERE weight > 7")
               
               While NextDatabaseRow(0)
                    Debug GetDatabaseString(0, 0)
               Wend
               
               FinishDatabaseQuery(0)
          EndIf
          
          CloseDatabase(0)
     Else
          Debug "Can't open database !"
     EndIf
Else
     Debug "Can't create the database file !"
EndIf
Pour réinjecter le code, il suffit après édition des erreurs et suppression des commandes non désirées (create table, drop etc) dans le fichier texte d'utiliser la version ligne de commande de SQLite
http://www.sqlite.org/download.html
Version actuelle pour Windows: sqlite-tools-win32-x86-3210000.zip

Puis envoyer le fichier log dans la base

Code : Tout sélectionner

sqlite3.exe Database.sqlite < SQL_Log.sql
Ensuite, faire tourner les logs tous les jours (on sauvegarde l'ancien (.zip) avec un timestamp dans le nom)

:wink:
Répondre