2010-04-18 19 views
9

Estoy tratando de ejecutar una eliminación masiva utilizando consultas parametrizadas. Actualmente, tengo el siguiente código:System.Data.SQLite consultas parametrizadas con valores múltiples?

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

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

pendingDeletions.ExecuteNonQuery(); 

Sin embargo, el valor del parámetro parece ser sobrescritos cada vez y termino sólo la eliminación de la última central. ¿Cuál es la forma correcta de ejecutar una consulta parametrizada con una lista de valores?

Respuesta

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

Gracias. Refactoreé mi código para almacenar una lista de sustituciones en lugar de una lista de parámetros 'preparados', y asigno los valores a los parámetros mientras realizo la iteración a través de la cola según su respuesta. – Rezzie

4

Rezzie, su código actual es 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(); 

Lo que significa que sólo se está ejecutando la consulta una vez, con el último valor en su 'selected' enumerable.

Este es el motivo principal por el que SIEMPRE SIEMPRE SIEMPRE uso los delimitadores de bloque en los condicionales y los bucles SIEMPRE.

Por lo tanto, si adjunta la asignación de parámetros y la ejecución de la consulta en el ciclo, debería estar listo.

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. ¿mencioné que ** SIEMPRE ** encierre condicionales y bucles? ;-) –

+2

Sí, me di cuenta de que la ejecución estaba fuera del ciclo. Supuse (erróneamente) que estaba creando una lista de sustituciones para el comando, cuando en realidad estaba sobrescribiendo una única sustitución repetidamente. – Rezzie

1

Tomé este ejemplo de http://rosettacode.org/wiki/Parametrized_SQL_statement b/c la sintaxis aquí (con el '$' no funcionó para mí)

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