SQLiteDatabase mit :memory: in eine DB-Datei schreiben

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

SQLiteDatabase mit :memory: in eine DB-Datei schreiben

Beitrag von marcelx »

Hallo,

ich habe eine Datenbank in pb mit :memory: erzeugt und möchte diese in ein Datei-Datenbank schreiben.
Gibt es da ein einfacher Lösung?
Danke und Gruß
MarcelX
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: SQLiteDatabase mit :memory: in eine DB-Datei schreiben

Beitrag von RSBasic »

Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: SQLiteDatabase mit :memory: in eine DB-Datei schreiben

Beitrag von marcelx »

Super
Danke RSBasic, ich werde es gleich ausprobieren
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: SQLiteDatabase mit :memory: in eine DB-Datei schreiben

Beitrag von marcelx »

In mein code ist Backup=0 ?

Code: Alles auswählen

ImportC "sqlite3.lib"
  sqlite3_backup_init(pDest, zDestName.s, pSource, zSourceName.s)
  sqlite3_backup_step(sqlite3_backup, nPage)
  sqlite3_backup_finish(sqlite3_backup)
  sqlite3_errcode(db)
EndImport

UseSQLiteDatabase()

Global DB

Procedure DBCreateTable(tbl.s, sql.s)
    If DatabaseUpdate(DB, "CREATE TABLE "+tbl+" ("+sql+")")
    Else
      Debug "SQ_DBCreateTable: "+ DatabaseError()
    EndIf
EndProcedure

Procedure DBinsert1(col1.s, col2.s)
  sql.s = "INSERT INTO test1 (col1, col2) VALUES ('"+col1+"', "+"'"+col2+"')"
  DatabaseUpdate(DB, sql)
EndProcedure

Procedure DBinsert2(name1.s, name2.s)
  sql.s = "INSERT INTO test2 (name1, name2) VALUES ('"+col1+"', "+"'"+col2+"')"
  DatabaseUpdate(DB, sql)
EndProcedure

Procedure backup()
  ; Create File-Database
  Debug GetTemporaryDirectory() + "temp.db"
  FF = CreateFile(#PB_Any, GetTemporaryDirectory() + "temp.db")
  If FF
    CloseFile(FF)
    DbFile = OpenDatabase(#PB_Any, GetTemporaryDirectory() + "temp.db", "", "", #PB_Database_SQLite)
    If DbFile
      ; Initialize Backup:
      BackUp = sqlite3_backup_init(DatabaseID(DbFile), "main", DatabaseID(DB), "main")
      If BackUp
        ; Dump Data from :memory:-DB to File-DB
        sqlite3_backup_step  (Backup, -1)
        sqlite3_backup_finish(Backup)
      Else
        Debug "Err BackUp: "+Str(BackUp)
      EndIf
      Debug sqlite3_errcode(DatabaseID(DbFile)) ; ErrorCodes: see below
      CloseDatabase(DbFile)
      ; RunProgram(GetTemporaryDirectory() + "temp.db") ; Open File-DB for checking purposes
    EndIf
  EndIf
EndProcedure
  
DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)
DBCreateTable("test1", "ID INTEGER PRIMARY KEY AUTOINCREMENT, col1 TEXT, col2 TEXT")
DBCreateTable("test2", "ID INTEGER PRIMARY KEY AUTOINCREMENT, name1 TEXT, name2 TEXT")

DBinsert1("colA", "colB")
DBinsert2("nameA", "nameB")

OpenWindow(1, 0, 0, 400, 200,"Test",  #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
ButtonGadget(1, 20,20,50,25,"Test")
Repeat
  Event = WaitWindowEvent()
  Select Event
    Case  #PB_Event_Gadget
      EventGadget = EventGadget()
      Select EventGadget
        Case 1
          Debug "..." ; Ausgabe der Datenbank in ein Datei
          backup()
      EndSelect
  EndSelect

Until Event = #PB_Event_CloseWindow
ADD:
mit dein Code aus https://www.purebasic.fr/english/viewtopic.php?p=368143 ist auch BackUp=0
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: SQLiteDatabase mit :memory: in eine DB-Datei schreiben

Beitrag von Bisonte »

das mag an dem ASCII/Unicode Problem liegen.

Ersetze doch mal den ImportC-Block durch diesen hier :

Code: Alles auswählen

  ImportC ""
    sqlite3_backup_init(pDest, zDestName.p-utf8, pSource, zSourceName.p-utf8)
    sqlite3_backup_step(sqlite3_backup, nPage)
    sqlite3_backup_finish(sqlite3_backup)
    sqlite3_errcode(db)
  EndImport
Ich habe allerdings eine etwas andere Kopierroutine :

Code: Alles auswählen

  Procedure.i CopyDatabase(sourceDB, destinationDB)
    
    Protected result, backUp
    
    If IsDatabase(sourceDB) And IsDatabase(destinationDB)
      backUp = sqlite3_backup_init(DatabaseID(destinationDB), "main", DatabaseID(sourceDB), "main")
      If backUp
        sqlite3_backup_step(backUp, -1)
        If sqlite3_backup_finish(backUp) = 0 ;#SQLITE_OK
          result = #True   
        EndIf
      EndIf
    EndIf
    
    ProcedureReturn result
    
  EndProcedure
Dabei muss man halt beachten, dass man der Prozedur nur die Datenbank Handles von PB übergibt.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: SQLiteDatabase mit :memory: in eine DB-Datei schreiben

Beitrag von marcelx »

Mit dein ImportC-Block funktioniert.
Danke
Win-10, PB 5.31 (Windows - x86)
Antworten