Seite 1 von 1

:memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 12.10.2011 21:18
von Kiffi
Ahoi,

folgender Code kann hilfreich sein, wenn man
SQLite-:memory:-Datenbanken schnell und unkompliziert
auf einen Datenträger speichern möchte:

Code: Alles auswählen

EnableExplicit

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()

Define DbMem
Define DbFile
Define Counter
Define FF
Define Backup
Define RC

; Beispiel-:memory:-Datenbank anlegen:

DbMem = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)

If DbMem
  
  ; ein paar Spieldaten eintragen
  DatabaseUpdate(DbMem, "Create Table TestTable (Field1, Field2, Field3)")
  For Counter = 0 To 9999
    DatabaseUpdate(DbMem, "Insert Into TestTable (Field1, Field2, Field3) Values (" + Str(Counter) + ", " + Str(Counter) + ", " + Str(Counter) + ")")
  Next
  
  ; Datei-Datenbank anlegen
  
  FF = CreateFile(#PB_Any, GetTemporaryDirectory() + "temp.db")
  
  If FF
  
    CloseFile(FF)
    
    DbFile = OpenDatabase(#PB_Any, GetTemporaryDirectory() + "temp.db", "", "", #PB_Database_SQLite)
    
    If DbFile
      
      ; Backup initialisieren:
      
      BackUp = sqlite3_backup_init(DatabaseID(DbFile), "main", DatabaseID(DbMem), "main") 
      
      If BackUp
        
        ; Und Daten von :memory:-DB in die Datei-DB übertragen
        
        sqlite3_backup_step  (Backup, -1)
        sqlite3_backup_finish(Backup)
        
      EndIf
      
      Debug sqlite3_errcode(DatabaseID(DbFile)) ; ErrorCodes: siehe unten
      
      CloseDatabase(DbFile)
      
      ; RunProgram(GetTemporaryDirectory() + "temp.db") ; Zieldatenbank zur Kontrolle öffnen
      
    EndIf
    
  EndIf
  
EndIf


; #define SQLITE_OK           0   /* Successful result */
; /* beginning-of-error-codes */
; #define SQLITE_ERROR        1   /* SQL error Or missing database */
; #define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */
; #define SQLITE_PERM         3   /* Access permission denied */
; #define SQLITE_ABORT        4   /* Callback routine requested an abort */
; #define SQLITE_BUSY         5   /* The database file is locked */
; #define SQLITE_LOCKED       6   /* A table in the database is locked */
; #define SQLITE_NOMEM        7   /* A malloc() failed */
; #define SQLITE_READONLY     8   /* Attempt To write a readonly database */
; #define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt()*/
; #define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
; #define SQLITE_CORRUPT     11   /* The database disk image is malformed */
; #define SQLITE_NOTFOUND    12   /* Unknown opcode in sqlite3_file_control() */
; #define SQLITE_FULL        13   /* Insertion failed because database is full */
; #define SQLITE_CANTOPEN    14   /* Unable To open the database file */
; #define SQLITE_PROTOCOL    15   /* Database lock protocol error */
; #define SQLITE_EMPTY       16   /* Database is empty */
; #define SQLITE_SCHEMA      17   /* The database schema changed */
; #define SQLITE_TOOBIG      18   /* String Or BLOB exceeds size limit */
; #define SQLITE_CONSTRAINT  19   /* Abort due To constraint violation */
; #define SQLITE_MISMATCH    20   /* Data type mismatch */
; #define SQLITE_MISUSE      21   /* Library used incorrectly */
; #define SQLITE_NOLFS       22   /* Uses OS features Not supported on host */
; #define SQLITE_AUTH        23   /* Authorization denied */
; #define SQLITE_FORMAT      24   /* Auxiliary database format error */
; #define SQLITE_RANGE       25   /* 2nd parameter To sqlite3_bind out of range */
; #define SQLITE_NOTADB      26   /* File opened that is Not a database file */
; #define SQLITE_ROW         100  /* sqlite3_step() has another row ready */
; #define SQLITE_DONE        101  /* sqlite3_step() has finished executing */
; /* End-of-error-codes */
(Danke an edel und ts-soft für das ImportC - Know-How)

Grüße ... Kiffi

// Edit: Mit Rücksicht auf Thomas' Gesundheit wurde die RunProgram()-Zeile auskommentiert.

Re: :memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 12.10.2011 21:28
von ts-soft
:allright:
Jetzt kann ich Deine Fragen wenigstens einordnen :mrgreen:
Kiffi hat geschrieben:

Code: Alles auswählen

      RunProgram(GetTemporaryDirectory() + "temp.db") ; Zieldatenbank zur Kontrolle öffnen
      
Dieser Code ist nicht so gut gewählt, ich weiß ja nicht welches Programm bei Dir mit *.db
verknüpft ist, bei mir ist es keins, wie bei den meisten anderen auch, und führt deshalb hierzu:
Fehlermeldung hat geschrieben:[Window Title]
C:\Users\Thomas\AppData\Local\Temp\temp.db

[Content]
Der Datei ist kein Programm zum Ausführen dieser Aktion zugeordnet. Installieren Sie ein entsprechendes Programm, oder erstellen Sie in der Systemsteuerung unter "Standardprogramme" eine Zuordnung, wenn bereits ein Programm installiert ist.

[OK]
So eine Meldung verschreckt doch so manchen :mrgreen:

Gruß
Thomas

Re: :memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 12.10.2011 21:35
von NicTheQuick
@ts-soft:
Das ist aber doch nur ein Beispiel und jeder, der den Code gut findet und ihn benutzen will, muss ihn eh umschreiben.
Außerdem sind wir hier in einem Programmiererforum. Wenn eine solche Meldung hier jemanden erschreckt, ist er hier nicht so gut aufgehoben.

Re: :memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 12.10.2011 21:37
von Kiffi
ts-soft hat geschrieben:Dieser Code ist nicht so gut gewählt, ich weiß ja nicht welches Programm bei Dir mit *.db
verknüpft ist, bei mir ist es keins, wie bei den meisten anderen auch
haben bei Dir SQLite-Datenbanken eine andere Extension?

Ansonsten sollte jeder, der intensiv mit SQLite-Datenbanken arbeitet,
auch mindestens einen vernünftigen DB-Viewer (beispielsweise TkSQLite)
mit der entsprechenden Extension verknüpft haben.

Wie schaust Du Dir denn SQLite-Datenbanken an?

Grüße ... Kiffi

Re: :memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 12.10.2011 21:45
von ts-soft
Kiffi hat geschrieben: Wie schaust Du Dir denn SQLite-Datenbanken an?

Grüße ... Kiffi
Wenn überhaupt mit SQLite Manager. Aber db wäre wenn überhaupt die Extension für DBase Files und würde ich
nie mit SQLite verknüpfen. Hab auch noch nie gesehen, das irgendwelche Datenbank-Dateien mit Programmen
verknüpft werden.

@NicTheQuick
Ich habe mich aber im erstem Moment erschrocken, alleine diese roten bösen Kreuze in der MessageBox
jagen mir im einen Schauer den Rücken runter...

Re: :memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 12.10.2011 22:00
von Kiffi
ts-soft hat geschrieben:Hab auch noch nie gesehen, das irgendwelche Datenbank-Dateien mit Programmen
verknüpft werden.
na, dann kennst Du jetzt einen, der das macht.

Mensch Thomas. Haar in der Suppe entdeckt. Auftrag erfüllt. :roll:

Re: :memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 12.10.2011 22:05
von ts-soft
Habs doch nur gut gemeint, damit sich nicht noch mehr Leute über diese blöde Fehlermeldung wundern, weil den Source
habe ich mir erst hinterher angesehen.

Re: :memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 13.10.2011 09:31
von dige
Kiffi hat geschrieben:SQLite-:memory:-Datenbanken schnell und unkompliziert auf einen Datenträger speichern möchte:
Genial!!!!! :allright: Kann ich grad gut gebrauchen :)

Re: :memory:-Datenbank-Dump (schnell und unkompliziert)

Verfasst: 15.06.2012 16:20
von bobobo
Übrigens :
um Zugriffe auf festplattenbasierte SQLITE-DBs etwas zu beschleunigen
setzt man
PRAGMA journal_mode =MEMORY
an die sqliteDB ab