В зависимост от конкретната реализация имаме два общи подхода към този проблем:
1) Динамично изграждане на израза за филтър за SQL заявката в кода, като пропуска всички параметри, които са празни. Това е най-добрият подход, ако позволите на потребителя да избере множество стойности за една колона (т.е. изберете 0 или повече от 50-те състояния, за да филтрирате данните).
Например:
Ако приемем, че txtCondition1 и txtCondition2 са текстови полета:
// Assuming conn is an open SqlConnection
System.Text.StringBuilder sbSQL = new StringBuilder(500);
List<SqlParameter> cParameters = new List<SqlParameter>();
// Add a default condition of 1=1 so that all subsequent conditions can be added
// with AND instead of having to check to see whether or not any other conditions
// were added before adding AND.
sbSQL.Append("SELECT * FROM MyTestTable WHERE 1 = 1 ");
if (!String.IsNullOrEmpty(txtCondition1.Text)) {
sbSQL.Append(" AND Column1 = @Column1");
cParameters.Add(new SqlParameter("@Column1", txtCondition1.Text));
}
if (!String.IsNullOrEmpty(txtCondition1.Text))
{
sbSQL.Append(" AND Column2 = @Column2");
cParameters.Add(new SqlParameter("@Column2", txtCondition2.Text));
}
SqlCommand oCommand = new SqlCommand(sbSQL.ToString, conn);
if (cParameters.Count != 0)
{
oCommand.Parameters.AddRange(cParameters.ToArray());
}
// Do something with oCommand
2) Ако стойностите са по-ограничени, ние обикновено ги предаваме на съхранена процедура, която е отговорна за определянето дали стойността трябва да бъде оценена или не чрез тестване на параметъра за "празноти", или нула, празен низ, 0 за числа и т.н.