vb.net - 从动态文本框中检索动态 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
解决方案
首先,如果你在 and 之间有 1:1 的对应关系Labels
,TextBoxes
那么你不应该使用两个嵌套循环,因为这会将 each and every与 each and everyFor Each
配对。您应该做的是创建数组,然后使用单个循环访问控件对:Label
TextBox
For
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
推荐阅读
- python - 我的第一台服务器中的服务器错误在 python 中运行
- angular - 将属性添加到类实例
- jquery - 如何根据用户输入过滤和显示 JSON 数据?
- python - 如果用户输入错误数据,如何编码输入语句以重复
- java - 该列表无法从另一个列表中删除数据
- java - 有没有办法向不讲法语的用户隐藏图像(卡片视图)
- sql-server - 根据不同列的前 10 将一列的 10 行复制到另一个表
- python - MSS,Python:最大客户端数达到分段错误(核心转储)
- javascript - 如何在网页的源代码中进行更改而不会在刷新时消失?
- php - 我的 ajax submit onchange select 仅在第一行上工作