Datenbank (Datei) löschen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Datenbank (Datei) löschen

Beitrag von TroaX »

Achsooo das heißt du bietest das löschen der Datenbank als Dienst optional in deinem Programm an. Ja ok dann macht das natürlich Sinn.
marcelx hat geschrieben: 19.01.2022 11:50 So einfach ist es nicht.
Das Löschen ist immer fehlerhaft. in so eine loop lauft auf Ewigkeit.
Dann ist das Verhalten nicht nachvollziehbar. Es macht keinen Sinn, wenn sich eine Datenbank auf diese Art per Snippet löschen lässt, aber in deinem umfangreicheren Programm nicht. Das weißt entweder auf einen Bug hin, die DB-Lib von PB deckt nicht alle SQLite-Eventualitäten ab oder es befindet sich noch ein Fehler in den Code-Teilen, die wir nicht sehen können. Auf jeden Fall blockiert dein Programm die Datei und die Lösung ist, das es diese wieder ordentlich schließt. Und die Snippets zeigen, das es zumindest in diesem kleinen Rahmen funktioniert mit CloseDatabase funktioniert.

Wenn also mein Ansatz, zu warten bis die Datei geschlossen wurde, in einer Endlosschleife endet, dann wurde die Datenbankdatei nicht komplett geschlossen. Dein Code aber funktioniert tadellos. Auch nachdem ich eine Tabelle erstellt und 1001 Einträge hinein geschmissen habe, hat es die Datenbank sauber geschlossen und die Datei gelöscht (PB 5.73):

Code: Alles auswählen

UseSQLiteDatabase()

Global DB

Procedure.s FormatMessage(ErrorCode)
  Protected *Buffer, len, result.s
  len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,ErrorCode,0,@*Buffer,0,0)
  If len
    result = "Errorcode " + Hex(ErrorCode) + ": " + PeekS(*Buffer)
    LocalFree_(*Buffer)
    ProcedureReturn result
  Else
    ProcedureReturn "Errorcode: " + Hex(ErrorCode)
  EndIf
EndProcedure 

Procedure DBCreate(Filename.s)
  Nr = CreateFile(#PB_Any,GetTemporaryDirectory()+Filename+".db")
  CloseFile(Nr)
  Debug GetTemporaryDirectory()+Filename+".db"
EndProcedure

Procedure DBOpen(Filename.s,User.s="",Pass.s="")
  DB = OpenDatabase(#PB_Any, GetTemporaryDirectory()+Filename+".db", User, Pass, #PB_Database_SQLite)
EndProcedure

Procedure DBClose()
  CloseDatabase(DB)
  DB=0
EndProcedure

fileName.s = "Test007"
DBCreate(fileName)
DBOpen(fileName)

DatabaseUpdate(DB, "CREATE TABLE contacts (contact_id INTEGER PRIMARY KEY, first_name TEXT Not NULL, last_name TEXT Not NULL, email TEXT Not NULL UNIQUE, phone TEXT Not NULL UNIQUE)")
For c = 0 To 1000
  DatabaseUpdate(DB, "INSERT INTO contacts (contact_id, first_name, last_name, email, phone) VALUES ("+c+", 'Test "+c+"', 'Last "+c+"', 'mail "+c+"', 'phone "+c+"')")
Next

Debug FileSize(GetTemporaryDirectory()+Filename+".db")
DBClose() ; ADD
If DeleteFile(GetTemporaryDirectory()+Filename+".db")
  Debug "OK"
Else
  Debug FormatMessage(GetLastError_())
EndIf
Ich kann daher nichts mehr dazu sagen. Ich denke hier gibt es ein Problem mit dem Code, den wir hier nicht sehen.
Zuletzt geändert von TroaX am 19.01.2022 13:01, insgesamt 1-mal geändert.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Datenbank (Datei) löschen

Beitrag von mk-soft »

Versuch mal diese gekürzte Fassung. Sollte auch v5.31 laufen.

Code: Alles auswählen

; **** SQL Datenbank schliessen ***

Import ""
  sqlite3_close(*sqlite3)
EndImport

#SQLITE_OK = 0
#SQLITE_BUSY = 5

Procedure CloseSQLiteDatabase(Database, Timeout = 20000)
  Protected r1, id, time
  
  If Not IsDatabase(Database)
    ProcedureReturn 0
  EndIf
  
  id = DatabaseID(Database)
  Repeat
    r1 = sqlite3_close(id)
    If r1 = #SQLITE_OK
      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

; ****
Mal schauen ob es ein Fehler beim schliessen der Datendank gibt.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenbank (Datei) löschen

Beitrag von marcelx »

Ich bekomme bei CloseDatabase(Database)
die Meldung "Das angegebene #Database ist nicht initialisiert" obwohl Database richtig ist.
Ich verstehe nur Bahnhof.

"Ich denke hier gibt es ein Problem mit dem Code, den wir hier nicht sehen."

Richtig und wie gesagt der code ist zum umfangreich um es hier zu legen
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Datenbank (Datei) löschen

Beitrag von mk-soft »

Vergiss mein Code. Habe zur zeit kein PB v5.31 mehr am laufen ...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Datenbank (Datei) löschen

Beitrag von TroaX »

Ich werfe einfach mal ein paar Möglichkeiten in den Raum.

Arbeitest du zum Öffnen von Datenbanken wirklich nur mit OpenDatabase oder hast du versehentlich auch noch ein OpenFile mit dabei? Bei existenten Datenbanken reicht OpenDatabase aus. Willst du die Datei trotzdem vor oder nachher öffnen, um noch etwas zu prüfen, dann immer auch an das schließen der Datei denken.

Wenn sich existente Datenbanken auflisten lassen, ist das immer etwas schwierig. Es sei denn, du setzt voraus, das kompatible Datenbanken immer die gleiche Endung haben und du dich darauf verlässt, das es auch wirklich Datenbanken sind. Theoretisch können Datenbanken jede beliebige Endung haben. Prüfst du vielleicht die Datenbanken auf Gültigkeit über OpenDatabase und IsDatebase ab, schließt diese aber nicht richtig mit CloseDatabase?
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenbank (Datei) löschen

Beitrag von marcelx »

Danke - ich untersuche meine code und melde mich - kann dauern - habe Hunger :mrgreen:
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenbank (Datei) löschen

Beitrag von marcelx »

Ich habe eine Datenbank geöffnet obwohl diese schon geöffnet war.
Somit habe ich die 2. zwar geschlossen und die erste nicht.
Bei soviel code hatte ich den überblicke verloren.

Ein großes Dank an alle die mir, bei der Suche, unterstütze haben
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Datenbank (Datei) löschen

Beitrag von TroaX »

Das kann passieren. Immer schön den Code sauber halten. ;)
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Antworten