2010-04-18 20 views
9

Sto tentando di eseguire un'eliminazione di massa utilizzando query parametrizzate. Attualmente, ho il seguente codice:query con parametri System.Data.SQLite con più valori?

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

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

pendingDeletions.ExecuteNonQuery(); 

Tuttavia, il valore del parametro sembra essere sovrascritto ogni volta e io alla fine solo di rimuovere l'ultimo centro. Qual è il modo corretto di eseguire una query parametrizzata con un elenco di valori?

risposta

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

Grazie. Ho refactored il mio codice per memorizzare un elenco di sostituzioni piuttosto che un elenco di parametri 'preparati' e assegno i valori ai parametri mentre iterando attraverso la coda secondo la tua risposta. – Rezzie

4

Rezzie, il codice corrente è equivalente a:

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


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

pendingDeletions.ExecuteNonQuery(); 

Il che significa che si sta eseguendo solo la query una volta, con l'ultimo valore nella vostra 'selezionato' enumerabile.

Questa è la ragione principale per cui SEMPRE SEMPRE SEMPRE utilizzare i delimitatori di blocco su condizionali e cicli SEMPRE.

Quindi, se si racchiude l'assegnazione dei parametri e l'esecuzione della query nel ciclo, è necessario procedere.

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. ho parlato di ** SEMPRE ** racchiudere condizionali e loop? ;-) –

+2

Sì, mi sono reso conto che l'esecuzione era fuori dal giro - avrei assunto (erroneamente) che stavo costruendo una lista di sostituzioni al comando, quando in realtà stavo sovrascrivendo ripetutamente una singola sostituzione. – Rezzie

1

ho preso questo esempio da http://rosettacode.org/wiki/Parametrized_SQL_statement b/c la sintassi qui (con la '$' non ha funzionato per me)

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