Вот как вы можете реализовать дополнительные фильтры:
Dim sql = <sql>
SELECT *
FROM MyTable
WHERE (@Column1A IS NULL OR Column1 = @Column1B)
AND (@Column2A IS NULL OR Column2 = @Column2B)
</sql>
command.CommandText = sql.Value
Dim filter1 = If(TextBox1.TextLength = 0, CObj(DBNull.Value), TextBox1.Text)
Dim filter2 = If(TextBox2.TextLength = 0, CObj(DBNull.Value), TextBox2.Text)
With command.Parameters
.Add("@Column1A", OleDbType.VarChar, 50).Value = filter1
.Add("@Column1B", OleDbType.VarChar, 50).Value = filter1
.Add("@Column2A", OleDbType.VarChar, 50).Value = filter2
.Add("@Column2B", OleDbType.VarChar, 50).Value = filter2
End With
Во-первых, обратите внимание на использование литерала XML, чтобы сделать код SQL более читаемым. Во-вторых, обратите внимание на использование параметров для вставки значений в код, а не на объединение строк.
Что касается собственно фильтрации, давайте посмотрим на одну пару параметров:
@Column1A IS NULL OR Column1 = @Column1B
Если TextBox1
пусто, то и @Column1A
, и @Column1B
получают значение NULL
. Это означает, что первое условие истинно, и каждая строка соответствует, фактически игнорируя этот фильтр. Если TextBox1
не пусто, то первое условие ложно, и будут соответствовать только те строки, для которых второе условие истинно, таким образом соблюдается этот фильтр.
Стоит отметить, что вам нужны четыре параметра, поскольку вы используете Access. Поставщики Jet и ACE OLE DB используют позиционные параметры, даже если вы используете имена. Это означает, что один OleDbParameter
не может использоваться более чем для одного параметра SQL. Если бы вы использовали SQL Server, то двух параметров было бы достаточно, потому что каждый из них можно было бы использовать дважды, т.е.
Dim sql = <sql>
SELECT *
FROM MyTable
WHERE (@Column1 IS NULL OR Column1 = @Column1)
AND (@Column2 IS NULL OR Column2 = @Column2)
</sql>
command.CommandText = sql.Value
Dim filter1 = If(TextBox1.TextLength = 0, CObj(DBNull.Value), TextBox1.Text)
Dim filter2 = If(TextBox2.TextLength = 0, CObj(DBNull.Value), TextBox2.Text)
With command.Parameters
.Add("@Column1", SqlDbType.VarChar, 50).Value = filter1
.Add("@Column2", SqlDbType.VarChar, 50).Value = filter2
End With
17.09.2014