Столбец ‘first_name’ не может быть НУЛЕВЫМ VB.Чистая ошибка

#mysql #vb.net

#mysql #vb.net

Вопрос:

Я создаю систему. И теперь я застрял в регистрационной форме, которую я создаю. Я использую Visual Studio 2008 и использую VB в качестве своего языка программирования, подключая его к базе данных MySQL с помощью соединителя MySQL 5.1.1.

У меня есть такая структура таблицы, где она не равна нулю, но когда я ввожу данные в свою регистрационную форму, я получаю эту ошибку

И когда я меняю его на Null в структуре таблицы в базе данных, данные, которые я ввожу в созданную мной регистрационную форму, становятся Null в базе данных

Я не знаю, есть ли у меня ошибка в моем коде или в моей базе данных. Я всего лишь новичок, надеюсь, кто-нибудь мне поможет.

Это мой код в моей кнопке для регистрации новой учетной записи пользователя в моей регистрационной форме

     Private Sub btnCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreate.Click
    Dim fname As String = txtboxfname.Text
    Dim lname As String = txtboxlname.Text
    Dim uname As String = txtboxuname.Text
    Dim pass As String = txtboxpass.Text
    Dim cpass As String = txtboxcpass.Text

    If txtboxfname.Text() = "" Or txtboxlname.Text() = "" Or txtboxuname.Text() = "" Or txtboxpass.Text() = "" Then

        MessageBox.Show("One Or More Fields Are Empty", "Missing Data", MessageBoxButtons.OK, MessageBoxIcon.Stop)

    ElseIf Not String.Equals(pass, cpass) Then

        MessageBox.Show("Wrong Confirmation Password", "Password Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

    ElseIf unameExist(uname) Then

        MessageBox.Show("This Username Already Exists, Choose Another One", "Duplicate Username", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

    Else

        Dim conn As New DBCon()
        Dim command As New MySqlCommand("INSERT INTO `login`(`first_name`, `last_name`, `username`, `password`) VALUES (@fn, @ln, @usn, @pwd)", conn.getConnection())

        command.Parameters.Add("@fn", MySqlDbType.VarChar).Value = fname
        command.Parameters.Add("@ln", MySqlDbType.VarChar).Value = lname
        command.Parameters.Add("@usn", MySqlDbType.VarChar).Value = uname
        command.Parameters.Add("@pwd", MySqlDbType.VarChar).Value = pass

        conn.openConnection()

        If command.ExecuteNonQuery() = 1 Then

            MessageBox.Show("Registration Completed Successfully", "User Added", MessageBoxButtons.OK, MessageBoxIcon.Information)
            conn.closeConnection()

        Else

            MessageBox.Show("Something Happened", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
            conn.closeConnection()

        End If
    End If
End Sub
 

И это код в моем подключении VB к MySQL

 Imports MySql.Data.MySqlClient

Public Class DBCon
Private conn As New 
MySqlConnection("datasource=localhost;port=3306;username=root;password=;database=blood_elements")  

ReadOnly Property getConnection() As MySqlConnection
    Get
        Return conn
    End Get
End Property

Sub openConnection()

    If conn.State = ConnectionState.Closed Then
        conn.Open()
    End If

End Sub

Sub closeConnection()

    If conn.State = ConnectionState.Open Then
        conn.Close()
    End If

End Sub
End Class
 

Комментарии:

1. я не вижу, что ошибка fname кажется пустой или нулевой, поэтому проверьте это, пожалуйста

Ответ №1:

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

К счастью, vb.Net и C # обеспечивают использование блоков для закрытия и удаления объектов.

У вас должно быть очень мало кода в подразделах событий. Все окна сообщений отображаются в коде пользовательского интерфейса, а не в коде доступа к данным.

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If Not ValidateNewUserInput() Then
        Exit Sub
    End If
    Dim Success = DataAccess.InsertUser(txtboxfname.Text, txtboxlname.Text, txtboxuname.Text, txtboxpass.Text)
    If Success Then
        MessageBox.Show("Registration Completed Successfully", "User Added", MessageBoxButtons.OK, MessageBoxIcon.Information)
    Else
        MessageBox.Show("Something Happened", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If
End Sub
 

В коде проверки я использовал IsNullOrEmpty для обрезанной строки. Это должно покрывать пробелы, такие как табуляция или пробелы в текстовом поле. Я также использовал OrElse, который является оператором короткого замыкания. Оператор If остановит условия вычисления, как только найдет значение True .

Поскольку UserNameExists является общим методом, нет необходимости создавать экземпляр класса DataAccess .

 Private Function ValidateNewUserInput() As Boolean
    If String.IsNullOrEmpty(txtboxfname.Text.Trim) OrElse String.IsNullOrEmpty(txtboxlname.Text.Trim OrElse String.IsNullOrEmpty(txtboxuname.Text.Trim OrElse String.IsNullOrEmpty(txtboxpass.Text.Trim) Then
            MessageBox.Show("One Or More Fields Are Empty", "Missing Data", MessageBoxButtons.OK, MessageBoxIcon.Stop)
        Return False
    ElseIf txtboxpass.Text <> txtboxcpass Then
        MessageBox.Show("Wrong Confirmation Password", "Password Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Return False
    ElseIf DataAccess.UserNameExists(txtboxuname.Text) Then
        MessageBox.Show("This Username Already Exists, Choose Another One", "Duplicate Username", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        Return False
    End If
    Return True
End Function
 

Ваш доступ к данным может выглядеть примерно так…

 Public Class DataAccess

    Private Shared ConStr As String = "datasource=localhost;port=3306;username=root;password=;database=blood_elements"

    Public Shared Function InsertUser(FirstName As String, LastName As String, UserName As String, PWord As String) As Boolean
        Using conn As New MySqlConnection(ConStr),
                command As New MySqlCommand("INSERT INTO `login`(`first_name`, `last_name`, `username`, `password`) VALUES (@fn, @ln, @usn, @pwd)", conn)
            command.Parameters.Add("@fn", MySqlDbType.VarChar).Value = FirstName
            command.Parameters.Add("@ln", MySqlDbType.VarChar).Value = LastName
            command.Parameters.Add("@usn", MySqlDbType.VarChar).Value = UserName
            command.Parameters.Add("@pwd", MySqlDbType.VarChar).Value = PWord
            conn.Open()
            If command.ExecuteNonQuery() = 1 Then
                Return True
            Else
                Return False
            End If
        End Using
    End Function

    Public Shared Function UserNameExists(UName As String) As Boolean
        Using conn As New MySqlConnection(ConStr),
                command As New MySqlCommand("Select `first_name` From `login` Where `username` = @UName", conn)
            command.Parameters.AddWithValue("@UName", UName)
            conn.Open()
            Using reader = command.ExecuteReader
                If reader.HasRows Then
                    Return True
                Else
                    Return False
                End If
            End Using
        End Using
    End Function

End Class
 

Комментарии:

1. Привет! Я использовал ваш код, но все та же проблема. Структура таблицы не равна нулю, и когда я ввожу данные в свою регистрационную форму, я все равно получаю ошибку. Я также изменил структуру таблицы на Null в базе данных, и все равно, когда я ввожу данные в регистрационную форму, в базе данных становится Null.