2010-12-30 4 views
1

Ich erstelle eine Datenbankanwendung mit Visual C# Express und MySQL. Das Problem ist, dass ich nur Daten aus den C# -Formularen in der Datenbank speichern möchte, wenn die Daten tatsächlich geändert wurden. Wenn ich nun auf die Schaltfläche "Speichern" klicke, werden alle Felder im Formular angezeigt gespeichert in der Datenbank, ob sie geändert worden sind oder nicht.Werte nur dann in der Datenbank speichern, wenn sie geändert wurden

Die Lösung, die ich mit gekommen sind, nur für jedes Feld in der Form zu überprüfen, ob es entsprechend den SQL-Befehl geändert wurde ändern und dann, das heißt

//when the details are loaded into the form 
String strOriginalName = txtFirstname.Text; 

//when the save button is checked 
if(strOriginalName != txtFirstname.Text) 
{ 
String strUpdate = "UPDATE table SET firstName = txtFirstname.Text"; 
MySqlCommand cmdUpdate = new MySqlCommand(strUpdate, connection); 
cmdUpdate.ExecuteNonQuery(); 
} 

Hat jemand eine bessere oder alternative Lösung? Danke für deine Hilfe, wenn ich in irgendeinem Teil vage war, lass es mich wissen und ich kann versuchen, es weiter zu erklären.

+0

Wie werden die Daten abgefragt, die im Formular angezeigt werden sollen? Führen Sie eine MySQLCommand() aus und die Ergebnisse in einer Tabelle und Bindung an die Spalten der Tabelle abrufen? Benutzerdefinierte Liste mit Eigenschaften für jedes Feld? – DRapp

+0

Ich weiß, dass das ziemlich alt ist, aber ich benutze das '.Tag'-Feld, um den ursprünglichen Wert zu speichern und mache dann meine Vergleiche damit. Wenn Sie mit mehreren Feldern arbeiten, erstelle ich die Aktualisierungsabfrage nur mit den Feldern, in denen sich die Werte geändert haben. '.Tag' kann auch benutzerdefinierte Objekte speichern, sodass Sie den Feldnamen, den Typ und den ursprünglichen Wert dort eingeben können, um die Abfrage einfacher zu erstellen. –

Antwort

2

Ich empfehle, einige OR Mapper (NHibernate) zum Beispiel zu verwenden. Es wird alles für Sie tun. Zusätzlich erhalten Sie Caching und andere coole Dinge kostenlos :)

Lektionen für die Zukunft gelernt sind unbezahlbar und Ihre nächsten Anwendungen werden schneller und schneller wachsen. :)

+0

Konnte nicht mehr zustimmen. Ich würde nicht davon träumen, eine Webanwendung ohne OR-Mapper zu starten - aber sie sind noch leistungsfähiger in der Welt der Desktop-Anwendungen, wo Sie den Datenkontext für die gesamte Lebensdauer des Formulars offen halten können, wenn Sie das möchten. Sie können so gut wie vergessen, dass irgendwo dahinter eine Datenbank ist. –

0

Haben Sie eine einzige Aktualisierungsabfrage - es sei denn, Sie haben Hunderte von Parametern, sollten Sie nicht viel von einem Leistungsproblem sehen.

In der zu aktualisierenden Klasse muss ein boolescher Wert dirty gesetzt sein, der immer dann auf true gesetzt wird, wenn sich ein Wert ändert.

Aktualisieren Sie nur auf die Datenbank, wenn die Flagge tatsächlich true ist.


Alternativ verwenden Sie ein ORM, die Unit Of Work implementiert, die für Sie diese automatisch behandeln soll.

0

Wenn Sie ein einzelnes Feld in der Form haben, dann dies richtig ist ...

aber wenn Sie mehrere Werte (Felder) in dem Formular dann sollten Sie 1 Flagvariable verwenden.

Sobald ein Text geändert wird man die Flagge auf true gesetzt ist und aktualisieren Sie es ..

+0

Dies kann Probleme in Mehrbenutzersystemen verursachen, in denen zwei (oder mehr) Personen Änderungen am selben Datensatz vornehmen, wodurch die letzte Aktualisierung auf den gesamten Datensatz den vollständigen Datensatz verursacht.Ein Beispiel aus der Praxis wäre, wenn ein Benutzer das Feld Nachname ändert, während ein anderer Benutzer das Feld Vorname ändert. Wenn beide speichern, wird nur die letzte Änderung angewendet. Wenn Sie nur die geänderten Felder aktualisieren, werden beide Änderungen vorgenommen. Leider gibt es wirklich keinen besseren Weg, als jedes Feld einzeln zu überprüfen - eine einzige Flagge für alle ist nur ein fauler Code :) –

0

Blick auf die Art und Weise ORMs implementieren diese Funktion,

Suche nach NotifyPropertyChanged und Object Change Tracking.

Verwandte Themen