System.Data.SqlClient.SqlException: ')'附近语法错误,求排查解决
问题分析与解决
错误原因
- 直接拼接用户输入到SQL语句中,一旦输入包含单引号(比如书名是
Pemrograman 'VB.NET'),会破坏SQL语句的语法结构,触发')'附近有语法错误 - 未对数字类型字段(JmlhBuku,书籍数量)做类型校验,若输入非数字内容,也会引发语法错误
- 未指定插入的列名,若表结构新增列或列顺序调整,会导致参数与列不匹配的问题
修复后的代码
采用参数化查询重构代码,同时优化输入校验逻辑:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 严谨校验输入是否为空或仅含空格 If String.IsNullOrWhiteSpace(NamaBukuBox.Text) Or String.IsNullOrWhiteSpace(PngrngBukuBox.Text) Or String.IsNullOrWhiteSpace(PnrbtBukuBox.Text) Or String.IsNullOrWhiteSpace(JmlhBukuBox.Text) Then MsgBox("Isi Semua Kolom Informasi") Return End If ' 校验书籍数量是否为有效整数 Dim jmlhBuku As Integer If Not Integer.TryParse(JmlhBukuBox.Text, jmlhBuku) Then MsgBox("Jumlah Buku harus berupa angka") Return End If ' 使用参数化查询执行插入操作 Using cmd As New SqlCommand("INSERT INTO BukuTbl (NamaBuku, PngrngBuku, PnrbtBuku, JmlhBuku) VALUES (@NamaBuku, @PngrngBuku, @PnrbtBuku, @JmlhBuku)", Con) Try Con.Open() ' 为参数赋值 cmd.Parameters.AddWithValue("@NamaBuku", NamaBukuBox.Text) cmd.Parameters.AddWithValue("@PngrngBuku", PngrngBukuBox.Text) cmd.Parameters.AddWithValue("@PnrbtBuku", PnrbtBukuBox.Text) cmd.Parameters.AddWithValue("@JmlhBuku", jmlhBuku) cmd.ExecuteNonQuery() MsgBox("Buku Telah Ditambahkan") Catch ex As Exception MsgBox($"Terjadi kesalahan: {ex.Message}") Finally ' 确保连接关闭 If Con.State = ConnectionState.Open Then Con.Close() End If End Try End Using End Sub
关键改进点
- 参数化查询:彻底避免字符串拼接导致的语法错误,同时杜绝SQL注入风险
- 输入校验优化:用
String.IsNullOrWhiteSpace更严谨地检查空输入,新增数字类型校验避免无效数据 - Using语句:自动释放SqlCommand资源,防止资源泄漏
- 指定插入列名:明确指定目标列,即使表结构变化,只要列名不变就不会出错
- 异常捕获:捕获并展示具体错误信息,便于后续排查问题
内容的提问来源于stack exchange,提问作者Muhammad Rafif Rais
相关产品推荐
相关产品推荐

