Синтаксическая ошибка: отсутствует операнд перед оператором «И».

Я использую vb.net, вот мой код для фильтрации источника привязки. Я получаю эту ошибку. Синтаксическая ошибка: отсутствует операнд перед оператором «И».

Private Function SetFilter() As String
    Dim datee As String = String.Format("datee >= #{0:M/dd/yyyy}# AND datee <= #{1:M/dd/yyyy}#", _
                              DateTimePicker1.Value, _
                              DateTimePicker2.Value)
    Dim client As String = If((TextBox1.Text.Length > 0), String.Format("[client] LIKE '%{0}%'", TextBox1.Text), "")
    Dim ref As String = If((TextBox2.Text.Length > 0), String.Format("[REF] LIKE '%{0}%'", TextBox2.Text), "")

    Return String.Format("{0} AND {1} AND {2}", datee, client, ref)
End Function


Private Sub DateTimePicker1_ValueChanged(sender As System.Object, e As System.EventArgs) Handles DateTimePicker1.ValueChanged
    SalesBindingSource.Filter = SetFilter()
End Sub

Private Sub DateTimePicker2_ValueChanged(sender As System.Object, e As System.EventArgs) Handles DateTimePicker2.ValueChanged
    'error here
    SalesBindingSource.Filter = SetFilter()
End Sub

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
    SalesBindingSource.Filter = SetFilter()
End Sub

Private Sub TextBox2_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox2.TextChanged
    SalesBindingSource.Filter = SetFilter()
End Sub

person Xzero    schedule 19.02.2014    source источник
comment
Каково содержимое TextBox1 и TextBox2? У вас есть текст с одинарными кавычками?   -  person Steve    schedule 20.02.2014
comment
textbox1 для поиска клиента textbox2 для поиска ссылочного номера   -  person Xzero    schedule 20.02.2014
comment
Этот запрос уязвим для атаки Sql Injection, поскольку вы используете конкатенацию строк введенных пользователем данных.   -  person Chris Dunaway    schedule 20.02.2014


Ответы (1)


Я предлагаю заменить ваш метод создания фильтра более безопасным способом обработки содержимого двух текстовых полей и ситуации, когда одно или оба текстовых поля пусты.

Dim client As String = If((TextBox1.Text.Length > 0), _
             String.Format(" AND [client] LIKE '%{0}%'", TextBox1.Text.Replace("'", "''")),"")
Dim ref As String = If((TextBox2.Text.Length > 0), _
             String.Format(" AND [REF] LIKE '%{0}%'", TextBox2.Text.Replace("'", "''"), "")

Return String.Format("{0} {1} {2}", datee, client, ref)

Вызов замены удваивает одинарную кавычку, вставленную вашим пользователем в текстовое поле, И непосредственно вставляется в строку для клиента и для ссылки, иначе вы получите недопустимый sql, если одно или оба текстовых поля пусты

person Steve    schedule 19.02.2014