Я получаю два сообщения об ошибках при попытке вставить данные в таблицу MySQL

#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