#mysql #vb.net
#mysql #vb.net
Вопрос:
Я получаю эти два сообщения об ошибках,
‘ExecuteReader’ не является членом ‘WindowsApplication1.MySqlCommand’
Слишком много аргументов для ‘Public Sub New ()’ {Эта ошибка возникает в поле (query, conn)}
Небольшое объяснение того, что я пытаюсь сделать
Здесь я пытаюсь создать приложение, которое будет вводить данные в отдельные базы данных (для мужчин, женщин и детей), используя If pub = «» (pub упоминается в другом) Затем, согласно ComboBox1, таблица может отличаться. В соответствии с таблицей необходимо вставить значения.
Это код, который я использую
Dim T As String
T = ComboBox1.Text
If pub = "Women" Then
conn = New MySqlConnection
conn.ConnectionString = "server=localhost;user=root;password=1234;database=women_clothing"
Dim reader As MySqlDataReader
Try
conn.Open()
Dim query As String
query = "INSERT INTO [" T "] VALUES ('" amp; TextBox1.Text amp; "','" amp; TextBox2.Text amp; "','" amp; TextBox3.Text amp; "','" amp; TextBox4.Text amp; "'," amp; Val(TextBox5.Text) amp; "," amp; Val(TextBox6.Text) amp; ");"
command = New MySqlCommand(query, conn)
reader = Command.ExecuteReader
MessageBox.Show("Data Saved")
conn.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
conn.Dispose()
End Try
loadtable()
ElseIf pub = "Men" Then
Else
End If
loadtable()
Спасибо
Комментарии:
1. Похоже, что вы написали код перед добавлением ссылки на MySQL Connector, что, в свою очередь, побудило VS предложить создать для вас класс MySqlCommand, и вы его приняли. Удалите этот автоматически созданный класс
2. Я думаю, что «Команда. ExecuteReader» должен быть командой. ExecuteReader… По крайней мере, это то, что вы определили в предыдущей строке … команда, а не «Команда».
3. @Martheen я проверю это. Спасибо. : D
4. @Gi1ber7 VB.NET не чувствителен к регистру
5. @Martheen Это сработало. Большое вам спасибо.
Ответ №1:
Вы не должны использовать ExecuteReader для выполнения инструкции, которая вставляет данные. ExecuteReader предназначен для запросов SELECT. ExecuteNonQuery предназначен для вставок
Ваш код должен выглядеть так:
Using conn = New MySqlConnection("server=localhost;user=root;password=1234;database=women_clothing")
Using cmd = New MySqlCommand("INSERT INTO tableName VALUES (@p1,@p2,@p3,@p4,@p5,@p6)", conn)
conn.Open()
cmd.Parameters.AddWithValue("@p1", TextBox1.Text)
cmd.Parameters.AddWithValue("@p2", TextBox2.Text)
cmd.Parameters.AddWithValue("@p3", TextBox3.Text)
cmd.Parameters.AddWithValue("@p4", TextBox4.Text)
cmd.Parameters.AddWithValue("@p5", TextBox5.Text)
cmd.Parameters.AddWithValue("@p6", TextBox6.Text)
cmd.ExecuteNonQuery()
End Using
End Using
Я также продемонстрировал, как использовать параметры; всегда используйте параметры. Ваш код в его нынешнем виде сильно подвержен риску взлома атак с использованием SQL-инъекций, и если это не убедит вас в том, что вы не пишете код таким образом, имейте в виду, что ваше приложение выйдет из строя, если кто-нибудь введет апостроф в одно из ваших текстовых полей (что затем даст более проницательным техническим вундеркиндам, использующимэто идея о том, что он подвержен взлому с помощью инъекций, тогда они взломают его), что выглядит плохо для конечного пользователя (и заставляет их жаловаться в вашу службу поддержки / вам).
Не имеет значения, что «это всего лишь простое приложение для моей бабушки, чтобы проиндексировать свою коллекцию виниловых пластинок» — речь идет о ТОМ, чтобы НЕ изучать модель поведения, которая является рискованной, граничащей с ограничением карьеры, если вы хотите применить свои навыки программирования в мире разработки программного обеспечения. Как показывает приведенный выше взлом VTech, в настоящее время существует 5 миллионов изображений детей, плавающих вокруг, чьи родители никогда не разрешали их выпуск, и все потому, что несколько человек не приняли надлежащих мер предосторожности при выполнении своей работы. Если бы кто-нибудь из моих разработчиков написал SQL, подверженный внедрению, учитывая природу одной из отраслей, в которой я работаю, их бы просто уволили.
Кроме того, пожалуйста, приобретите привычку переименовывать свои текстовые поля после добавления их в форму. Невероятно сложно для любого (включая вас, через 6 месяцев) постоянно искать «хм, какое текстовое поле с первым именем? это textbox2 или textbox3?» требуется около 2 секунд, чтобы ввести что-то новое в строке (Name) сетки свойств после добавления текстового поля в форму; firstNameTextBox
намного лучше, чем textBox2
Ответ №2:
Благодаря @Caius, это вариант с использованием ConnectionStringBuilder
With
блока, составного Using
блока и интерполяции строк, просто для иллюстрации.
ОБРАТИТЕ внимание на использование As
=
вместо при объявлении соединения и команды; это делается для формальной установки типов Infer
, а не для их определения.
Dim connStr As New MySqlConnectionStringBuilder() With {
.Server = "localhost",
.Database = "women_clothing",
.UserID = "root",
.Password = "1234"
}
' -> "server=localhost;database=women_clothing;user id=root;password=1234"
Using conn As New MySqlConnection(connStr.ConnectionString),
cmd As New MySqlCommand($"INSERT INTO [{T}] VALUES (@p1, @p2, @p3, @p4, @p5, @p6)", conn)
conn.Open()
With cmd
.Parameters.AddWithValue("@p1", TextBox1.Text)
.Parameters.AddWithValue("@p2", TextBox2.Text)
.Parameters.AddWithValue("@p3", TextBox3.Text)
.Parameters.AddWithValue("@p4", TextBox4.Text)
.Parameters.AddWithValue("@p5", TextBox5.Text)
.Parameters.AddWithValue("@p6", TextBox6.Text)
.ExecuteNonQuery()
End With
conn.Close()
End Using