Page 1 sur 1
Sqlite database disk image is malformet
Publié : dim. 29/oct./2017 21:46
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.
Re: Sqlite database disk image is malformet
Publié : dim. 29/oct./2017 22:13
par falsam
Voila ce que c'est que de faire de la pseudo POO sur une base de données.
Charge la version de
http://sqlitebrowser.org/
Puis regarde ce lien
https://sysinfotools.com/blog/fix-error ... malformed/ (Step 3 et 4)
Re: Sqlite database disk image is malformet
Publié : lun. 30/oct./2017 0:09
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
Re: Sqlite database disk image is malformet
Publié : mar. 31/oct./2017 8:56
par Marcel
Bonjour,
avec Firefox j'utilise Add-On SQLite Manager
Re: Sqlite database disk image is malformet
Publié : ven. 03/nov./2017 21:56
par microdevweb
Merci Marcel,
Cela peut être utilise.
Re: Sqlite database disk image is malformet
Publié : sam. 04/nov./2017 15:05
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
(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.

Re: Sqlite database disk image is malformet
Publié : mer. 08/nov./2017 13:03
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.
Re: Sqlite database disk image is malformet
Publié : mer. 08/nov./2017 16:23
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 ?"

Re: Sqlite database disk image is malformet
Publié : jeu. 09/nov./2017 15:05
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.
Re: Sqlite database disk image is malformet
Publié : jeu. 09/nov./2017 16:16
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
Ensuite, faire tourner les logs tous les jours (on sauvegarde l'ancien (.zip) avec un timestamp dans le nom)
