Вот мой ответ. Пожалуйста, не волнуйтесь об этом. ;)
Сломанный код
Прежде всего, на мой взгляд, предоставленный вами код вообще не может работать, потому что:
ваша 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 & "'"
вы пытаетесь присвоить строку подключения свойству ConnectionString
несуществующей переменной Mysql
. Или переменная существует, потому что она объявлена где-то еще, что может быть ошибкой в вашем фрагменте кода здесь. Но я предполагаю, что вы хотите присвоить строку соединения свойству MysqlConn.ConnectionString
.
вы нигде не объявили переменные MysqlConn
и Command
. Вы только назначаете им. (Я просто предположу, что вы правильно объявили переменные где-то еще в вашем коде ...)
интерфейс 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