Bequeme Datenbananbindung für SQLITE

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
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Bequeme Datenbananbindung für SQLITE

Beitrag von ProgOldie »

Hallo,
Ich habe versucht, eine bequeme Datenbankanbindung für SQLITE-DBs zu erstellen, bei der die Eingaben zuvor auf Korrektheit im Sinne der Typdefinitionen überprüft werden. Das ist für SQLITE-DBs aus mehreren Gründen besonders schwierig:
a) SQLITE kennt nur Typklassen
b) An die eigentliche CREATE-Definition kommt man nur mit einem Parser für die CREATE-Anweisung.
c) Manche Datentypen wie ENUM(alt,neu,gebraucht) lassen sich überhaupt nicht in CREATE eingeben.

Zwar kann man eine korrekte Typzuordnung mit sog. CONSTRAINTS in der DB-Definition erzwingen, doch sind bei einer Fehleingabe die Rückmeldungen über DatabaseError() oft recht schwer zu analysieren. ('Error near by ; ' ist wenig aussagekräftig)

Als Ausweg bleibt, zusätzlich zur Datenbankdefinition ein ListiconGadget mit speziellen Typdefinitionen zu definieren. In jede Zelle des Gadgets wird dann ein passendes Gadget eingebaut.
Beispiele für solche Gridtypen:
EDIT1: Hier öffnet sich ein Editorfenster.
PIC : Es erscheint ein Bildbetrachtungsfenster
URL : Es öffnet sich ein Webgadget zur Anzeige/Auswahl der Adresse.
ENUM: Eine Combobox mit Auswahlmöglichkeiten erscheint.

Am Beispiel der (sinnfreien) Tabelle 'Lager' der DB "DemoDB4.sqlite3" wird deutlich, wie dazu die recht wenigen, übersichtlichen Benutzerfestlegungen aussehen müssen:

Code: Alles auswählen

Define GridFont.i,GridWin.i,DBNum.i,TestGrid.Grid,Table.DBTable,actDB.DB
GridFont=LoadFont(#PB_Any,"Arial",8)

;Datenbank öffnen und Struktur in actDB speichern
openDB("DemoDB4.sqlite3",#PB_Database_SQLite,@actDB) 

; Window für Daten-(manipulation) erzeugen. Dabei ist "Lager" die Primärdatei
GridWin=createDataWin(50,100,1100,500,"Testwindow",@TestGrid,"Lager",GridFont) 


;Spalteneigenschaften des DataGrids definieren
; Aufruf: addGridCol(Grid,Spaltenbez,SpaltenTyp,Parameter,änderbar?,Spaltenbreite im Grid)
addGridCol(@TestGrid,@actDB,"ID","INTEGER","",0,20)     ;0: Werte dieser Spalte nicht änderbar (z.B. weil ID)
addGridCol(@TestGrid,@actDB,"Abbildung","PIC","",1,100)
addGridCol(@TestGrid,@actDB,"ausgemustert","BOOLEAN","",1,80) 
addGridCol(@TestGrid,@actDB,"Artikel","STRING","",1,80)            ;1: Spalteninhalt kann geändert werden
addGridCol(@TestGrid,@actDB,"Bemerkung","EDIT1","",1,100)          ;EDIT1:extra Editorfenster
addGridCol(@TestGrid,@actDB,"ArtikelNr","INTEGER","",1,60)
addGridCol(@TestGrid,@actDB,"Kaufdatum","DATE","",1,80)
addGridCol(@TestGrid,@actDB,"Zustand","ENUM","neu,gebraucht,wertlos",1,80)  ;ComboBox mit 3 Auswahlmöglichkeiten
addGridCol(@TestGrid,@actDB,"Bestand","INTEGER","",1,60)   
addGridCol(@TestGrid,@actDB,"Einzelpreis","FLOAT","",1,80) 
addGridCol(@TestGrid,@actDB,"Abverkauf","BOOLEAN","",1,70)  ;Für Boolean sind die Werte "JA,NEIN" vordefiniert
addGridCol(@TestGrid,@actDB,"WWW_Infos","URL","",1,80)

handleEvents(@actDB,@TestGrid)
CloseDatabase(actDB\DBNum)
Am Besten, ihr schaut euch die Lösung erst 'mal an. Da ich noch Vieles optimieren muss, zunächst einmal ein Link auf die EXE und die Beispieldatenbank. Da sind sicher noch Fehler und Verbesserungsmöglichkeiten vorhanden, darum das Ganze erst 'mal als EXE mit der zugehörigen Datenbank.

https://share.mailbox.org/ajax/share/07 ... e5/1/8/NTE

Ich wüsste gern, ob es sich eurer Meinung nach grundsätzlich lohnt, hier mehr Arbeit (als die bisherigen 1500 Zeilen) zu investieren.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Bequeme Datenbananbindung für SQLITE

Beitrag von Bisonte »

Nunja. Jetzt haben wir ein Problem

Man kann schlecht einen Code bewerten, optimieren helfen oder sehen was der macht, den man nicht sieht ;)
Eine .exe und eine DB sind da jetzt nicht wirklich hilfreich....
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
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Bequeme Datenbananbindung für SQLITE

Beitrag von ProgOldie »

Es geht mir darum, ob die Weiterarbeit an einer solchen Lösung überhaupt sinnvoll ist, weil ich mir sehr unsicher bin, ob das jemand außer mir überhaupt brauchen kann. Zur Beantwortung dieser meiner Frage braucht man die 1500 Zeilen Quelltext, in der ich selbst noch Unmengen von Problemfällen angemahnt und kommentiert habe, nicht.
Wenn hier die einhellige Meinung ist: Viel Arbeit, aber wozu? kann ich mir den Rest schenken.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
shim
Beiträge: 65
Registriert: 12.09.2004 23:09

Re: Bequeme Datenbananbindung für SQLITE

Beitrag von shim »

Hallo!

Sicherzustellen, das auch nur das in Datenbankfeldern landet, was auch reingehört ist immer eine sehr gute Idee :-).

