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. :mrgreen:

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

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:

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 ?" :mrgreen:

:wink:

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

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: