Laden...

SQL: Synchronisierung zweier Datenbanken

Erstellt von jHammer vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.154 Views
J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren
SQL: Synchronisierung zweier Datenbanken

verwendetes Datenbanksystem: (My)SQL(lite)

Hallo zusammen,

ich habe eine Frage.

Ich plane im Moment eine Anwendung für den örtlichen CVJM. (Selber Vorstandsmitgleid)
Bei dieser Anwendung soll es eine Onlinedatenbank geben. Diese wird wahrscheinlich MySQL werden. (Die neue Version 5.5 klingt ja ganz interessant)
Auf diese Datenbank greifen halt verschiedene Clients drauf zu und laden Daten hoch. Diese wird immer den aktuellsten Stand enthalten.
Für den Fall das einige Mitarbeiter längere Zeit keinen Internetzugang haben, soll es eine Offline-Datenbank geben. (Wahrscheinlich SQLite, für andere/bessere Alternativen bin ich immer offen)
Man soll einfach auf einen Button klicken und dann soll das Programm (wenn es möglich ist) die beiden Datenbanken synchronisieren. Beim ersten Sync ja noch kein Problem. Aber wie laufen die nächsten Syncs?

Gibt es SQL-seitig eine Möglichkeit dazu oder hat sonst irgendwer eine Idee, wie ich dieses Problem lösen kann?

