Forum: PC-Programmierung Einfache Datenbank mit Qt (SQL)


von Michael (Gast)


Lesenswert?

Hallo,

ich arbeite gerade an einem Programm in Qt, welches es erlaubt 
(Mess-)Daten in eine Tabelle einzutragen und die Tabelle anschließend 
einer Person zuzuordnen.
Aktuell verwende ich die QDataStream Klasse um die Daten einer Tabelle 
als Datei abspeichern zu können (PersonXY_12345.datei) und anschließend 
auch wieder hineinladen zu können.

Ich würde das ganze jetzt gerne mit einer richtigen Datenbank 
realisieren, aber leider fehlt mir die Erfahrung wie ich das ganze 
effizient umsetzen kann.

Im Grunde soll das Programm die Möglichkeit bieten Personen in die 
Datenbank aufzunehmen und anschließend der Person Messtabellen zuordnen 
zu können, welche auch in der Datenbank gespeichert werden.

Die Umsetzung in Qt mit den Klassen QSqlDatabase und QSqlTableModel 
sollte eigentlich machbar sein.

Nun hätte ich einige Fragen bezüglich der eigentlichen Datenbank:

- SQL ist ja nur die "Datenbanksprache", welche Datenbank bzw. welches 
Programm würded ihr mir empfehlen?

- Ideal wäre es wenn die Nutzer auf die Datenbank von verschiedenen PCs 
aus zugreifen können (im selben Netzwerk), wie kann man das realisieren?

- Ich möchte das Tool anschließend ausführbar weitergeben (als .exe + 
die nötigen Dlls), wie geht das dann mit der Datenbank?

Vielen Dank für eure Hinweise.

LG

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

SQlite könnte für dich interessant sein (und da gibts auch Qt Bindings 
dafür)

Aber es könnte sich mit der Anforderung "Zugriff von mehreren PCs" 
beissen, ich weiss nicht ob sich da in den letzten jahren was getan hat.

Grundsätzlich ist SQLite aber ein richtig "cooles" Stück Software...

von Noch einer (Gast)


Lesenswert?

Da solltest du locker mit den grundlegenden SQL Befehlen auskommen. Du 
kannst später die Datenbank austauschen.

Du kannst auch ein Programm für mehrere Datenbanksysteme schreiben. Ein 
Einzelplatzsystem benutzt die SQLite, Mehrbenutzersysteme müssen eine 
Mysql installieren.

Das tolle an der SQLite - du brauchst keinen Datenbankserver 
installieren. Dein Programm kann die Datenbank selbst anlegen. Musst nur 
dein Programm und die DLLs installieren. "Zugriff von mehreren PCs" -- 
gibt so viele Probleme, irgendwann gibst du es auf.

von Andreas M. (amesser)


Lesenswert?

Michael schrieb:
> Hallo,
>
> Ich würde das ganze jetzt gerne mit einer richtigen Datenbank
> realisieren, aber leider fehlt mir die Erfahrung wie ich das ganze
> effizient umsetzen kann.
>
> Im Grunde soll das Programm die Möglichkeit bieten Personen in die
> Datenbank aufzunehmen und anschließend der Person Messtabellen zuordnen
> zu können, welche auch in der Datenbank gespeichert werden.

Ich würde, wie Du auch ein SQL basiertes System einsetzen. Allerdings 
legt man da normalerweise nicht eine Tabelle Pro Person an, sondern:

- Eine Tabelle für die Personen, mit einer Id Spalte (Primary Key, 
Ganzzahl, Autoincrement, Unique)
- Eine Tabelle in die die Messwerte kommen (+ Datum, Zeit..) und einer 
Spalte die auf die Id Spalte der Personentabelle referenziert.

Dann kann man ganz einfach per SQL sich die Tabellen filtern, 
verarbeite, auslesen.

> - SQL ist ja nur die "Datenbanksprache", welche Datenbank bzw. welches
> Programm würded ihr mir empfehlen?

Ich glaube Qt kann verschiedene "Backends" Man gibt beim Öffnen der 
Verbindung an, was man will. Für erste Tests würde ich SQLite nehmen, 
der "SQL-Server" ist dann Bestandteil deinses Programms, Die Daten 
werden in einer einzelnen Datei abgelegt.

