Laden...

2 Forms/Usercontrols -> Datenbank Änderungen

Erstellt von thepixel vor 16 Jahren Letzter Beitrag vor 13 Jahren 4.707 Views
T
thepixel Themenstarter:in
219 Beiträge seit 2007
vor 16 Jahren
2 Forms/Usercontrols -> Datenbank Änderungen

Hallo!

Mich beschäftigt ein Problem schon länger:

Zwei Forms mit Databound Elementen ändern etwas an der Datenbank. Im Urzustand kriegt z.B. Form 2 diese Änderung erst nach einem Neustart der Anwendung mit, also wenn z.B. der Tableadapter.Fill erneut aufgerufen wird.

Wie kann ich erreichen, dass die Änderungen sofort auf die zweite Form übernommen werden? Habe schon versucht, Form 1 in Form 2 zu instanzieren und mit den entsprechenden Bindingsource/Tableadapter der 1. Form zu arbeiten. Leider ohne Erfolg. Ein Rat hierzu, evtl auch mit einem Stück Code, wäre mir sehr hilfreich!

Lg, thepixel

Mfg, Christian

2.187 Beiträge seit 2005
vor 16 Jahren

Die erste Möglichkeit wäre Form1 und Form2 auf die gleichen .NET-Objekte gebunden würden.

Eine andere möglichkeit ist, dass ein Thread die ganze Zeit die Datenbank überwacht und Änderungen an die Form2 meldet. (Das ist warscheinlich absolut nicht performant!)

T
thepixel Themenstarter:in
219 Beiträge seit 2007
vor 16 Jahren

Hallo,

und wie binde ich beide dann an dasselbe .Net Objekt?

Gruß

Mfg, Christian

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo thepixel,

ich denke, JuyJuka meint, indem du dasselbe DataSet bei beiden Zuweisung an DataSource verwendest.

herbivore

T
thepixel Themenstarter:in
219 Beiträge seit 2007
vor 16 Jahren

Hallo,

ok, das mache ich sowieso. Dennoch wird der Forminhalt, also z.B. ein DataGridView, erst geupdatet, wenn Tableadapter.Fill erneut aufgerufen wird. Und: Nein, Currencymanager.refresh hilft auch nicht.

Gruß & gute Nacht,

thepixel

Mfg, Christian

T
thepixel Themenstarter:in
219 Beiträge seit 2007
vor 16 Jahren

Guten Morgen,

ist mein Problem so ungewöhnlich? Hatte noch niemand dieses Problem, dass man ein zweites Fenster öffnet, dort Eingaben macht die in der DB gespeichert werden, das Fenster schliesst und dann diese Änderungen im ursprünglichen Form sichtbar werden sollen? Ich hab echt keine Idee mehr dazu.
Bisher behelfe ich mir mit so unschönen Sachen wie: Beim Mouse Enter Event z.B. eines DataGridViews wird die Fill-Methode des Tableadapters aufgerufen.

Gruß,

thepixel

Mfg, Christian

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo thepixel,

nein, ungewöhlich ist es nicht, ganz im Gegenteil. Und mir fallen sofort eine Menge Lösungen ein, z.B. ein eigenes Event. Nur kenne ich mich mit DataBindng nicht so aus und weiß nicht, ob es dort eine direkte Unterstützung gibt.

herbivore

268 Beiträge seit 2008
vor 13 Jahren

Hallo,
Hab genau das selbe Problem. Also es wird ++das gleiche ++Programm 2x (auf verschiedenen Rechnern) aufgerufen. Die DB liegt in einem Netzlaufwerk auf das beide zugriff haben. Nun macht Programm B eine änderung. Wie weiß nun Programm A (ohne alle 10sec nach änderungen zu schauen) das Programm B was geändert hat ?
Gruß Christopher

Name: Scarecraft
Language:C#
learning since:winter 2007
IDE: Visual Studio 2005/08 Professional Editon
Skill:Medium
qualifications: MCP - Microsoft Certified Professional
Homepage : FX RPG Maker

2.298 Beiträge seit 2010
vor 13 Jahren

Hm, ganz ohne nachzusehen ob eine Änderung vorgenommen wurde, wird das wohl nicht funktionieren.

Ansonsten müsstest du noch eine Kommunikation Zwischen Programm A & Programm B herstellen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

