Bạn đang làm sai một số điều ở đây:
- Bạn đặt cùng một tên cho tất cả các tham số của mình
@searchitem
. Điều đó sẽ không hoạt động. Các tham số cần có tên duy nhất. - Bạn tạo một SqlCommand mới cho từng mục. Điều đó sẽ không hoạt động. Tạo SqlCommand một lần ở đầu vòng lặp và sau đó đặt
CommandText
sau khi bạn tạo xong SQL. - SQL của bạn kết thúc bằng
AND
, đây không phải là cú pháp hợp lệ.
Đề xuất cải tiến (không sai, nhưng cũng không phải là phương pháp hay nhất):
- Như Frederik đã đề xuất, cách thông thường là đặt
%
mã thông báo trong tham số, thay vì thực hiện nối chuỗi bên trong SQL. - Trừ khi bạn sử dụng rõ ràng đối chiếu phân biệt chữ hoa chữ thường cho cơ sở dữ liệu của mình, các so sánh phải phân biệt chữ hoa chữ thường. Do đó, bạn có thể không cần
LOWER
.
Ví dụ về mã:
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();