Estás haciendo algunas cosas mal aquí:
- Le da a todos sus parámetros el mismo nombre
@searchitem
. Eso no funcionará. Los parámetros necesitan nombres únicos. - Usted crea un nuevo SqlCommand para cada elemento. Eso no funcionará. Cree el SqlCommand una vez al comienzo del ciclo y luego configure
CommandText
una vez que haya terminado de crear el SQL. - Tu SQL termina con
AND
, que no es una sintaxis válida.
Sugerencias de mejora (no incorrectas per se, pero tampoco mejores prácticas):
- Como sugirió Frederik, la forma habitual es poner el
%
tokens en el parámetro, en lugar de hacer una concatenación de cadenas dentro del SQL. - A menos que utilice explícitamente una intercalación que distingue entre mayúsculas y minúsculas para su base de datos, las comparaciones no deben distinguir entre mayúsculas y minúsculas. Por lo tanto, es posible que no necesite el
LOWER
.
Ejemplo de código:
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();