首页 > 解决方案 > 从动态文本框中检索动态 sql 参数值的循环问题

问题描述

全部。我是一个新的 VB.NET 初学者。我面临如何从动态文本框中传递动态 SQL 参数值来搜索数据的问题。我添加了对动态文本框和标签的控制,并希望根据用户输入的动态文本框值搜索数据库表上的数据。目前,我只能从 1 个动态文本框值中搜索数据。

我希望可以检索用户输入的动态文本框中的所有值,并根据用户输入的 SQL 参数变量名称和值搜索数据。

有人可以给我一些关于如何解决这个问题的解决方案吗?我在这个问题上坚持了几天。谢谢大家的帮助!

我试过的:

Private Sub FilterData()

    Dim count As Integer = 0

    'filterdata for radiobutton
    Try
        For Each TextBox As TextBox In grp2.Controls.OfType(Of TextBox)()
            For Each Label As Label In grp2.Controls.OfType(Of Label)()

                Using connection As New SqlConnection("connectionString")

                    'user key in the SQL statement
                    sql = TextBox1.Text
                    Dim sql2 As String
                    sql2 = sql
                    Dim sp1 As String() = sql.Split(New String() {"where"}, StringSplitOptions.None)
                    sql = sp1(0) & " where " & Label.Text & " = @parameter or " & Label.Text & " =@parameter"

                    If (TextBox.Text <> "") Then
                        count += 1
                        For j As Integer = 0 To count - 1
                            Using cmd As New SqlCommand(sql, connection)
                                cmd.Parameters.AddWithValue("@parameter", TextBox.Text)
                                'cmd.Parameters.Add("@parameter", SqlDbType.NVarChar, 20).Value = TextBox.Text
                                connection.Open()
                                Dim dt As New DataTable()
                                Dim reader As SqlDataReader
                                reader = cmd.ExecuteReader()
                                dt.Load(reader)
                                DataGridView1.DataSource = dt
                            End Using
                        Next
                    Else
                        GetData()
                    End If
                    'cmd.Dispose()
                    connection.Close()
                End Using
            Next
        Next

    Catch ex As Exception
        'MsgBox(ex.Message)
    End Try

End Sub

标签: vb.netloopsdynamicsqlparameter

解决方案


首先,如果你在 and 之间有 1:1 的对应关系LabelsTextBoxes那么你不应该使用两个嵌套循环,因为这会将 each and every与 each and everyFor Each配对。您应该做的是创建数组,然后使用单个循环访问控件对:LabelTextBoxFor

Dim labels = grp2.Controls.OfType(Of Label)().ToArray()
Dim textBoxes = grp2.Controls.OfType(Of TextBox)().ToArray()

For i = 0 To labels.getUpperBound(0)
    Dim label = labels(i)
    Dim textBox = textBoxes(i)

    '...
Next

至于构建 SQL 和添加参数,我倾向于这样做:

Dim labels = grp2.Controls.OfType(Of Label)().ToArray()
Dim textBoxes = grp2.Controls.OfType(Of TextBox)().ToArray()
Dim criteria As New List(Of String)
Dim command As New SqlCommand

For i = 0 To labels.getUpperBound(0)
    Dim label = labels(i)
    Dim textBox = textBoxes(i)
    Dim parameterName = "@" & label.Text.Replace(" ", "_")

    criteria.Add($"[{label.Text}] = {parameterName}")
    command.Parameters.AddWithValue(parameterName, textBox.Text)
Next

Dim sql = "SELECT * FROM MyTable"

If criteria.Any() Then
    sql &= " WHERE " & String.Join(" OR ", criteria)
End If

command.CommandText = sql

推荐阅读