当组合框文本更改VB.NET时,从文本框中的数据库中读取值

时间:2019-06-30 05:17:35

标签: vb.net ms-access combobox textbox vb.net-2010

我在ComboBox和一些TextBoxes中有一个用户名列表。当ComboBox文本更改时(即,我从ComboBox中选择了一些用户名),TextBox中将填充数据库中的用户详细信息。

我有代码可以在SQL数据库中实现此目的。但是这些查询不适用于MsAccess数据库。

    MysqlConn = New MySqlConnection
    Mysql.ConnectionString = "server=localhost;user=root;password=root;database=database"
    Dim READER As MySqlDataReader
    Try
        MysqlConn.open()
        Dim Query As String
        Query("select * from database.usernames where name='" & ComboBox1.Text & "'")
        Command = New MySqlCommand(Query, MysqlConn)
        READER = Command.ExecuteReader
        While READER.Read
        TextBox1.Text = READER.GetString("name") 
        End While

    End Try

1 个答案:

答案 0 :(得分:0)

这是我的答案。请不要被它淹没。 ;)

代码损坏

首先,据我所知,您提供的代码根本无法工作,因为:

  1. 您的Query变量以无效(或至少非常奇怪的)方式初始化。您可能想使用类似这样的东西:

    Dim Query As String
    Query = "select * from database.usernames where name='" & ComboBox1.Text & "'"
    

    或一行:

    Dim Query As String = "select * from database.usernames where name='" & ComboBox1.Text & "'"
    
  2. ,您尝试将连接字符串分配给不存在的ConnectionString变量的Mysql属性。或者变量存在是因为它在其他地方声明,这可能是您的代码片段中的错误。但是我假设您想将连接字符串分配给MysqlConn.ConnectionString属性。

  3. 您尚未在任何地方声明MysqlConnCommand变量。您只需分配给他们。 (我只是假设您已在代码的其他位置正确声明了变量...)

  4. IDataRecord接口没有提供GetString(name As String)方法重载。因此,除非您为其定义了自定义扩展方法,否则可能还需要使用IDataRecord.GetOrdinal(name As String)方法,或者使用列索引而不是列名。

无论如何,您提供的代码使用MySQL。因此,我假设MySQL是您成功使用的“ SQL数据库”。正如您所说,这似乎行得通吗?嗯...嗯...那么我只是假设您的代码段是完全正确的,并且可以与MySQL完美配合...:/

MS Access与MySQL

使用MS Access需要其他数据访问类(可能是名称空间System.Data.OleDb中的类)和另一个connection string。您可以在Microsoft文档中查看此ADO.NET OleDb example for MS Access

您甚至可能必须更新SQL查询,因为每个数据库系统都使用自己的SQL方言。您可能需要咨询Office documentation。但是您的查询非常简单,因此可能要做的就是使其与MS Access兼容:

  • 删除数据库名称并仅使用表名称,并且
  • 分隔name标识符(因为它是MS Access中的保留关键字)。

我个人在SQL查询中定界了所有标识符,只是为了避免与保留关键字的意外冲突。所以我个人会使用这样的东西:

select * from [usernames] where [name] = '...'

其他提示

此外,我想向您提供一些其他有关改进代码的提示(不相关):

  • 尽可能将Using-statementsIDisposable类型的变量一起使用。如果没有充分的理由,这些类型/类将不会实现该接口,因此我认为在处理完此类一次性对象(或使用Dispose之后,调用Using并不重要隐式调用Dispose的语句)。
  • 使用SQL参数(如果可能)来避免SQL injection漏洞。在this StackOverflow question and its answer中查看有关如何在MS Access中使用SQL参数的示例。

示例

您可以看一下以下代码片段。它可能无法提供开箱即用的示例,但您可能会从中获得一些有用的/实用的想法:

Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Data\\database.mdb;User Id=admin;Password="
Dim query As String = "select * from [usernames] where [name] = @Name"

Using conn As New OleDbConnection(connectionString)
    Using command As New OleDbCommand(query)
        command.Parameters.Add("@Name", OleDbType.VarChar, 50).Value = ComboBox1.Text
        conn.Open()

        Using reader As OleDbDataReader = command.ExecuteReader
            If reader.Read Then
                textbox1.Text = reader.GetString(reader.GetOrdinal("name"))
            End If
        End Using
    End Using
End Using