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

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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.
Zuletzt geändert von Kiffi am 12.10.2011 21:58, insgesamt 2-mal geändert.
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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...
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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:
a²+b²=mc²
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dige
Beiträge: 1242
Registriert: 08.09.2004 08:53

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

Beitrag 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 :)
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

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

Beitrag von bobobo »

Übrigens :
um Zugriffe auf festplattenbasierte SQLITE-DBs etwas zu beschleunigen
setzt man
PRAGMA journal_mode =MEMORY
an die sqliteDB ab
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten