Чтение значения из базы данных в TextBox, когда текст Combobox изменяет VB.NET - PullRequest
1 голос
/ 30 июня 2019

У меня есть список имен пользователей в ComboBox и некоторых текстовых окнах. Когда текст ComboBox изменяется (т. Е. Я выбираю имя пользователя из ComboBox), текстовые поля заполняются данными пользователя из базы данных.

У меня есть код для достижения этой цели в базе данных 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 голосов
/ 01 июля 2019

Вот мой ответ. Пожалуйста, не волнуйтесь об этом. ;)

Сломанный код

Прежде всего, на мой взгляд, предоставленный вами код вообще не может работать, потому что:

  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. вы нигде не объявили переменные MysqlConn и Command. Вы только назначаете им. (Я просто предположу, что вы правильно объявили переменные где-то еще в вашем коде ...)

  4. интерфейс IDataRecord не обеспечивает перегрузку метода GetString(name As String). Поэтому, если вы не определили собственный метод расширения для него, вам, вероятно, также потребуется использовать метод IDataRecord.GetOrdinal(name As String) или индекс столбца вместо имени столбца.

В любом случае, предоставленный вами код использует MySQL. Поэтому я предполагаю, что MySQL - это база данных SQL, которую вы успешно используете. И это, кажется, работает, как вы говорите? Ну ... Хммм ... Тогда я просто предположу, что ваш фрагмент кода полностью корректен и отлично работает с MySQL ...: /

MS Access против MySQL

Для использования MS Access требуются другие классы доступа к данным (вероятно, в пространстве имен System.Data.OleDb) и другая строка подключения . Вы можете посмотреть на этот пример ADO.NET OleDb для MS Access в документации Microsoft.

Возможно, вам даже придется обновить ваш SQL-запрос, потому что каждая система баз данных использует свой собственный диалект SQL. Вы можете обратиться к Офисная документация для этого. Но ваш запрос довольно прост, поэтому, возможно, все, что вам нужно сделать, чтобы он работал с MS Access:

  • удалить имя базы данных и использовать только имя таблицы, а
  • разграничить идентификатор name (поскольку это зарезервированное ключевое слово в MS Access).

Я лично разграничиваю все идентификаторы в моих запросах SQL, чтобы избежать непреднамеренных конфликтов с зарезервированными ключевыми словами. Так что я бы лично использовал что-то вроде этого:

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

Дополнительные советы

Также я хотел бы предоставить вам несколько дополнительных (не связанных) советов по улучшению вашего кода:

  • Максимально используйте Using -статементов с переменными типа IDisposable. Эти типы / классы не реализуют этот интерфейс, если для этого нет веских оснований, поэтому я считаю, что не менее важно вызывать Dispose, когда вы закончите с такими одноразовыми объектами (или использовать оператор Using для вызова Dispose неявно).
  • Используйте параметры SQL (если возможно), чтобы избежать SQL инъекций уязвимостей. Посмотрите на этот вопрос StackOverflow и его ответ , чтобы узнать, как использовать параметры SQL с MS Access.

Пример * +1091 ** * тысяча девяносто-два Вы можете взглянуть на следующий фрагмент кода. Возможно, он не дает готового примера из коробки, но вы можете получить некоторые полезные / практические идеи из него:

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
...