Member 11856456 Ответов: 2

Как я могу использовать SQL-оператор в VB.NET для фильтрации нескольких результатов


Я работал над тем, как использовать оператор sql в vb.net для фильтрации результатов на основе текстовых полей.

вот мой код:
Private Sub filteredresults1()

      Dim sqlconn As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=c:\users\jj\documents\visual studio 2017\Projects\WindowsApplication3\WindowsApplication3\Databases\" + ComboBox1.Text + ".mdf;Integrated Security=True")
      Dim sqladaptor1 = New SqlDataAdapter("select * from " + "[" + TreeView1.SelectedNode.Text.ToString + "]" + " where Gender = " + "'" + TextBox3.Text + "'", sqlconn)

      sqlconn.Open()
      Dim sql1 As String = "select * from " + "[" + TreeView1.SelectedNode.Text.ToString + "]" + " where Gender = " + "'" + TextBox3.Text + "'"

      Dim cmd As SqlClient.SqlCommand
      cmd = New SqlClient.SqlCommand(sql1, sqlconn)

      Dim dt As New DataTable
      Dim ds As New DataSet
      sqladaptor1.Fill(dt)
      DataGridView1.DataSource = dt

  End Sub


 Private Sub filteredresults()

        Dim sqlconn As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=c:\users\jj\documents\visual studio 2017\Projects\WindowsApplication3\WindowsApplication3\Databases\" + ComboBox1.Text + ".mdf;Integrated Security=True")
        Dim sqladaptor = New SqlDataAdapter("select * from " + "[" + TreeView1.SelectedNode.Text.ToString + "]" + " where [Year of employment] between " + TextBox1.Text + " and " + TextBox2.Text, sqlconn)

        sqlconn.Open()

        Dim sql As String = "select * from " + "[" + TreeView1.SelectedNode.Text.ToString + "]" + " where [Year of employment] between " + TextBox1.Text + " and " + TextBox2.Text

        Dim cmd As SqlClient.SqlCommand
        cmd = New SqlClient.SqlCommand(sql, sqlconn)
        Dim dt As New DataTable
        Dim ds As New DataSet
        sqladaptor.Fill(dt)
        DataGridView1.DataSource = dt

end sub


Я хочу объединить эти 2 утверждения. Я хочу настроить его таким образом, чтобы при отсутствии текста он не искал это поле. Например,
If TextBox1.TextLength = 0 Then

        End If


Любая помощь будет оценена по достоинству

Что я уже пробовал:

попробовал использовать 2 отдельных оператора через событие нажатия кнопки, но только 1 оператор sql будет обработан.

2 Ответов

Рейтинг:
12

Richard Deeming

Попробуйте что-нибудь вроде этого:

Using sqlconn As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Databases\" + ComboBox1.Text + ".mdf;Integrated Security=True")
    Using da As New SqlDataAdapter(String.Empty, sqlconn)
        Dim sql As New StringBuilder("SELECT * FROM [")
        sql.Append(TreeView1.SelectedNode.Text.Replace("]", "\]"))
        sql.Append("] WHERE 1 = 1 ")
        
        If Not String.IsNullOrEmpty(TextBox3.Text) Then
            sql.Append("And Gender = @Gender")
            da.SelectCommand.Parameters.AddWithValue("@Gender", TextBox3.Text)
        End If
        
        Dim startYear As Integer, endYear As Integer
        If Integer.TryParse(TextBox1.Text, startYear) AndAlso Integer.TryParse(TextBox2.Text, endYear) Then
            sql.Append("And [Year of employment] Between @StartYear And @EndYear")
            da.SelectCommand.Parameters.AddWithValue("@StartYear", startYear)
            da.SelectCommand.Parameters.AddWithValue("@EndYear", endYear)
        End If
        
        ' Similar code for other filters...
        
        da.SelectCommand.CommandText = sql.ToString()
        
        Dim dt As New DataTable()
        da.Fill(dt)
        
        DataGridView1.DataSource = dt
    End Using
End Using


  • Используйте параметры для исправления уязвимости SQL-инъекции;
    NB: В зависимости от того, откуда они берутся, вам все равно может потребоваться проверить ComboBox1.Text и TreeView1.SelectedNode.Text ценности.
  • Оберните одноразовые предметы в Using блоки;
  • Воспользуйся |DataDirectory| в строке подключения для ссылки на текущий путь приложения;
    Работа с локальными базами данных-Smart Client Data[^]
  • Воспользуйся Integer.TryParse чтобы подтвердить это TextBox1 и TextBox2 содержать действительные числа;
  • Удаление неиспользуемых переменных;


Теперь сделайте себе одолжение и дайте своим элементам управления осмысленные имена, а не принимайте имена по умолчанию, предоставленные дизайнером. Вы могли бы вспомнить что ListBox42 представляет сейчас, но когда вы вернетесь, чтобы посмотреть на свой код через шесть месяцев, вы не будете иметь ни малейшего понятия! :)


Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]


Member 11856456

Спасибо, я последую вашему совету. Мне придется пройти и переделать довольно много, но я думаю, что в конце концов это того стоит. спасибо и за объяснения.

Рейтинг:
10

Patrice T

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]


Member 11856456

Тогда возникает хороший вопрос. Как сделать функцию поиска или фильтра, которая не вызывала бы SQL-инъекцию?

Patrice T

Второе звено-это решение.

Maciej Los

Это почти ответ. Я продвигаю его как 4. Я бы поддержал его, когда вы добавите некоторые подробности о параметризованных запросах.

Patrice T

- Привет, спасибо.
Посмотрите на вторую ссылку в решении