MySQL oder SQLite
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
MySQL oder SQLite
Hallo,
ich habe ein Programm mit Hilfe von QT erstellt, welches mir Daten aus einer Onlinedatenbank (MySQL) darstellt. Weiters können die Daten auch modifiziert werden.
Nun möchte ich das Programm mit einer "Lokalen Datenbank" erweitern, für den Fall, dass der User vorübergehend keine Internetverbindung hat. Als übergangslösung habe ich am Client einen MySQLServer eingerichtet und spiele immer händisch die Dumps ein.
Als mögliche Lösung hätte ich folgende 2 Ideen für dieses Problem:
Lösung 1: MySQL Server bleibt und das Dumpenund einspielen wird durch das Programm erledigt (Falls dies überhaupt möglich ist?)
Lösung 2: SQLite DB am Client einrichten und Daten vom Server einspielen.
Meine Fragen an euch:
Wie kann ich eine MySQL Datenbank mit QT am Besten eine DB offline bereitstellen?
Wie könnte ich einen gegenseitige Synchronisierung realisieren? (2nd Order)
Bin für jeden innovativen Vorschlag offen.
ich habe ein Programm mit Hilfe von QT erstellt, welches mir Daten aus einer Onlinedatenbank (MySQL) darstellt. Weiters können die Daten auch modifiziert werden.
Nun möchte ich das Programm mit einer "Lokalen Datenbank" erweitern, für den Fall, dass der User vorübergehend keine Internetverbindung hat. Als übergangslösung habe ich am Client einen MySQLServer eingerichtet und spiele immer händisch die Dumps ein.
Als mögliche Lösung hätte ich folgende 2 Ideen für dieses Problem:
Lösung 1: MySQL Server bleibt und das Dumpenund einspielen wird durch das Programm erledigt (Falls dies überhaupt möglich ist?)
Lösung 2: SQLite DB am Client einrichten und Daten vom Server einspielen.
Meine Fragen an euch:
Wie kann ich eine MySQL Datenbank mit QT am Besten eine DB offline bereitstellen?
Wie könnte ich einen gegenseitige Synchronisierung realisieren? (2nd Order)
Bin für jeden innovativen Vorschlag offen.
Zum einen beherrscht MySQL Replikation (auch Multi-Master).
Warum sollte dies nicht möglich sein? Beschäftige dich doch bitte auch mit deiner Datenbank-Doku...MySQL Server bleibt und das Dumpenund einspielen wird durch das Programm erledigt (Falls dies überhaupt möglich ist?)
Datenmenge, Fremdschlüsselverwendung, Synchronisierung in beide Richtungen notwendig? Hat aber eigentlich alles nichts mehr mit Qt zu tun...Wie kann ich eine MySQL Datenbank mit QT am Besten eine DB offline bereitstellen?
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Mir ist schon klar, dass dieses Thema nicht unbedingt in dieses Forum passt. Ich dachte nur, dass vielleicht ein erfahrerner Programmieren einige Ideen dazu hat bevor ich mich in ein Fass ohne Boden stürtze.
Ich habe eine Relatationale MySQL DB. Die Datenmenge ist momentan mit 1MB (mysqlDump) noch sehr gering, wird aber in den nächsten Jahren auch nicht über 15MB steigen.
Die Synchronisierung wäre in beide Richtungen toll, auch wenn das nur über den TimeStamp geht. Glaube aber, dass dieser Aufwand nicht dafür steht.
Vielmehr geht es mir darum, dass der Anwender eine fertige MSI oder EXE bekommt die er installiert oder ausführt und alles Funktioniert.
Das Problem ist, dass ich nicht auf jeden Client MySQL Server installieren und einrichten möchte -> Daher die Idee mit SQLite.
Wie funktionieren denn grundlegend, Datenbank basierende Server-Client Applikationen. Mir fehlt im Moment einfach ein Ansatz wie ich an die Sache angehe.
Ich habe eine Relatationale MySQL DB. Die Datenmenge ist momentan mit 1MB (mysqlDump) noch sehr gering, wird aber in den nächsten Jahren auch nicht über 15MB steigen.
Die Synchronisierung wäre in beide Richtungen toll, auch wenn das nur über den TimeStamp geht. Glaube aber, dass dieser Aufwand nicht dafür steht.
Vielmehr geht es mir darum, dass der Anwender eine fertige MSI oder EXE bekommt die er installiert oder ausführt und alles Funktioniert.
Das Problem ist, dass ich nicht auf jeden Client MySQL Server installieren und einrichten möchte -> Daher die Idee mit SQLite.
Wie funktionieren denn grundlegend, Datenbank basierende Server-Client Applikationen. Mir fehlt im Moment einfach ein Ansatz wie ich an die Sache angehe.
Lager deinen Daten-zugriff komplett in nen Plugin aus ...
erstell ein plugin fuer mysql, wo er sich inpliziet an nem vorhandenen server anmelden kann / muss
erstell nen plugin fuer SQLite wo er statt ner anmeldung vielleicht nen db -file angeben muss
zumindest nach deiner beschreibung der am besten geeignete weg ....
ne lokale DB (SQLite) mit ner zentralen DB (mysql) abgleichen so das user teilweisse offline arbeiten koennen, ist ned trivial, und wenn ich richtig verstanden hab auch ned was du brauchst ...
Ciao ...
erstell ein plugin fuer mysql, wo er sich inpliziet an nem vorhandenen server anmelden kann / muss
erstell nen plugin fuer SQLite wo er statt ner anmeldung vielleicht nen db -file angeben muss
zumindest nach deiner beschreibung der am besten geeignete weg ....
ne lokale DB (SQLite) mit ner zentralen DB (mysql) abgleichen so das user teilweisse offline arbeiten koennen, ist ned trivial, und wenn ich richtig verstanden hab auch ned was du brauchst ...
Ciao ...
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Danke für die rasche Antwort,
du hast mein Problem richtig Verstanden!
Mir geht es nur darum, dass die Anwender Offline Arbeiten (Daten ansehen können). Bearbeiten wird einfach deaktiviert, da ein Abgleich zurück in die OnlineDatenbank (MySQL) meine beschränkten Fähigkeiten übersteigt ...
Ich habe auch soweit schon beide PlugIns bereit. Mit dem Mysql PlugIn verbinde ich mich zur Online Datenbank und lasse mir die Daten über QSqlTableModel in einer QTableView anzeigen.
Auch das SQLite PlugIn funktioniert soweit. Ich habe eine lokale *.db3 Datei erstellt und bereits das Schema angelegt.
Nur wie bekomme ich nun die Daten in die lokale SQLite Datei???
Soll ich die QTableView einfach in die SQLite Datei speichern oder kann ich das auch im Hintergrund erledigen? Vielleicht die Daten in einem
du hast mein Problem richtig Verstanden!
Mir geht es nur darum, dass die Anwender Offline Arbeiten (Daten ansehen können). Bearbeiten wird einfach deaktiviert, da ein Abgleich zurück in die OnlineDatenbank (MySQL) meine beschränkten Fähigkeiten übersteigt ...
Ich habe auch soweit schon beide PlugIns bereit. Mit dem Mysql PlugIn verbinde ich mich zur Online Datenbank und lasse mir die Daten über QSqlTableModel in einer QTableView anzeigen.
Auch das SQLite PlugIn funktioniert soweit. Ich habe eine lokale *.db3 Datei erstellt und bereits das Schema angelegt.
Nur wie bekomme ich nun die Daten in die lokale SQLite Datei???
Soll ich die QTableView einfach in die SQLite Datei speichern oder kann ich das auch im Hintergrund erledigen? Vielleicht die Daten in einem
Dann langt dir doch nen tool , das nur du hasst.Mir geht es nur darum, dass die Anwender Offline Arbeiten (Daten ansehen können).
Was ne verbindung zu deiner mysql datenbank oeffnet, und die daten in die sqlite db spult ... das sqlite file mit den statischen daten verteilst dann einfach mit.
Deine user muessen doch ned in die db schreiben ...
Irgendwo pflegst dann noch ne aktuelle version deiner statischen sqlite datei, die sich die user bei bedarf updaten koennen ....
wo ist das problem ?
Ciao ...
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Die Benutzer können in der Online - Version Daten bearbeiten
In der Offline Version dürfen nur angesehen werden...
Soweit so gut.
Das Programm entscheidet zu beginn ob eine Verbindung mit der Online DB besteht, wenn nicht wird die lokale SQLite Datei verwendet.
Soweit so gut.
Mein Problem ist folgendes:
Wie bekomme ich in einem QT Programm Daten von einer MySQL Datenbank in eine SQLite Datei?
Ich habe ein wenig gegoogelt und festgestellt, dass dies nicht so einfach ist. Meistens ist hier ein umweg über ein Perl Script notwendig.
Meine Idee war es die MySQL Daten in eine QTableView zu packen und dann die Daten einfach von der QTable in das SQLite File zu schreiben. Beides über die QSqlDatabase Klasse. Zum erstellen der Daten im QTabelView würde ich die QMYSQL Treiber verwenden und zum schreiben von der QTableView in das *.db3 File würde ich die QSQLITE Treiber verwenden.
Geht das so? oder gibts einen einfacheren Weg?
In der Offline Version dürfen nur angesehen werden...
Soweit so gut.
Das Programm entscheidet zu beginn ob eine Verbindung mit der Online DB besteht, wenn nicht wird die lokale SQLite Datei verwendet.
Soweit so gut.
Mein Problem ist folgendes:
Wie bekomme ich in einem QT Programm Daten von einer MySQL Datenbank in eine SQLite Datei?
Ich habe ein wenig gegoogelt und festgestellt, dass dies nicht so einfach ist. Meistens ist hier ein umweg über ein Perl Script notwendig.
Meine Idee war es die MySQL Daten in eine QTableView zu packen und dann die Daten einfach von der QTable in das SQLite File zu schreiben. Beides über die QSqlDatabase Klasse. Zum erstellen der Daten im QTabelView würde ich die QMYSQL Treiber verwenden und zum schreiben von der QTableView in das *.db3 File würde ich die QSQLITE Treiber verwenden.
Geht das so? oder gibts einen einfacheren Weg?
Also willst du doch online abgleichen .... ?
Warum dann der weg ueber das view ?
einfach daten von der einen connection (mysql) holen, und mit den daten in der anderen connection(sqlite) vergleichen, und bei bedarf updaten ...
Dazu kann man gut die sqlklassen von qt verwenden ...
aber programmieren musst die logic schon selber, wobei man da viel recht generisch halten könnte ...
Ciao ...
Warum dann der weg ueber das view ?
einfach daten von der einen connection (mysql) holen, und mit den daten in der anderen connection(sqlite) vergleichen, und bei bedarf updaten ...
Dazu kann man gut die sqlklassen von qt verwenden ...
aber programmieren musst die logic schon selber, wobei man da viel recht generisch halten könnte ...
Ciao ...
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Tut mir leid wenn ich mich undeutlich ausdrücke.
Ich habe mir nun folgende Lösung ausgedacht:
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
Wie kann ich zwei Connections aufbauen und dann jeweils ansprechen? Ich habe gegooglet und festgestellt, dass dies mit dem ConnectionName zusammenhängt.
Aber warum funktioniert dies nicht:
QT DOKU :
QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )
ANGEWENDET:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",QLatin1String("test"));
Folgende Fehlermeldung:
QSqlQuery::exec: database not open
Ich habe mir nun folgende Lösung ausgedacht:
- - Die Daten der SQLite können nicht verändert werden.
- Sobald eine Verbindung aufgebaut werden kann sollen die Daten abgeholt werden.
- Ich erstelle dazu zwei Verbindungen.
- Lese die Daten von der MySQL DB mit QSQLQUERY (SELECT) aus
- Schreibe die Daten in das SQLite File mit QSQLQUERY
NSERT)
QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.
Wie kann ich zwei Connections aufbauen und dann jeweils ansprechen? Ich habe gegooglet und festgestellt, dass dies mit dem ConnectionName zusammenhängt.
Aber warum funktioniert dies nicht:
QT DOKU :
QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )
ANGEWENDET:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",QLatin1String("test"));
Folgende Fehlermeldung:
QSqlQuery::exec: database not open
Code: Alles auswählen
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("HOST");
db.setDatabaseName("DBNAME");
db.setUserName("USER");
db.setPassword("PW");
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Verbindung zur Onlinedatenbank fehlgeschlagen!"),
qApp->trUtf8("Es ist nicht möglich eine Verbindung zur Onlinedatenbank aufzubauen.\n");
return false;
}
return 1;
}
static bool createConnectionSQLite()
{
QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE");
db1.setDatabaseName("emp.db3");
if (!db1.open()) {
QMessageBox::warning(0, QObject::tr("Database Error"),
db1.lastError().text());
return false;
}
return true;
}
Zuletzt geändert von pfusterschmied am 4. März 2008 17:01, insgesamt 1-mal geändert.
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Sorry, steh heute total neben mir:
Dies ist der ursprüngliche Code, hab es so getestet:
Dies ist der ursprüngliche Code, hab es so getestet:
Code: Alles auswählen
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",QLatin1String("online"));
db.setHostName("HOST");
db.setDatabaseName("DBNAME");
db.setUserName("USER");
db.setPassword("PW");
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Verbindung zur Onlinedatenbank fehlgeschlagen!"),
qApp->trUtf8("Es ist nicht möglich eine Verbindung zur Onlinedatenbank aufzubauen.\n");
return false;
}
return 1;
}
static bool createConnectionSQLite()
{
QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE",QLatin1String("offline"));
db1.setDatabaseName("emp.db3");
if (!db1.open()) {
QMessageBox::warning(0, QObject::tr("Database Error"),
db1.lastError().text());
return false;
}
return true;
}
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Ich habe beide DB Connections getrennt angesehen.
Bei beiden kommt es zu dieser Fehlermeldung, wenn:
Aber der ConnectionName hat ja nichts mit der db.setDatabaseName("DBNAME"); zu tun, oder?
Bei beiden kommt es zu dieser Fehlermeldung, wenn:
Code: Alles auswählen
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",QLatin1String("online")); // funktioniert nicht
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // funktioniert
-
pfusterschmied
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Ahhh...
Jetzt bin ich ja extrem lange auf dem Schlauch gestanden.
Danke upsala für den Tip mit der QSqlQuery.
Nun habe ich es:
Jetzt bin ich ja extrem lange auf dem Schlauch gestanden.
Danke upsala für den Tip mit der QSqlQuery.
Nun habe ich es:
Code: Alles auswählen
QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE","offline1");
QSqlQuery myEPTermQuery = QSqlQuery(db1);