Seite 2 von 3

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 19:19
von marcelx
SUPER - mit ein Delay funktionniert

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 19:30
von marcelx
Zu früh gefreut, es geht nicht immer

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 20:42
von NicTheQuick
Ich vermute immer noch den Virenscanner dahinter. Oder andauernde Aufräumarbeiten der SQLite-Engine im Hintergrund und vielleicht wartet 'CloseDatabase()' nicht bis die beendet wurden. Vor allem bei einer großen Datenbank könnte das der Grund sein.

Re: Datenbank (Datei) löschen

Verfasst: 18.01.2022 20:51
von mk-soft
Funktioniert hier unter Windows 10 und PB v5.73 und v6.00 einwandfrei.

Aber vielleicht das mal lesen ...

Link: https://www.sqlite.org/c3ref/close.html

Vielleicht hat Nic recht.


Versuch mal ...

Update

Code: Alles auswählen

; **** SQL Datenbank schliessen ***

Import ""
  sqlite3_close(*sqlite3)
EndImport

#SQLITE_OK = 0
#SQLITE_BUSY = 5

Structure udtDatabaseObject
  i.i[0]
EndStructure

Procedure CloseSQLiteDatabase(Database, Timeout = 20000)
  Protected r1, id, time, *db_object.udtDatabaseObject
  
  If Not IsDatabase(Database)
    ProcedureReturn 0
  EndIf
  
  id = DatabaseID(Database)
  *db_object = IsDatabase(Database)
  Repeat
    r1 = sqlite3_close(id)
    If r1 = #SQLITE_OK
      *db_object\i[4] = 0 ; Set handle to Nil (Offset 4)
      Break
    ElseIf r1 = #SQLITE_BUSY
      If time = 0
        Debug "Datenbank in bearbeitung, bitte warten ... "
      EndIf
      time + 100
      Delay(100)
      If time > Timeout ; Millisekunden
        Debug "Fehler Datenbank schliessen Timeout!"
        Break
      EndIf
    Else
      Debug "Fehler Datenbank schliessen Fehlercode " + r1
      Break
    EndIf
  ForEver
  CloseDatabase(Database)
EndProcedure

; ****

Re: Datenbank (Datei) löschen

Verfasst: 19.01.2022 10:50
von marcelx
Guten Morgen

ich probiere dein code und bekomme die Meldung "Ungültiger Speicherzugriff" (unter v5.31) bei

*db_object\i[4] = 0 ; Set handle to Nil (Offset 4)

Re: Datenbank (Datei) löschen

Verfasst: 19.01.2022 11:34
von TroaX
Haha lol ich Depp. Warum einfach, wenn es auch kompliziert geht:

Code: Alles auswählen

While DeleteFile(GetTemporaryDirectory()+Filename+".db") <> 0 ; Schleife läuft, bis die Datei gelöscht werden kann
  Delay(1) ; Schleife gibt Prozessorzeit frei und friert das Programm nicht direkt ein
Wend
; Kommst du hier an, ist die Datei gelöscht!!
Hach das kommt davon, wenn man fast nur noch mit PWA und Backends herumspielt. Dann kommt man auf so banale Lösungen nicht. :bounce:

Was ich aber nicht so ganz verstehe. Warum erzeugst du eine Datenbank, arbeitest mit dieser, aber löscht sie im selben Atemzug wieder, wenn du fertig bist? Macht das nicht ein wenig den Sinn von Datenbanken kaputt? Wenn nur Daten drin stehen, die du während der Ausführung des Programms benötigst, aber nicht permanent speichern willst, macht es meiner Meinung mehr Sinn, diese im RAM zu lassen.

Re: Datenbank (Datei) löschen

Verfasst: 19.01.2022 11:46
von NicTheQuick
Du solltest vielleicht noch einen Timeout einbauen, falls es mal wirklich nicht geht oder die Datei schon gelöscht bzw. nie erstellt wurde. Man weiß ja nie. Aber ansonsten hängst du ja in einer Schleife fest. Das Delay(1) ist für meinen Geschmack auch etwas zu kurz, aber um die CPU-Nutzung niedrig zu halten, reicht es vermutlich trotzdem.

Re: Datenbank (Datei) löschen

Verfasst: 19.01.2022 11:47
von TroaX
NicTheQuick hat geschrieben: 19.01.2022 11:46 Du solltest vielleicht noch einen Timeout einbauen, falls es mal wirklich nicht geht oder die Datei schon gelöscht bzw. nie erstellt wurde. Man weiß ja nie. Aber ansonsten hängst du ja in einer Schleife fest. Das Delay(1) ist für meinen Geschmack auch etwas zu kurz, aber um die CPU-Nutzung niedrig zu halten, reicht es vermutlich trotzdem.
Na ich wollte jetzt nu nicht alles vorkauen. :mrgreen:

Re: Datenbank (Datei) löschen

Verfasst: 19.01.2022 11:50
von marcelx
So einfach ist es nicht.
Das Löschen ist immer fehlerhaft. in so eine loop lauft auf Ewigkeit.

Re: Datenbank (Datei) löschen

Verfasst: 19.01.2022 11:56
von marcelx
Zur Erläuterung:
DB werden in eine Programm erzeugt.
Diese vorhandene Datenbanken werden als List angezeigt.
Der benutzen kann die Daten aus eine DB per doppelklick ansehen und z.B. die Daten drucken, ändern und so. und die DB löschen