You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中MySQL添加按钮SQL语法错误问题求助

解决VB.NET连接MySQL添加按钮的SQL语法错误

错误原因分析

  1. 字段名语法错误:表字段Book Id包含空格,MySQL中带空格或特殊字符的字段必须用**反引号()**包裹,否则SQL解析器会将Book和Id`识别为两个独立标识符,触发语法错误。
  2. 错误的执行方法:插入操作使用ExecuteReader是错误的,该方法仅用于执行查询并读取结果集,插入/更新/删除操作应使用ExecuteNonQuery。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:47:40