Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextSearch.TextChanged
'attempting to allow search by last name
Dim con As New OleDb.OleDbConnection
Dim cmd As New OleDb.OleDbCommand
Dim Sql As String
Dim data_reader As String
con.ConnectionString = "PROVIDER = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Me._DeCON_12___2015DataSet.DeCon"
con.Open()
Sql = "SELECT [First Name 2015], [Last Name 2015] FROM DeCon WHERE [Last Name 2015] = TextBoxLName.Text"
data_reader = Sql.ExecuteReader()
'ListBox1.Items.Clear()
If data_reader.HasRows = True Then
Do While data_reader.Read()
lbfirstname.item = data_reader.Item("firstname")
Loop
End If
data_reader.Close()
data_reader = Nothing
con.Close()
End Sub
好吧,我是一个新手,而且我正在努力让用户可以在文本框中按姓氏进行搜索,然后在列表框中显示名字(具有该姓氏的人)。我得到了这个代码(除了data_reader As String),我知道我可以使它工作,但我不知道如何。
以下是我遇到的错误:
现在... lbfirstname,我或许可以搞清楚。我假设我需要将名称更改为任何有意义的名称。它是指文本框还是列表框?
剩下的......我不知道。我认为Close是给定的,并假设Read是。当我尝试Dim * As String时没有任何帮助,而且我知道这不会是正确的。我正在连接到Access数据库,如果这有任何区别。
我不知道VB会这么做。我很自愿地做到了这一点,并以某种方式管理了大部分其他的东西,几乎没有帮助。这是我应该做的最后一部分,我明天需要它。
答案 0 :(得分:0)
您获得的错误是因为您尝试调用不属于String
类的属性和方法,如评论中所述。具体做法是:
ExecuteReader
是OleDbCommand
。HasRows
是OleDbDataReader
的属性(通过调用OleDbCommand.ExecuteReader()
返回。Read()
和Close()
是OleDbDataReader
上的方法。 lbfirstname
不是分配给应用程序中ListBox
控件的ID - 您需要使用您为控件提供的ID。Item
应该是Items
(注意复数),指的是ListBox
中的项目集合。TextBoxLName.Text
的值时,使用TextBox
作为文字为避免SQL注入,您应该使用parmaterized查询。lbfirstname.item = data_reader.Item("firstname")
- 即使这行代码有效,您也只能使用数据库返回的集合中的最后一个名字。您需要通过ListBox
方法将名字添加到Add
。完全放下这个,你会有这样的事情:
Using con As New OleDb.OleDbConnection("PROVIDER = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Me._DeCON_12___2015DataSet.DeCon")
con.Open()
Dim Sql As String = "SELECT [First Name 2015], [Last Name 2015] FROM DeCon WHERE [Last Name 2015] = @LastName"
Dim cmd As New OleDb.OleDbCommand(Sql, con)
cmd.Parameters.Add("@LastName", OleDb.OleDbType.VarChar).Value = TextBoxLName.Text
Using data_reader As OleDb.OleDbDataReader = cmd.ExecuteReader()
If data_reader.HasRows Then
Do While data_reader.Read()
lbfirstname.Items.Add(data_reader.GetString(0))
Loop
End If
End Using
End Using
上述代码的说明:
首先,连接被包装在Using
块中 - 这将确保连接被正确关闭并在块退出时被丢弃,即使抛出异常也是如此。
接下来,通过将Sql
子句中的值替换为WHERE
来参数化@LastName
字符串。 OleDbCommand
已创建并分配了Sql
字符串和OleDbConnection
对象。
然后将@LastName
参数添加到命令的Parameters
集合中,并为其分配TextBoxLName
的值。
ExecuteReader
对象上再次在OleDbCommand
块中调用 Using
(以确保阅读器正确关闭并处理掉)。
当浏览器循环播放时,查询返回的每条记录的名字都会添加到ListBox
。我使用阅读器的GetString
方法将值作为字符串返回。此方法需要一个序数(列的索引),它基于您提供的SQL字符串是第一列(0,因为它是0索引)。
以上所有代码都假定查询中的列名正确且控件名称正确 - 您可能需要调整它们以匹配应用程序中的列名。