sql >> Databasteknik >  >> RDS >> Sqlserver

Parametrerad dynamisk sql-fråga

Du gör några saker fel här:

  • Du ger alla dina parametrar samma namn @searchitem . Det kommer inte att fungera. Parametrarna behöver unika namn.
  • Du skapar ett nytt SqlCommand för varje objekt. Det kommer inte att fungera. Skapa SqlCommand en gång i början av loopen och ställ sedan in CommandText när du är klar med att skapa SQL.
  • Din SQL slutar med AND , som inte är giltig syntax.

Förbättringsförslag (inte fel i sig, men inte heller bästa praxis):

  • Som Frederik föreslog, är det vanliga sättet att sätta % tokens i parametern, istället för att göra strängsammansättning i SQL.
  • Om du inte uttryckligen använder en skiftlägeskänslig sortering för din databas, bör jämförelser vara skiftlägesokänsliga. Därför kanske du inte behöver LOWER .

Kodexempel:

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. Ändra PostgreSQL-kolumner som används i vyer

  2. Select returnerar inte värden Postgres-11.4

  3. Fel 1064 i Grafana för att göra en graf med hjälp av mysql-databas

  4. Hur TRUNCATE() fungerar i MariaDB