268 Beiträge seit 2008
vor 13 Jahren

Mh..Hatte ich schon befürchtet. Dachte es gäbe evtl. ein Datenbank event oder trigger der ein Event meines Programms ansprechen kann oder sowas in der art. Nunja , da ich aber nicht weiß wann es eine änderung gibt werd ich wohl alle 10sek oder so nachschauen.

Das Problem beim Programmen miteinander reden lassen ist das ich nie weiß wieviele das Programm aufaben, auf welchen rechner es läuft usw. da ist es angenehmer lieber einpaar mal nachzuschauen.

Danke dir
nur schade das es net geht..

Name: Scarecraft
Language:C#
learning since:winter 2007
IDE: Visual Studio 2005/08 Professional Editon
Skill:Medium
qualifications: MCP - Microsoft Certified Professional
Homepage : FX RPG Maker

T
381 Beiträge seit 2009
vor 13 Jahren

In diesem Fall gibt es verschiedene Ansätze.
Wenn ein Programm auf die Tabelle zugreift, wird diese Gepserrt. Es gibt verschiedene Sperren. Exclusive: Niemand kann lesen / schrieben oder shared: andere Verbindungen haben nur Lesezugriff. Die Sperren sollte die Datenbank können. Dabei muss man sich allerdings auch einige Gedanken über mögliche Deadlocks machen.

Wenn beide Programm auf die DB zugreifen können und Schreibzugriff haben, sollte vor dem Schreiben überprüft werden ob sich die DB geändert hat. Eventuell ein Tiemstamp in der DB speichern (TableXLastCahnged), oder wirklich nochmal alle geänderten Daten abfragen und die Konsistenz prüfen.
Den Timestamp aber natürlich niemals mit lokaler Zeit eines Rechners vergleichen 😉

Alle 10 Sekunden updaten reicht nicht wenn 5 Sek zwischen Änderung von Programm A und Änderung von Programm B liegen. In diesem Fall überschreibt Programm B die Änderung von Programm A ohne Notiz davon zu nehmen.

Das Ursprüngliche Problem, also 2 Forms eines Programms synchronisieren, lässt sich natürlich auch Programm intern lösen. Aber da hab ich leider auch noch zu Wenig Erfahrung mit DataBindings.

T
381 Beiträge seit 2009
vor 13 Jahren

Hab mich endlich mal mit Datenbanken und DataBindings beschäftigt und einige Erfolge gehabt, hier mein Resultat.

Die Lösung für eine Anwendung hab ich. Eigentlich wie man es erwartet.

Das Problem mit 2 Anwendungen auf einer Datenbank wird hier nicht gelöst.

Kleine Erklärung:
DataManager ist als Statische Klasse realisiert und stellt alle Nötigen Datenklassen bereit, sowie eine Update Funktion.

Das DataSet, sowie der DataTableAdapter sind mit dem Designer erstellt und beinhalten den Code für die Datenbankverbindung, CRUD Befehle, AutoInc für die ID und die Schemainformation der DB.
Eventuell noch etwas von dem ich grade nichts weiß 😉

Die Forms beinhalten nur eine DataSource welche an die DataTable vom DataManager gebunden werden. Ändert sich etwas an der DataTable wird alles in der Anwendung aktualisiert.

Ich hoffe das hilft dem einen oder anderem. Der Code kann frei verwendet werden, wenn er woanders veröffentlicht wird, bitte ich auf mich / diesen Post zu referenzieren.

Gruß, Tarion

268 Beiträge seit 2008
vor 13 Jahren

Danke Tarion ich werd mir auch mal dein Beispiel anschauen.

Name: Scarecraft
Language:C#
learning since:winter 2007
IDE: Visual Studio 2005/08 Professional Editon
Skill:Medium
qualifications: MCP - Microsoft Certified Professional
Homepage : FX RPG Maker

F
10.010 Beiträge seit 2004
vor 13 Jahren

Wenn es der SqlServer ist, schau mal SqlDependency an.
Andere Datenbanken haben etwas ähnliches.

Hatten wir hier aber schon zigmal als eigenstäniges Thema.
Da muss man nicht eine 3 Jahre alten fast unpassenden Thread reaktivieren.