Für mich gesprochen hieße das: Für kleine Tools könnte ich mir das sehr gut vorstellen, für größeres nutze ich meine eigene IDE die genau das bereits eingebaut hat und die Eingaben in Echtzeit repariert, bevor es zu einer Fehlermeldung kommt (obwohl SQLITE ja bekanntlich alles frißt...).

Viele Grüße
Windows 8.1 Pro 64 Bit | PB 5.31 x86
fabulouspaul
Beiträge: 120
Registriert: 01.04.2011 21:59

Re: Bequeme Datenbananbindung für SQLITE

Beitrag von fabulouspaul »

b) An die eigentliche CREATE-Definition kommt man nur mit einem Parser für die CREATE-Anweisung.
Ich verwende dafür das PRAGMA -Statement 'table_info()'.
Damit bekommt man eine Auflistung der Felder einer Tabelle und deren Datentyp und muss sich nicht mit der CREATE-Anweisung rumschlagen.
Für deine Beispieltabelle 'Lager' sieht das so aus:

Code: Alles auswählen

cid	name	type	notnull	dflt_value	pk
0	ID	INTEGER	0		1
1	Bemerkung	BLOB	0		0
2	Abbildung	BLOB	0		0
3	ausgemustert	TEXT	0	'NEIN'	0
4	Artikel	TEXT	0		0
5	ArtikelNr	INTEGER	0	0	0
6	Kaufdatum	INTEGER	0	CURRENT_DATE	0
7	Zustand	TEXT	0		0
8	Bestand	INTEGER	0	0	0
9	Einzelpreis	REAL	0	0.0	0
10	Abverkauf	TEXT	0	'NEIN'	0
11	WWW_Infos	TEXT	0		0
Ansonsten eine gute Idee! :allright:
Ein Tool, um einfach ein paar Werte in einer SQLite-DB anzupassen sicherlich nicht verkehrt.
Sobald jedoch mehrere Tabellen in Relation stehen, halte ich das eher für kritisch, weil man ggf. Inkonsistenzen erzeugt.
Antworten