【发布时间】:2017-02-04 06:01:58
【问题描述】:
我正在尝试使用 VB.net 学习编码,我有一个简单的 CRUD 应用程序(VB.net 和 Sqlite),其中数据显示在网格框中。除了搜索数据,一切正常。
我想根据用户在组合框中选择的列名来搜索数据库。
原代码:
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
' search functions
connect()
Dim da As New SQLiteDataAdapter("SELECT * FROM tbl_biodata WHERE name like '%" & TextBox1.Text & "%'", connection)
Dim dt As New DataTable
da.Fill(dt)
DataGridView1.DataSource = dt
connection.Clone()
da.Dispose()
End Sub
原始代码有效,但我想有一个基于列名进行搜索的选项,所以我尝试了这个
修改代码:
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
' search functions
connect()
Dim da As New SQLiteDataAdapter("SELECT * FROM tbl_biodata WHERE name like '%" & TextBox1.Text & "%'", connection)
Dim db As New SQLiteDataAdapter("SELECT * FROM tbl_biodata WHERE country like '%" & TextBox1.Text & "%'", connection)
Dim dt As New DataTable
If ComboBox1.SelectedValue = "name" Then
da.Fill(dt)
ElseIf ComboBox1.SelectedValue = "country" Then
db.Fill(dt)
End If
DataGridView1.DataSource = dt
connection.Clone()
da.Dispose()
End Sub
我无法让它工作。我知道我的主要问题是
Dim da As New SQLiteDataAdapter("SELECT * FROM tbl_biodata WHERE name like '%" & TextBox1.Text & "%'", connection)
但我不知道该怎么做。非常感谢任何帮助,谢谢。
【问题讨论】:
-
查看参数化查询,否则您将打开 sql 注入。
-
你说你不能让它工作。这意味着发生了一些超出您预期的事情。这意味着你知道实际发生了什么。为什么我们不知道?
-
如果您知道您只会使用一个,为什么还要创建两个数据适配器?至少将数据适配器的创建放入
If...Else块中,这样您就只创建您需要的。更好的是,您只需将所选值直接插入 SQL 代码,然后继续创建唯一的数据适配器。 -
@jmcilhiney 这实际上是我需要的,但我不知道该怎么做。我试过这个 Dim da As New SQLiteDataAdapter("SELECT * FROM tbl_biodata WHERE 'combobox1.selectedvalue' like '%" & TextBox1.Text & "%'", connection) 但它在每个选定的值中都给了我一个空白结果。
-
在实际的
IF语句中而不是在外部初始化每个适配器。就目前而言,您正在创建两者,并且只需要一个。使用参数。还要调试您的代码并确保SelectedValue是您认为的那样。最后close你的连接不要clone。