WinForms中PlaceholderTextBox插入MySQL异常问题求助
解决WinForms PlaceholderTextBox内容存入MySQL时存储控件对象而非文本的问题
问题根源
你在给SQL命令的参数赋值时,直接传入了PlaceholderTextBox控件对象(比如firstName、emailCom),而不是控件的Text属性。当控件对象被转换为字符串时,默认会返回类似System.Windows.Forms.PlaceholderTextBox, Text: Adm的对象描述,这就是数据库里存储错误内容的原因。
修复方案
直接使用控件的.Text属性(或者你已经提前定义好的变量,比如theFirstname、theEmail)给参数赋值即可。同时优化你代码里的其他冗余问题:
- 你已经提前获取了各控件的Text值到变量,直接用这些变量赋值更简洁
- 原代码重复调用
connection.Open()和connection.Close(),容易引发连接异常 - 重复弹出成功提示框,逻辑顺序也存在问题
修正后的完整代码
Dim theFirstname As String = firstName.Text.Trim() Dim theEmail As String = emailCom.Text.Trim() Dim username As String = userName2.Text.Trim() Dim thePassword As String = passWord2.Text.Trim() If String.IsNullOrEmpty(theFirstname) Or String.IsNullOrEmpty(theEmail) Or String.IsNullOrEmpty(username) Or String.IsNullOrEmpty(thePassword) Then MessageBox.Show("One Or More Fields Are Empty", "Missing Data", MessageBoxButtons.OK, MessageBoxIcon.Stop) ElseIf Usernamexist(username) Then MessageBox.Show("This Username Already Exists, Choose Another One", "Duplicate Username", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Else ' 使用Using语句自动管理连接和命令,避免手动关闭的资源泄漏问题 Using connection As New MySqlConnection("你的数据库连接字符串") connection.Open() Dim command As New MySqlCommand("INSERT INTO authentic (firstname, email, username, password) VALUES (@firstname,@email,@username,@password)", connection) ' 用提前获取的变量赋值,或者直接用控件.Text属性 command.Parameters.Add("@firstname", MySqlDbType.VarChar).Value = theFirstname command.Parameters.Add("@email", MySqlDbType.VarChar).Value = theEmail command.Parameters.Add("@username", MySqlDbType.VarChar).Value = username command.Parameters.Add("@password", MySqlDbType.VarChar).Value = thePassword Dim rowsAffected As Integer = command.ExecuteNonQuery() If rowsAffected = 1 Then MessageBox.Show("Registration Completed Successfully", "User Added", MessageBoxButtons.OK, MessageBoxIcon.Information) ' 清空输入框 firstName.Text = "" emailCom.Text = "" userName2.Text = "" passWord2.Text = "" ' 切换界面 accLogin.Visible = True createAcc.Visible = False Else MessageBox.Show("Something Happened", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Using ' Using块结束会自动关闭连接 End If
额外说明
- 使用
Using语句可以自动释放数据库连接和命令资源,避免忘记关闭连接导致的资源泄漏 - 提前对Text值做
Trim()处理,避免用户输入前后空格导致的空值判断失效 - 修正了原代码先弹成功提示再执行插入的逻辑错误,改为先执行操作再判断结果
内容的提问来源于stack exchange,提问作者moe manii
相关产品推荐
相关产品推荐

