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...
Andreas M. schrieb: > drei Klicks in der Weboberfläche... Schon richtig, aber eine DB will dann auch gewartet werden (und vor allem gesichert...)
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.