vb. net выполнить sql команду с переменными - PullRequest
1 голос
/ 22 марта 2020

Я хочу вставить в таблицу форму windows при запуске, и я пытаюсь использовать эту функцию, возникает исключение, которое представляет собой

поле 'строка, которую я написал', неизвестно в поле список "" указывающий на "resultat = cmd.ExecuteNonQuery"

 Sub maj()
        Dim cnx As New MySqlConnection("datasource=localhost;database=bdgeststock;username=root;password=")
        Dim cmd As MySqlCommand = cnx.CreateCommand
        Dim resultat As Integer
        If ConnectionState.Open Then
            cnx.Close()
        End If
        cnx.Open()
        cmd.CommandText = "insert into utilisateur(login,password,type)value(" & TextBox3.Text & "," & TextBox4.Text & "," & ListBox1.SelectedItem() & ")"
        resultat = cmd.ExecuteNonQuery
        If (resultat = 0) Then
            MessageBox.Show("error")
        Else
            MessageBox.Show("success")

        End If
        cnx.Close()
        cmd.Dispose()
    End Sub

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Блоки Using...End Using закрывают и удаляют объекты вашей базы данных, даже если есть ошибка. В этот код включены как соединение, так и команда. Запишите запятую в конце строки Using.

Всегда используйте параметры, чтобы избежать инъекции Sql. Метод .Add предпочтительнее .AddWithValue. Я должен был угадать тип данных и размер полей. Проверьте в вашей базе данных фактические значения.

Sub maj()
    Dim resultat As Integer
    Using cnx As New MySqlConnection("datasource=localhost;database=bdgeststock;username=root;password="),
            cmd As New MySqlCommand("insert into utilisateur(login,`password`,type) values(@Login, @Password, @Type);", cnx)
        cmd.Parameters.Add("@Login", MySqlDbType.VarChar).Value = TextBox3.Text
        cmd.Parameters.Add("@Password", MySqlDbType.VarChar).Value = TextBox4.Text
        cmd.Parameters.Add("@Type", MySqlDbType.VarChar).Value = ListBox1.SelectedItem
        cnx.Open()
        resultat = cmd.ExecuteNonQuery
    End Using
    If resultat = 0 Then
        MessageBox.Show("error")
    Else
        MessageBox.Show("success")
    End If
End Sub
1 голос
/ 22 марта 2020

Объединяемые строковые значения не заключаются в кавычки, поэтому база данных идентифицирует их как имена столбцов, а затем завершается ошибкой, поскольку таких столбцов нет. Более того, это делает вашу программу уязвимой для SQL атак внедрения.

Лучшим подходом было бы использование переменных связывания:

cmd.CommandText = "insert into utilisateur (login, password, type) value (@P1, @P2, @P3)"
cmd.Parameters.AddWithValue("@P1", TextBox3.Text)
cmd.Parameters.AddWithValue("@P2", TextBox4.Text)
cmd.Parameters.AddWithValue("@P3", ListBox1.SelectedItem())
cmd.ExecuteNonQuery()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...