2016-05-29 7 views
2

Ich habe ein großes Problem mit meiner Löschanweisung in meinem Code.Dynamischer Löschcode löscht ganze Tabelle

Ausführen C#, MySql für Visual Studio und der .NET-Connector.

Es ist wirklich basic:

FYI: Teile = Teile in Deutsch

ich ein List<Teile> haben, wo das Element hat eine ID, eine Beschreibung und eine Zählung. Diese Liste wird an meine Löschfunktion gegeben (ich weiß, keine Parameter):

public static void Delete(List<TeilShort> Teileliste) 
{ 
    string strSQL = "DELETE FROM Teile WHERE tID "; 
    MySqlConnection conn = GetConnection(); 
    MySqlCommand cmd = new MySqlCommand(strSQL, conn); 
    if (Teileliste.Count > 1) 
    { 
     strSQL += "IN ("; 
     foreach (var item in Teileliste) 
     { 
      strSQL += item.ID + ", "; 
     } 
     strSQL = strSQL.Substring(0, strSQL.Length - 2) + ")"; 
    } 
    else 
    { 
     strSQL += "= " + Teileliste[0].ID; 
    } 

    Debug.WriteLine(strSQL); 

    try 
    { 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
    catch (MySqlException) { throw; } 
    finally { conn.Close(); } 
} 

Die tID ist die Primary Key meiner Tabelle Teile.

Wenn ich kommentieren Sie die gesamte if-Anweisung und = 14-strSQL nur hinzufügen, dann ist es völlig in Ordnung funktioniert und löscht nur den Eintrag mit der ID 14.

Wenn ich nur ein Element in meinem Teileliste und die Code schreibt selbst (die Debug.WriteLine(strSQL); Ausgänge gleich, jede Entität in meinem Tisch

Zum Glück gelöscht wird ich hatte nur Testdaten darin.

Kann mir jemand sagen, wo das Problem sein könnte?

Grüße Diego

+0

Stellen Sie sicher, dass 'Teileliste' tut jede ID in ihm haben, irgendeine Art von Ansicht mit vielleicht einige/die meisten filtern aus. Diese Schleife könnte durch 'string.Join (", ", Teileliste) ersetzt werden' – Plutonix

+0

Ich bin mir sicher, dass 'Teileliste' nur eine ID hat, da 'Debug.WriteLine' die '= ID' und nicht' IN () Aussage. Wie bekomme ich die IDs aus der '' '' '' '' '' '' '' '' '' '' '' '' ''ID, Description und Partcount? – Diego

+0

Bitte senden Sie den SQL-Befehl, den Sie in Ihrem 'Debug.Print' erhalten, auch mit nur einer ID wie mit mehreren. – Shnugo

Antwort

4

definieren Sie Ihren Befehl auf Ihre Routine mit

string strSQL = "DELETE FROM Teile WHERE tID "; 
MySqlConnection conn = GetConnection(); 
MySqlCommand cmd = new MySqlCommand(strSQL, conn); 

Danach Sie Ihre Befehlszeichenfolge bauen, aber sie nie diesen neuen Befehl in das Befehlsobjekt gesetzt. Ihre int-ID wird also als boolescher Wert interpretiert. Alles andere als 0 ist wahr. Deshalb sollten Sie alles löschen ...

Versuchen Sie, die new MySqlCommand... nach dem Befehl des Generation zu bewegen ...

+0

Vielen Dank, das war mein Problem! Jetzt fühle ich mich dumm: D – Diego

+0

@Diego Macht nichts, es gibt überall einen grünen Busch zu verstecken! Glückliche Kodierung! Grüße aus Wien! – Shnugo