VB.NET中MySQL添加按钮SQL语法错误问题求助
解决VB.NET连接MySQL添加按钮的SQL语法错误
错误原因分析
- 字段名语法错误:表字段
Book Id包含空格,MySQL中带空格或特殊字符的字段必须用**反引号()**包裹,否则SQL解析器会将Book和Id`识别为两个独立标识符,触发语法错误。 - 错误的执行方法:插入操作使用
ExecuteReader是错误的,该方法仅用于执行查询并读取结果集,插入/更新/删除操作应使用ExecuteNonQuery。 - SQL注入风险与语法隐患:直接拼接用户输入到SQL语句中,不仅可能因输入含单引号等特殊字符引发语法错误,还存在严重的SQL注入安全问题。
修复后的代码
Imports MySql.Data.MySqlClient Imports Microsoft.VisualBasic.ApplicationServices Imports Microsoft.Win32 Public Class AdminInterface Dim server As String = "localhost" Dim username As String = "root" Dim password As String = "202015" Dim database As String = "myconnector" Private bitmap As Bitmap Private Sub updateTableBelow() ' 使用Using自动释放连接资源 Using sqlConn As New MySqlConnection($"server={server};user id={username};password={password};database={database}") sqlConn.Open() Using sqlCmd As New MySqlCommand("SELECT * FROM librarybook.librarybook;", sqlConn) Using sqlRd As MySqlDataReader = sqlCmd.ExecuteReader() Dim sqlDt As New DataTable() ' 每次创建新表避免重复数据 sqlDt.Load(sqlRd) Display1Book.DataSource = sqlDt End Using End Using End Using End Sub Private Sub AddBtn_Click(sender As Object, e As EventArgs) Handles AddBtn.Click ' 使用Using确保连接和命令自动释放 Using sqlConn As New MySqlConnection($"server={server};user id={username};password={password};database={database}") Try sqlConn.Open() ' 用反引号包裹带空格的字段,使用参数化查询 Dim sqlQuery As String = "INSERT INTO librarybook.librarybook(no, `Book Id`, BookTitle, Author, YearPublished) VALUES(@No, @BookId, @BookTitle, @Author, @YearPublished)" Using sqlCmd As New MySqlCommand(sqlQuery, sqlConn) ' 添加参数,避免SQL注入和语法错误 sqlCmd.Parameters.AddWithValue("@No", SearchTxT.Text) sqlCmd.Parameters.AddWithValue("@BookId", BookIdTxT.Text) sqlCmd.Parameters.AddWithValue("@BookTitle", BookTitleTxt.Text) sqlCmd.Parameters.AddWithValue("@Author", AuthorTxt.Text) sqlCmd.Parameters.AddWithValue("@YearPublished", YearPublishedTxT.Text) ' 执行插入操作,返回受影响行数 Dim affectedRows As Integer = sqlCmd.ExecuteNonQuery() If affectedRows > 0 Then MessageBox.Show("数据添加成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) End If End Using Catch ex As Exception MessageBox.Show($"错误信息:{ex.Message}", "MySQL连接错误", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Using updateTableBelow() End Sub End Class
关键修改点说明
- 字段名处理:将
Book Id修改为`Book Id`,符合MySQL标识符规则。 - 参数化查询:用
@参数名替代字符串拼接,彻底避免SQL注入和特殊字符导致的语法错误。 - 资源管理:使用
Using语句自动释放连接、命令、数据读取器等资源,无需手动调用Dispose或Close,更安全可靠。 - 执行方法替换:用
ExecuteNonQuery执行插入操作,该方法返回受影响的行数,可用于判断操作是否成功。 - DataTable优化:每次更新表格时创建新的DataTable,避免旧数据重复加载。
内容的提问来源于stack exchange,提问作者mathduck
相关产品推荐
相关产品推荐

