VB不是'String'的成员

时间:2015-01-15 02:42:23

标签: vb.net string

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),我知道我可以使它工作,但我不知道如何。

以下是我遇到的错误:

  1. 'ExecuteReader'不是'String'的成员。
  2. 'Has Rows'不是'String'的成员。
  3. 'Read'不是'String'的成员。
  4. 'lbfirstname'未声明。由于其保护级别,它可能无法访问。
  5. '项目不是'String'的成员。
  6. '关闭'不是'String'的成员。
  7. 现在... lbfirstname,我或许可以搞清楚。我假设我需要将名称更改为任何有意义的名称。它是指文本框还是列表框?

    剩下的......我不知道。我认为Close是给定的,并假设Read是。当我尝试Dim * As String时没有任何帮助,而且我知道这不会是正确的。我正在连接到Access数据库,如果这有任何区别。

    我不知道VB会这么做。我很自愿地做到了这一点,并以某种方式管理了大部分其他的东西,几乎没有帮助。这是我应该做的最后一部分,我明天需要它。

1 个答案:

答案 0 :(得分:0)

您获得的错误是因为您尝试调用不属于String类的属性和方法,如评论中所述。具体做法是:

  1. ExecuteReaderOleDbCommand
  2. 的方法
  3. HasRowsOleDbDataReader的属性(通过调用OleDbCommand.ExecuteReader()返回。Read()Close()OleDbDataReader上的方法。
  4. lbfirstname不是分配给应用程序中ListBox控件的ID - 您需要使用您为控件提供的ID。
  5. Item应该是Items(注意复数),指的是ListBox中的项目集合。
  6. 您很容易受到SQL注入的攻击(除了您的SQL字符串无法正常工作之外,因为当您想要TextBoxLName.Text的值时,使用TextBox作为文字为避免SQL注入,您应该使用parmaterized查询。
  7. lbfirstname.item = data_reader.Item("firstname") - 即使这行代码有效,您也只能使用数据库返回的集合中的最后一个名字。您需要通过ListBox方法将名字添加到Add
  8. 完全放下这个,你会有这样的事情:

    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索引)。

    以上所有代码都假定查询中的列名正确且控件名称正确 - 您可能需要调整它们以匹配应用程序中的列名。