#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.