> - Ideal wäre es wenn die Nutzer auf die Datenbank von verschiedenen PCs
> aus zugreifen können (im selben Netzwerk), wie kann man das realisieren?

Wenn dein Program funktioniert kannst Du dann einen echten SQL Server 
aufsetzen. Dieser kann dann über ein beliebig komplexes Netzwerk 
(Internet, Lokales LAN,...) angesprochen werden, in deinem Program 
ändert sich dabei nur das Öffnen der Verbindung. Der Rest bleibt gleich. 
Kostenlose SQL Server sind z.B. MariaDB.

> - Ich möchte das Tool anschließend ausführbar weitergeben (als .exe +
> die nötigen Dlls), wie geht das dann mit der Datenbank?

Du kannst es ja auswählbar machen: SQLite oder Externer Server 
(Verbindungsdialog). Dann muss der Anwender halt einen SQL Server 
aufsetzen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Gäbe es den Wunsch "Zugriff von mehreren PCs" nicht, wäre SQLite ein 
Kandidat.

Der simultane Zugriff durch mehrere Clients aber ist keine Stärke von 
SQLite. Da ist dann ein "richtiger" Datenbankserver angesagt.

Kandidaten dafür:
MySQL bzw. das eng verwandte MariaDB oder PostgreSQL. Sind frei 
verfügbar, gut dokumentiert und auf allen möglichen Plattformen zu 
Hause.

von Andreas M. (amesser)


Lesenswert?

Noch einer schrieb:

> dein Programm und die DLLs installieren. "Zugriff von mehreren PCs" --
> gibt so viele Probleme, irgendwann gibst du es auf.

Was genau für Probleme sollen denn da auftreten?

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Rufus Τ. F. schrieb:
> Gäbe es den Wunsch "Zugriff von mehreren PCs" nicht, wäre SQLite ein
> Kandidat.

Präziser wäre vielleicht "Schreibzugriff von mehreren PCs". Wenn nur 
einer schreibt, die anderen primär lesen, könnte es robust 
funktionieren. Offensichtlich hat sich in SQLite 3 da einiges getan: 
https://www.sqlite.org/lockingv3.html

Der Schritt zu einem "richtigen" DB-Server ist meistens ein größerer...

von Clemens L. (c_l)


Lesenswert?

Andreas M. schrieb:
>> "Zugriff von mehreren PCs" -- gibt so viele Probleme, irgendwann gibst
>> du es auf.
>
> Was genau für Probleme sollen denn da auftreten?

Theoretisch funktioniert es. In der Praxis: siehe 
http://www.sqlite.org/howtocorrupt.html#_file_locking_problems. (So ein 
ranziges Netzwerk-Dateisystem findet man oft in einem NAS, oder in dem 
Host-Zugriff von virtuellen Maschinen.)

von Noch einer (Gast)


Lesenswert?

>Theoretisch funktioniert es. In der Praxis

Mysql ist auch schnell installiert. Programm lässt sich auch so anlegen, 
dass es mit unterschiedlichen Datenbanken zurechtkommt.

Warum sollten wir uns da mit Administration und Workarounds herum 
ärgern?

von Andreas M. (amesser)


Lesenswert?

Clemens L. schrieb:
> Theoretisch funktioniert es. In der Praxis: siehe
> http://www.sqlite.org/howtocorrupt.html#_file_locking_problems. (So ein
> ranziges Netzwerk-Dateisystem findet man oft in einem NAS, oder in dem
> Host-Zugriff von virtuellen Maschinen.)

Und was genau hat das mit SQL zu tun? Das ist ein Problem der SQLite 
Implementierung/der Netzwerkdateisysteme. Für diesen Zweck war SQLite 
ursprünglich auch nie gedacht.

Für Mehrbenutzersysteme sollte man immer einen "echten" SQL Server 
verwenden. Sowas einzurichten ist keine Magie, man muss sich halt ein 
bischen einlesen. Die meisten "Home"-NAS können das heute auch schon, 
drei Klicks in der Weboberfläche...

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Andreas M. schrieb:
> drei Klicks in der Weboberfläche...

