Zum Inhalt springen
Der Guide für ein smartes Leben.
Datenbankprogrammierung

ExecuteReader()

Autoren: Redaktion pcmagazin und Walter Saumweber • 4.10.2009 • ca. 2:00 Min

Den so konstruierten SQL-Befehl schicken Sie mit command-> ExecuteNonQuery(); des SqlCommand-Objekts ab. Während die ExecuteReader()-Methode für SELECT-Abfragen verwendet wird und passend dazu ein SqlDataReader-Objekt zurückliefert, verwenden Sie für UPDATE-, INSERT- und DELETEBefehle die Met...

Den so konstruierten SQL-Befehl schicken Sie mit command-> ExecuteNonQuery(); des SqlCommand-Objekts ab. Während die ExecuteReader()-Methode für SELECT-Abfragen verwendet wird und passend dazu ein SqlDataReader-Objekt zurückliefert, verwenden Sie für UPDATE-, INSERT- und DELETEBefehle die Methode ExecuteNonQuery(), welche die Anzahl der betroffenen Datensätze zurückgibt.

Da es sich hier jedoch stets um nur einen handelt, machen Sie von dieser Information keinen Gebrauch. Anschließend sollten Sie dem Benutzer noch mitteilen, dass der Datensatz gespeichert wurde.

Da der neue Kontakt sowohl in der Datenbank als auch in der Liste am Ende eingefügt wird, empfiehlt es sich außerdem, den Index entsprechend zu aktualisieren (dsindex = Kontakt::Anzahl - 1;). Auch wenn ein Kontakt gelöscht werden soll (Schaltfläche Löschen), müssen Sie diesen aus der Datenbank und der Liste entfernen. Dazu durchlaufen Sie in einer for each-Schleife die komplette Liste, wobei Sie prüfen, ob die E-Mail-Adresse, die aktuell im Textfeld steht, überhaupt gespeichert ist.

Nur wenn die Bedingung k-> Email == text-Box2-> Text zutrifft, löschen Sie das Element und zwar zuerst aus der Liste. Dazu verwenden Sie die Methode Remove(), deren booleschen Rückgabewert Sie erneut überprüfen. Der Wert true bedeutet, dass das Element in der Liste vorhanden war und entfernt werden konnte: if(meineKontakte->Remove(k) == true). Nur unter dieser Voraussetzung löschen Sie den entsprechenden Datensatz aus der SQL-Datenbank und melden dies entsprechend:

command->CommandText =
"DELETE FROM Kontakte WHERE [E-Mail] =
," + textBox2->Text + "'";
command->ExecuteNonQuery();
MessageBox::Show("Kontakt wurde gelöscht");

Unbedingt notwendig ist es jetzt noch, ie Variable Anzahl um Eins zu verringernd (Kontakt::Anzahl--;). Ansonsten könnte beim Navigieren zwischen den Kontakten ein ungültiger Objektzugriff erfolgen. Vielleicht werden Sie sich jetzt fragen, warum es beim Hinzufügen eines neuen Kontaktes nicht notwendig war, die Variable Anzahl zu erhöhen.

Die Antwort lautet: Sie sparen die Arbeit, weil die Klasse Kontakt so eingerichtet ist, dass dies automatisch in den Konstruktoren erfolgt. Im .NET Framework kann der Destruktor jedoch für ähnliche Zwecke - eine Variable, welche die Gesamtzahl von Objekten wiedergibt, zu dekrementieren - nicht verwendet werden. Denn der Destruktor arbeitet unter der Regie des Garbage Collectors in der Regel zeitversetzt.

Heft-DVD

Die Heft-DVD (PC Magazin 11/2009) enthält das Projekt Kontaktverwaltung mit der SQL-Datenbank. Diese besteht aus der Datei Kontakte.mdf und der Log-Datei Kontakte_log.LDF. Die Datenbank enthält bereits drei Dummy-Kontakte, um die Funktionalität des Programms sofort testen zu können. Beachten Sie bitte im Text, wie Sie im Beispielcode die Verbindungszeichenfolge zur Datenbank anpassen.

Außerdem finden Sie auf der Heft-DVD den Beitrag der letzten Ausgabe als PDF-Dokument. Dieser Artikel zeigt, wie Sie in Visual Studio bzw. in der Visual C++ 2008 Express Edition eine SQL-Datenbank erstellen. Die Visual C++ 2008 Express Edition beziehen Sie kostenlos über: www.microsoft.com