## 24.2 Aktionsabfragen absetzen Abfragen, die Änderungen an den Originaldaten der Datenbank nach sich ziehen (UPDATE, DELETE INSERT) oder die Struktur einer Datenbank verändern (CREATE TABLE), werden mit der Methode ExecuteNonQuery abgesetzt. Handelt es sich bei dem Befehl um ein UPDATE-, INSERT- oder DELETE-Kommando, können Sie über den Rückgabewert die Anzahl der von der Anweisung betroffenen Datenzeilen feststellen. ### 24.2.1 Datensätze hinzufügen Im folgenden Beispielprogramm wird der Tabelle Products ein Datensatz hinzugefügt. Dabei wird der parametrisierte Konstruktor der Klasse SqlCommand verwendet, der im ersten Parameter den SQL-Befehl und im zweiten die Referenz auf das SqlConnection-Objekt entgegennimmt.
    // ------------------------------------------------------------------
    // Beispiel: ...\Kapitel 24\DatensätzeHinzufügen
    // ------------------------------------------------------------------
    SqlConnection con = new SqlConnection("...");
    // SQL-Befehl
    string strSQL =
           "INSERT INTO Products(ProductName, Discontinued) " +
           "VALUES('Schweizer Käse',0)";
    try {
      con.Open();
      SqlCommand cmd = new SqlCommand(strSQL, con);
      // Kommando absetzen
      cmd.ExecuteNonQuery();
    }
    catch (Exception e) {
      Console.WriteLine("Fehlermeldung: {0}", e.Message);
    }
    con.Close();
### 24.2.2 Datensätze löschen Der Datensatz aus dem vorhergehenden Beispiel soll nun wieder gelöscht werden. Da wir nun daran interessiert sind, ob und wie viele Datenzeilen von einer Löschanweisung betroffen sind, werten wir den Rückgabewert der Methode ExecuteNonQuery an der Konsole aus.
    // ------------------------------------------------------------------
    // Beispiel: ...\Kapitel 24\DatensätzeLöschen
    // ------------------------------------------------------------------
    SqlConnection con = new SqlConnection("...");
    try {
      con.Open();
      string strSQL = "DELETE FROM Products " +
                      "WHERE ProductName='Schweizer Käse'";
      SqlCommand cmd = new SqlCommand(strSQL, con);
      Console.Write("Anzahl der gelöschten Datensätze = ");
      Console.WriteLine(cmd.ExecuteNonQuery());
    }
    catch (Exception e) {
      Console.WriteLine("Fehlermeldung: {0}", e.Message);
    }
    con.Close();
Nach dem ersten Start des Programms wird der im Abschnitt zuvor hinzugefügte Datensatz gelöscht. An der Konsole sehen wir das bestätigt, da die Zahl 1 ausgegeben wird. Rufen wir das Programm ein zweites Mal auf, wird kein Datensatz gefunden, der dem Kriterium ProductName='Schweizer Käse' entspricht. Das spiegelt sich in der Ausgabe Die Anzahl der gelöschten Datensätze = 0 wider. ### 24.2.3 Datensätze ändern Zu Beginn dieses Abschnitts wurde in dem Beispiel ExecuteNonQueryDemo bereits gezeigt, wie Sie Datensätze in der Datenbank editieren können. Daher soll an dieser Stelle auf ein weiteres Beispiel verzichtet werden. ### 24.2.4 Abfragen, die genau ein Ergebnis liefern Mit der SELECT-Anweisung können Sie eine Datensatzliste nach bestimmten Auswahlkriterien aus einer Datenbank abrufen. Der Befehl SELECT wird aber auch dann benutzt, wenn eine Aggregatfunktion definiert werden soll. Aggregatfunktionen liefern ein Ergebnis zurück. Beispielsweise können Sie mit
    SELECT COUNT(*) FROM Products
die Anzahl der Artikel in der Tabelle Products ermitteln und mit
    SELECT COUNT(*) FROM Products WHERE CategoryID = 1
feststellen, wie viele Artikel zur Kategorie 1 gehören. Neben COUNT stehen noch weitere Aggregatfunktionen zur Verfügung: SUM, um die Summe eines numerischen Ausdrucks zu ermitteln, AVG, um einen Durchschnittswert zu bilden, sowie MIN und MAX, um aus einem gegebenen Ausdruck den Maximal- bzw. Minimalwert zu erhalten. Um den Rückgabewert einer Aggregatfunktion entgegenzunehmen, rufen Sie die Methode ExecuteScalar auf das SqlCommand-Objekt auf. Der Typ der Rückgabe ist Object, daher muss das Ergebnis noch in den passenden Datentyp konvertiert werden.
    string textSQL = "SELECT COUNT(*) FROM Products WHERE CategoryID=1";
    SqlCommand cmd = new SqlCommand(textSQL, con);
    int anzahlDS = Convert.ToInt32(cmd.ExecuteScalar());