Noch eine andere Frage hätte ich. Es sollen auch Daten gespeichert werden. (.doc oder PDFs)
Wie würdet ihr das machen? Die Dateien direkt in die Datenbank (mit BLOB, oder?) oder sollten in die Datenbank nur die Pfade zu den Dateien? (Dann wäre natürlich eine 100%ige Offlinefunktionalität nicht mehr gegeben.

Für jegliche Hilfe bin ich sehr dankbar.

Mit freundlichen Grüßen

jHammer

V
162 Beiträge seit 2010
vor 13 Jahren

HI,

Es gibt von Microsoft ein Sync Framework.

Um Datenbanken zu Syncen kannst du das Konzept hier finden.

Datein als Blob ist meine empfehlung.
Wobei mit dem Sync Framwork kannst du auch Datein direkt syncen.

Ich selber hab es noch nicht benutzt. Hier im Forum schrieben schon einige Positives da drüber.

MfG
Björn

Das Leben ist schön!

J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

Hallo,

ich bin mittlerweile mit der Entwicklung ein gutes Stück vorangeschritten. Aber jetzt hänge ich an einem dummen Fehler und weiß nicht, wie ich ihn beheben kann.

Ich habe gestern Nacht die Suchfunktion implementiert. Soweit auch kein Problem, aber ich kriege jedesmal eine Fehlermeldung "No Such Table: spiele." bzw beim Testen "No Such Table: in_out."

Das ist bestimmt nicht die allertollste Programmierung aber diesen Anspruch stelle ich auch nicht an mich, daher bitte nur bei der Fehlerbehebung helfen. Danke 😉

Der lange CommandText, der auskommentiert ist, ist normalerweise der richtige SELECT. Der "SELECT * FROM in_out;" ist nur zum Testen da.

Das komische an dem Fehler ist, dass er nur auftaucht, wenn ich nicht den Code "Zeile für Zeile (Einzelschritt)" durchgehe. (Also "Starten ohne Debugging")
Gehe ich ihn Zeile für Zeile durch, funktioniert alles wunderbar. Ich habe den SELECT-String auch schon von Hand in die Datenbank eingeben und er führt zum erwünschten Ergebnis.

Ich hoffe, ihr könnt mir helfen.


private void btn_search_Click(object sender, EventArgs e)
        {
            connect();
            sql_con.Open();
            sql_cmd = sql_con.CreateCommand();
            #region Strings & Bools
            string tb1_txt;
            string tb2_txt;
            string tb3_txt;
            string tb4_txt;
            #endregion
            #region Programmsuche
            if (tb_srch_name.Text != "")
            {
                tb1_txt = "AND sp_name LIKE '%" + tb_srch_name.Text + "%'";
            }
            else
                tb1_txt = "";
            if (tb_srch_stichwort.Text != "")
            {
                tb2_txt = "AND sp_stichworte LIKE '%" + tb_srch_stichwort.Text + "%'";
            }
            else
                tb2_txt = "";
            if (str_cb_spart_auswahl != "")
            {
                tb3_txt = "AND spielarten.spart_bez LIKE '%" + str_cb_spart_auswahl.ToLower() + "%'";
            }
            else
                tb3_txt = "";
            if (str_in_out != "")
            {
                tb4_txt = "AND in_out_id LIKE '%" + str_in_out + "%'";
            }
            else
                tb4_txt = "";
            //string CommandText = "SELECT spiel_id Spielnummer, sp_name Name,  spielarten.spart_bez Spielart FROM spiele, spielarten WHERE spiele.spart_id = spielarten.spart_id " + tb1_txt + tb2_txt + tb3_txt + tb4_txt + ";";
            string CommandText = "SELECT * FROM in_out;";
            DB = new SQLiteDataAdapter(CommandText, sql_con);
            DS.Reset();
            DB.Fill(DS);
            Grid.DataSource = DT;
            sql_con.Close();

            #endregion
        }
D
615 Beiträge seit 2009
vor 13 Jahren

Hallo jHammer

  1. Achtung SQL Injection
  2. ev. mal String Append oder String Format oder ähnliches anschauen 😉

Ich bin offengestanden kein SQL Experte aber seit wann hat ein SQL Command ein ";" ?

Beste Grüsse

Diräkt

J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

1.SQL Injection bei einer Embedded Datenbank? o0
Die Datenbank ist auf nur auf dem lokalen PC. Es werden keinen Daten übertragen.
2.Wie sollte mich das in irgendeiner Weise weiterbringen?

Bin mir auch grad nicht sicher, ob die gebräuchlichen SQL-Datenbanken ein Semikolon benötigen, aber SQLite benötigt es. Ohne das Semikolon wird der Befehl nicht abgeschickt und landet im Datennirvana.

J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

Problem behoben -.-

Ganz dummer Fehler meinerseits. Habe nicht bedacht, dass VS im "Nicht-Debug"-Modus auf den Release-Ordner zugreift und im Debug-Modus auf den Debug-Ordner zugreift.

Im Release-Ordner lag leider nicht dieselbe Datenbank, wie im Debug-Ordner.

Kopf->Tischplatte

L
770 Beiträge seit 2006
vor 13 Jahren

1.SQL Injection bei einer Embedded Datenbank? o0
Die Datenbank ist auf nur auf dem lokalen PC. Es werden keinen Daten übertragen.

Und? Auch in einer lokalen Datenbank gibt es DELETE, UPDATE usw.

lg Lion

J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

Und? Auch in einer lokalen Datenbank gibt es DELETE, UPDATE usw.
Was brächte es seine eigene Datenbank zu verändern? Natürlich könnte jemand böswilliges an den PC gehen und dann Daten verändern, aber da geb ich die Einhaltung einer gewissen Sicherheit an den PC-Inhaber ab. Für dieses kleine private Projekt ist es mir den Aufwand nicht wert.

Aber trotzdem würde es mich interessieren, wie ich denn falsche SQL-Statements in eine Abfrage, wo der selbsteingegebene String zwischen zwei %-Zeichen ist, einbinde?

Hinweis von gfoidl vor 13 Jahren

Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 2.3

L
770 Beiträge seit 2006
vor 13 Jahren

tb2_txt = "AND sp_stichworte LIKE '%" + tb_srch_stichwort.Text + "%'";

Wenn tb_srch_stichwort.Text z.B. folgendes wäre:
"sometext%'; DELETE * FROM ...;"

Für Sinn und Unsinn möchte ich gar nicht reden, ich meinte nur, möglich ist es.

€dit: Fehlerteufel entwischt.

lg Lion

J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 13 Jahren

Ok, das ist logisch. Da das Projekt nachher mal in eine Online-Lösung übergehen wird, werde ich mich dahingehend nochmal mit dem Thema genauer beschäftigen und solche Sicherheitsüberprüfungen einbauen.

Gibt es sonst noch irgendwelche Sicherheitsmerkmale auf die ich achten sollte?

L
416 Beiträge seit 2008
vor 13 Jahren

und solche Sicherheitsüberprüfungen einbauen.

Keine Überprüfungen einbauen sondern einfach Parameter verwenden:
[Artikelserie] Parameter von SQL Befehlen