Schon richtig, aber eine DB will dann auch gewartet werden (und vor 
allem gesichert...)

von Noch einer (Gast)


Lesenswert?

> Und was genau hat das mit SQL zu tun?

Das geniale an SQL -- die verschiedenen Datenbanken sind sich soweit 
ähnlich, dass du sie nachträglich austauschen kannst.

Die Diskussion, ob SQLite alle Anforderungen abdeckt, ist überflüssig. 
Wenn es nichts gibt, was sowohl Demos, Einzelplatz- und 
Mehrbenutzer-Systeme abdeckt, legt man das Programm so an, dass der 
Benutzer zwischen SQLite und DB-Server entscheiden kann.

von Michael (Gast)


Lesenswert?

Hallo,

vielen Dank für eure Antworten!
Ich verwende jetzt SQLite und bin sehr zufrieden damit.

Hätte jemand einen Tipp wie man folgendes Problem am einfachsten löst:

In Qt erzeuge ich (basierend auf einem .xml file) eine Tabelle in diese 
der Benutzer Daten eintragen kann. Manche Felder sind editierbar, manche 
nicht.
Außerdem enthält jede Zeile auch eine CheckBox mit der man die Zeile 
"deaktivieren" kann.

Später soll der Nutzer aus einer Reihe "default tables" auswählen können 
und Daten eintragen.

Ich möchte die fertig ausgefüllte Tabelle (nur die aktivierten Zeilen) 
in meiner Datenbank speichern und auch später wieder laden/editieren 
können.

Wie mache ich das am einfachsten?

Natürlich kann ich jede einzelne Zelle abfragen und mir manuell die 
dazugehörigen Einträge in der Datenbank erstellen. Ich glaube aber dass 
es da eine einfachere Möglichkeit geben muss.

Mit der Klasse "QSqlTableModel" kann man sich einfach eine Tabelle mit 
den Daten der Datenbank erstellen. Gibt es da nicht auch eine einfache 
Möglichkeit eine Tabelle (bzw. das Model) direkt in die Datenbank 
speichern zu können? (Also den umgekehrten Weg)

Vielen Dank!

von Dirk (Gast)


Lesenswert?

Hallo, ich würde das Projekt aufteilen, weil es zur Pflege der Datenbank 
und Zugriff etc. immer kommen wird und alle Clients updaten ist wirklich 
nervig bzw. die Schlümpfe, welche das Update nicht installiert haben.

1. QT Applikation (Client):

Buisnesslogic etc.

2. Host Applikation

Anbindung zur Datenbank und bietet alle Services um die nötigen Daten 
aufzubereiten, Repository Pattern etc.

Die Clients nutzen dann nur die Servicemethoden, welche vorher definiert 
wurden.

3. Datenbank

MySQL, MSSQL etc. jenachdem welche Datenbank deine Anforderungen 
erfüllt.
Trigger, Constraints, SQL Functions falls welche benötigt werden.

>In Qt erzeuge ich (basierend auf einem .xml file) eine Tabelle in diese
>der Benutzer Daten eintragen kann. Manche Felder sind editierbar, manche
>nicht.
>Außerdem enthält jede Zeile auch eine CheckBox mit der man die Zeile
>"deaktivieren" kann.

Der Weg wäre etwas anders meiner Meinung nach.

Du erstellt deine Tabelle mit deinen Datentypen (bool,...) in der 
Datenbank , daraus kann man relativ einfach mit EntityFramework eine 
Klasse mit Properties erzeugen.

Die Klasse(n) können in der Hostapplikation genutzt werden um die Daten 
in die Datenbank zu speichern.

Die Client App. bietet die Eingabemaske der Form zzgl. Validierung. In 
der Client App. kannst Du natürlich auch XML File auswählen und mit den 
Servicemethoden der Hostapp geben und in die Datenbank schreiben.

von Dirk (Gast)


Lesenswert?

Edit:

Entity Framework bietet zwei Möglichkeiten DatabaseFirst oder CodeFirst.
Bitte daran denken Entity Framework ist für C# (.net).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.