Seite 1 von 1

Bequeme Datenbananbindung für SQLITE

Verfasst: 17.03.2018 14:57
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.

Re: Bequeme Datenbananbindung für SQLITE

Verfasst: 17.03.2018 15:19
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....

Re: Bequeme Datenbananbindung für SQLITE

Verfasst: 17.03.2018 15:27
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.

Re: Bequeme Datenbananbindung für SQLITE

Verfasst: 11.05.2018 08:22
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

Re: Bequeme Datenbananbindung für SQLITE

Verfasst: 07.06.2018 11:38
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.