2010-04-18 6 views
9

J'essaie de faire une suppression en bloc en utilisant des requêtes paramétrées. À l'heure actuelle, j'ai le code suivant:Les requêtes System.Data.SQLite paramétrées avec plusieurs valeurs?

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

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

pendingDeletions.ExecuteNonQuery(); 

Cependant, la valeur du paramètre semble être écrasé à chaque fois et je finis juste enlever le dernier centre. Quelle est la bonne façon d'exécuter une requête paramétrée avec une liste de valeurs?

Répondre

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

Merci. J'ai refacturé mon code pour stocker une liste de substitutions plutôt qu'une liste de paramètres 'préparés', et j'assigne les valeurs aux paramètres tout en itérant dans la file d'attente selon votre réponse. – Rezzie

4

Rezzie, votre code actuel est équivalent à:

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


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

pendingDeletions.ExecuteNonQuery(); 

Ce qui signifie que vous n'exécutiez une fois que la requête, la dernière valeur dans votre « sélectionné » dénombrable.

Ceci est la principale raison pour laquelle je TOUJOURS TOUJOURS TOUJOURS utiliser des délimiteurs de bloc sur conditionnels et boucles TOUJOURS. Par conséquent, si vous intégrez le paramétrage et l'exécution de la requête dans la boucle, il est préférable d'y aller.

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. Ai-je mentionné de ** TOUJOURS ** enfermer les conditionnels et les boucles? ;-) –

+2

Oui, je me suis rendu compte que l'exécution était en dehors de la boucle - je supposais (à tort) que je construisais une liste de substitutions à la commande, alors que j'étais en train d'écraser une seule substitution à plusieurs reprises. – Rezzie

1

Je pris cet exemple de http://rosettacode.org/wiki/Parametrized_SQL_statement b/c la syntaxe ici (avec le '$' ne fonctionne pas pour moi)

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(); 
Questions connexes