sql >> Databáze >  >> RDS >> Sqlserver

Parametrizovaný dynamický dotaz SQL

Tady děláte pár věcí špatně:

  • Všem svým parametrům dáte stejný název @searchitem . To nebude fungovat. Parametry potřebují jedinečné názvy.
  • Pro každou položku vytvoříte nový příkaz SqlCommand. To nebude fungovat. Vytvořte SqlCommand jednou na začátku cyklu a poté nastavte CommandText jakmile dokončíte vytváření SQL.
  • Váš SQL končí na AND , což není platná syntaxe.

Návrhy na zlepšení (samy o sobě nejsou špatné, ale ani nejlepší postupy):

  • Jak navrhl Frederik, obvyklým způsobem je zadat % tokeny v parametru, spíše než zřetězení řetězců uvnitř SQL.
  • Pokud pro svou databázi výslovně nepoužijete řazení rozlišující malá a velká písmena, neměla by se při porovnávání rozlišovat malá a velká písmena. Proto možná nebudete potřebovat LOWER .

Příklad kódu:

SqlCommand cmd = new SqlCommand();
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.Append("SELECT name, memberid FROM members ");

var i = 1;
foreach (string item in keywords)
{
    sqlBuilder.Append(i == 1 ? " WHERE " : " AND ");
    var paramName = "@searchitem" + i.ToString();
    sqlBuilder.AppendFormat(" Name LIKE {0} ", paramName); 
    cmd.Parameters.AddWithValue(paramName, "%" + item + "%");

    i++;
}
cmd.CommandText = sqlBuilder.ToString();


  1. Prevence vkládání SQL pomocí dynamického dotazu SQL ALTER USER

  2. pip install MySQL-python selže na ubuntu 14.04, chyba:příkaz 'x86_64-linux-gnu-gcc' selhal se stavem ukončení 1

  3. PHP $stmt->num_rows nefunguje podle připravených příkazů

  4. Úprava úlohy SQL Server Agent (T-SQL)