tabelle defekt, wie kommt das?

Hallo,

habe einen Kunden bei dem die Meldung kommt “database disk image is malformed”, kann das durch einen falschen Code entstehen? Ich habe diese Meldung in 10 Jahren nicht gesehen. Wie kann das passieren?

Wie kann ich es reparieren?

Seltsame Meldung auch noch nie gehabt… lsst eher auf kaputtes Medium oder ein Reboot whrend I/O Operatioen schliessen…
Hier nach kurzer Suche in einer Suchmaschine, vielleicht hilft’s:

http://techblog.dorogin.com/2011/05/sqliteexception-database-disk-image-is.html

Ja, den Link hatte ich auch schon gefunden… nun ja hilft nichts, deshalb macht man ja ein Backup!
Zum Glück war es unter cubesql Server, da kann man ja einfach das Backup von gestern einspielen…

http://www.sqlabs.com/sqlitedoctor.php

Oh, das kannte ich gar nicht, danke!

Tja, der Marco hat ein paar Tools programmiert. Ich hab den auch schon gebraucht, den Doktor.

Jetzt hatte ich den Fehler 10 Jahre nicht und nun schon das 2. Mal in kurzer Zeit
heute meldet mir das ein weiterer Kunde: “database disk image is malformed”
Diesmal bei einer anderen Tabelle in der Datenbank

Das ist nicht gut, was geht da vor?

gleiches Programm verschiedene Kunden? Mmm… klingt nicht gut…

Ja… konnte die DB mit dem Sqlitedoctor retten.

Leider gibt es sehr viele Faktoren, die dazu führen können, ich warte mal noch ab, ob der Fehler wieder kommt, bevor ich meine App überprüfe…

einmal ist der Fehler hier aufgetreten, wobei ich natürlich nicht weiß, ob eine vorherige Funktion der Verursacher war:

sql_string=“DELETE FROM dbrechpos where feldo=’”+nr+"’ or feldy=’"+meine_rowid+"’"
dbfakt.SQLExecute(sql_string)
If dbfakt.error then MsgBox "Ein Fehler ist aufgetreten:(Rechnung_pos_del): " + dbfakt.ErrorMessage

Und einmal hier:

for i=0 to listbox1.listcount-1
if len(listbox1.cell(i,1))>0 or len(listbox1.cell(i,2))>0 or len(listbox1.cell(i,3))>0 then
aSQLPARTS.append “Insert into dbbestellpos(felda,feldb,feldc,feldd,felde,feldf,feldg,feldh,feldi,feldj,feldk,feldl,feldm,feldn,feldo,feldp,feldz) “_
+“Values (’”+nr+”’,’”+clear_rec(listbox1.cell(i,0))+"’,’"+clear_rec(listbox1.cell(i,1))+"’,’"+clear_rec(listbox1.cell(i,2))+"’,’"+clear_rec(listbox1.cell(i,3))+"’,’"+clear_rec(listbox1.cell(i,4))+"’,’"+clear_rec(listbox1.cell(i,5))+"’,’"+clear_rec(listbox1.cell(i,6))+"’,’"+clear_rec(listbox1.cell(i,8))+"’,’"+clear_rec(listbox1.cell(i,9))+"’,’"+clear_rec(listbox1.cell(i,10))+"’,’"+clear_rec(listbox1.cell(i,7))+"’,’"+clear_rec(listbox1.cell(i,11))+"’,’"+clear_rec(listbox1.cell(i,12))+"’,’"+clear_rec(listbox1.cell(i,13))+"’,’"+clear_rec(listbox1.cell(i,14))+"’,’"+meine_rowid+"’)"
end if
next

if i>0 then
dbfakt.SQLExecute(join(aSQLPARTS,";"))
If dbfakt.error then MsgBox "Ein Fehler ist aufgetreten:(Bestellung_pos): " + dbfakt.ErrorMessage
end if

Die möglichen Ursachen werden hier beschrieben, fast alle davon sind aber externe Einflüsse:
http://www.sqlite.org/howtocorrupt.html

Danke, hatte mir die Gründe schon ca. 4 Mal durchgelesen und bin auch zu dem Schluß gekommen, dass es nicht an meinem Code liegt. Die Wahrscheinlichkeit, dass dies passiert steigt halt auch mit der Anzahl der Kunden und über die letzten 10 Jahre sind da doch ein paar zusammengekommen :wink:

Wre es nicht sinnvoll bei SQLexecute das einzubauen: ?

dbfakt.SQLExecute(“BEGIN TRANSACTION”)
.
.
.
.
und dann

dbfakt.SQLExecute(sql_string)

If dbfact.Error Then
MsgBox dbfact.ErrorMessage
else
dbfact.Commit
end if

Klar, das machen wir natürlich…

Insgesamt hatte ich 3 Fälle in 10 Jahren Xojo (RealBasic)

In einem Fall hatte der Kunde das komplette Paket von der DropBox aus gestartet, irgendwann war die DB zu groß und es ging schief.

In einem anderen Fall hatte der Kunde massive Netzwerkprobleme und arbeiitete mit dem cubesql Server

Also war es nur 1 Fall, den ich mir nicht erklären konnte… damit kann leben

Außerdem waren in allen 3 Fällen mit dem SqlDoctor de DB zu reparieren