Aktuelle Zeit: 06.06.2020 07:55

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Bequeme Datenbananbindung für SQLITE
BeitragVerfasst: 17.03.2018 14:57 
Offline
Benutzeravatar

Registriert: 19.05.2012 17:09
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:
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/07ca6fc302d2e24c786610e2d2e2454784ca1a49df8149e5/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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Bequeme Datenbananbindung für SQLITE
BeitragVerfasst: 17.03.2018 15:19 
Offline
Benutzeravatar

Registriert: 01.04.2007 20:18
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 5.72 LTS (Windows x86/x64) | Windows10 Pro x64 | Z370 Extreme4 | i7 8770k | 32GB RAM | iChill GeForce RTX 2080 Super | HAF XF Evo​​


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Bequeme Datenbananbindung für SQLITE
BeitragVerfasst: 17.03.2018 15:27 
Offline
Benutzeravatar

Registriert: 19.05.2012 17:09
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Bequeme Datenbananbindung für SQLITE
BeitragVerfasst: 11.05.2018 08:22 
Offline

Registriert: 12.09.2004 23:09
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Bequeme Datenbananbindung für SQLITE
BeitragVerfasst: 07.06.2018 11:38 
Offline

Registriert: 01.04.2011 21:59
Zitat:
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:
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye