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
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...
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.
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.
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.
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?
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...
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.)
>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?
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...
> 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.
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!
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.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang