Pergunta

Estou tentando executar uma exclusão em massa usando consultas parametrizadas. Atualmente, tenho o seguinte código:

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

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

pendingDeletions.ExecuteNonQuery();

No entanto, o valor do parâmetro parece ser substituído a cada vez e eu acabo removendo o último centro. Qual é a maneira correta de executar uma consulta parametrizada com uma lista de valores?

Foi útil?

Solução

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

Outras dicas

Rezzie, seu código atual é 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();

O que significa que você está executando apenas a consulta uma vez, com o último valor em seu enumerável 'selecionado'.

Esta é a principal razão pela qual eu sempre SEMPRE Use delimitadores de bloco em condicionais e loops sempre.

Portanto, se você incluir a atribuição de parâmetros e a execução da consulta no loop, estará pronto.

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


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

Eu tomei este exemplo de http://rosettacode.org/wiki/parametrized_sql_statement b/c a sintaxe aqui (com o '$' não funcionou para mim)

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top