2010-04-18 16 views
9

Ich versuche, eine Massenlöschung mit parametrisierten Abfragen auszuführen. Derzeit habe ich den folgenden Code:System.Data.SQLite parametrisierte Abfragen mit mehreren Werten?

pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn); 

foreach (string name in selected) 
    pendingDeletions.Parameters.AddWithValue("$name", name); 

pendingDeletions.ExecuteNonQuery(); 

Allerdings scheint der Wert des Parameters jedes Mal überschrieben werden und ich am Ende nur das letzte Zentrum entfernt. Wie kann eine parametrisierte Abfrage mit einer Werteliste korrekt ausgeführt werden?

Antwort

9
foreach (string name in selected) 
{ 
    pendingDeletions.Parameters.AddWithValue("$name", name); <-- 
    pendingDeletions.ExecuteNonQuery(); 
} 
+0

Dank. Ich habe meinen Code überarbeitet, um eine Liste von Ersetzungen statt einer Liste von "vorbereiteten" Parametern zu speichern, und ich weise die Werte den Parametern zu, während ich die Warteschlange gemäß Ihrer Antwort durchlaufen habe. – Rezzie

4

Rezzie, Ihr aktueller Code entspricht:

pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn); 


foreach (string name in selected) 
{ 
    pendingDeletions.Parameters.AddWithValue("$name", centre.Name); 
} 

pendingDeletions.ExecuteNonQuery(); 

Was bedeutet, dass Sie nur einmal die Abfrage ausgeführt wird, mit dem letzten Wert in Ihrer ‚ausgewählt‘ abzählbar.

Dies ist der Hauptgrund, dass ich immer IMMER IMMER Blocktrennzeichen auf Konditionals und Schleifen IMMER verwenden.

Also, wenn Sie die Parameterzuweisung und die Abfrageausführung in der Schleife einschließen, sollten Sie gut gehen.

pendingDeletions = new SQLiteCommand(@"DELETE FROM [centres] WHERE [name] = $name", conn); 


foreach (string name in selected) 
{ 
    pendingDeletions.Parameters.AddWithValue("$name", centre.Name); 
    pendingDeletions.ExecuteNonQuery(); 
} 
+4

p.s. habe ich erwähnt, ** IMMER ** Bedingungen und Schleifen beizufügen? ;-) –

+2

Ja, ich merkte, dass die Ausführung außerhalb der Schleife lag - ich würde (fälschlicherweise) annehmen, dass ich eine Liste von Ersetzungen für den Befehl erstellen würde, als ich gerade eine einzelne Ersetzung wiederholt überschrieb. – Rezzie

1

nahm ich dieses Beispiel aus http://rosettacode.org/wiki/Parametrized_SQL_statement b/c der Syntax hier (mit dem '$' für mich nicht funktioniert)

SqlConnection tConn = new SqlConnection("ConnectionString"); 

SqlCommand tCommand = new SqlCommand(); 
tCommand.Connection = tConn; 
tCommand.CommandText = "UPDATE players SET name = @name, score = @score, active = @active WHERE jerseyNum = @jerseyNum"; 

tCommand.Parameters.Add(new SqlParameter("@name", System.Data.SqlDbType.VarChar).Value = "Smith, Steve"); 
tCommand.Parameters.Add(new SqlParameter("@score", System.Data.SqlDbType.Int).Value = "42"); 
tCommand.Parameters.Add(new SqlParameter("@active", System.Data.SqlDbType.Bit).Value = true); 
tCommand.Parameters.Add(new SqlParameter("@jerseyNum", System.Data.SqlDbType.Int).Value = "99"); 

tCommand.ExecuteNonQuery(); 
Verwandte Themen