@Tarion:
Ja, die std Implementierung des Designers und der CommandBuilder erstellen UpdateCommands die selbständig eine Exception werfen, wennd er Datensatz zwischen einlesen und schreiben geändert wird.

Und wenn ich mir deine Anwendung anschaue, sorry aber das ist VB6 mit C# syntax und wirklich kein gutes Beispiel.

5.299 Beiträge seit 2008
vor 13 Jahren

@Tarion:
Und wenn ich mir deine Anwendung anschaue, sorry aber das ist VB6 mit C# syntax und wirklich kein gutes Beispiel.

Hi!

Kannst du vlt. ein bischen mehr ausführen, was an dem Beispiel so schlecht ist?

oder noch besser: häng doch eine bessere Solution an - (dürfte ja nicht so aufwändig sein, sowohl die Forms als auch die DB kannsteja verwenden)

Der frühe Apfel fängt den Wurm.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Hast Du den Code mal angeschaut?
Eine statische Klasse um von überall selbständig auf die daten zuzugreifen?!?

[FAQ] Kommunikation von 2 Forms

5.299 Beiträge seit 2008
vor 13 Jahren

Jo, habich, und habich kein Problem mit. Wenn gewollt ist, dass in der Anwendung nur ein Dataset bearbeitet wird, ist etwas Singleton-artiges durchaus das Mittel der Wahl, findich.
Und es ist sehr angeraten, in einer App von einem Dataset-Typ nur eine Instanz zu verwenden, ansonsten muß man dieselben Daten mehrmals holen, und hat beim Rückspeichern Probleme, weil in dem einen Dataset was anderes drin steht als im anderen, oder weil derselbe Datensatz (von versch. Forms aus) mehrmals abgespeichert wird (Parallellitätskonflikt).

Der frühe Apfel fängt den Wurm.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo ErfinderDesRades,

Jo, habich, und habich kein Problem mit.

darüber hatten wir neulich schon ausführlich diskutiert, weshalb wir das hier bitte nicht wiederholen sollten. Deine persönliche Meinung weicht an diesem Punkt einfach von den gängigen Designregeln ab. Daher kommt ich auch nicht um hin, die Leser zu warnen, deiner Ansicht zu folgen. FZelles Einwand ist vollkommen berechtigt.

herbivore

F
10.010 Beiträge seit 2004
vor 13 Jahren

@ErfinderDesRades :
Wenn Du nach all den Diskusionen immer noch nicht verstanden hast, wer hier für die Datenhaltung zuständig, dann tut es mir echt leid.

Bewegliche Daten in statischen Variablen zu halten ist genauso schlimm wie Goto.
Du solltest Dir evtl mal wirklich etwas zu Architektur oder OOP durchsehen.

5.299 Beiträge seit 2008
vor 13 Jahren

@herbivore:
Unsere Diskussion war ja per PM, das nützt also nur mir und dir, sich darauf zu beziehen.
Die gängigen Designregeln zum Thema sind mir bekannt (denkichmal), nur stimme ich ihr aufgrund eigener Denktätigkeit nicht in allen Punkten damit überein.

Der frühe Apfel fängt den Wurm.

T
381 Beiträge seit 2009
vor 13 Jahren

Bewegliche Daten in statischen Variablen zu halten ist genauso schlimm wie Goto.
Du solltest Dir evtl mal wirklich etwas zu Architektur oder OOP durchsehen.

Ich weiß das man das nicht in einer statischen Klasse realisiert und stimme euch da zu.
Jedoch geht es in meinem Beispiel nicht um das Model, sondern um das DataBinding. In diesem Fall habe ich den schnellsten Weg genommen um von 2 GUI's auf 1 Dataset zu zugreifen. Das ist über eine Statische Property sehr anschaulich.
In dem Beispiel geht es nicht um die spätere Erweiterbarkeit dieses Beispiels, sondern alleine darum zu zeigen, dass die Synchronisation eines DataSets wenn 2 Forms darauf per DataBinding zugreifen durchaus funktioniert.
Anders soll dieses Beispiel auch nicht aufgefasst werden. Es ist **keine **Ausgangsbasis für größere Projekte.

Und nebenbei war es für mich ein großer Lernerfolg 😉

F
10.010 Beiträge seit 2004
vor 13 Jahren

Das wäre viel einfacher und auch OOP Konformer so gegangen
[FAQ] Kommunikation von 2 Forms