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

如何用TextBox过滤DataGridView?遇Npgsql.NpgsqlException异常求助

解决Npgsql查询触发的NpgsqlException异常(TextBox过滤DataGridView场景)

兄弟,你这个问题的根源很明确——直接把TextBox的内容拼接到SQL语句里,这不仅会因为特殊字符(比如单引号、百分号)破坏SQL语法结构抛出异常,还存在极高的SQL注入风险,绝对是要避免的写法。

先看看你的原代码问题出在哪:

Dim strSql As String = "select * from Caixa where Recibo like '%" + textBox18.Text + "%'"
Dim con As New Conexao
Dim cmd As New npgSqlCommand(strSql, Conexao.Conectar)
cmd.CommandType = CommandType.Text
Dim da As New npgSqlDataAdapter(cmd)
Dim dt As New DataTable()
da.Fill(dt)
GDLoadCaixa.DataSource = dt

举个例子,如果用户在textBox18里输入O'Neil,拼接后的SQL会变成select * from Caixa where Recibo like '%O'Neil%',这里的单引号直接打乱了SQL的语法逻辑,数据库自然会抛出异常。

正确解决方案:使用参数化查询

参数化查询是处理这类场景的标准做法,既能彻底规避SQL注入,又能自动处理特殊字符的转义,解决语法错误问题。修改后的代码如下:

' 用参数占位符替代直接字符串拼接
Dim strSql As String = "select * from Caixa where Recibo like @ReciboValue"

Dim con As New Conexao
' 使用Using语句确保数据库资源自动释放,避免内存泄漏
Using cmd As New NpgsqlCommand(strSql, Conexao.Conectar)
    ' 添加参数,将模糊查询的通配符和TextBox内容组合后传入
    cmd.Parameters.AddWithValue("@ReciboValue", "%" & textBox18.Text & "%")
    cmd.CommandType = CommandType.Text
    
    Using da As New NpgsqlDataAdapter(cmd)
        Dim dt As New DataTable()
        da.Fill(dt)
        GDLoadCaixa.DataSource = dt
    End Using
End Using

关键细节说明

  • 参数占位符:@ReciboValue是参数的占位符,数据库会把它当作独立的参数处理,而非SQL语句的一部分,从根源上避免语法破坏
  • 参数传递:AddWithValue方法会自动处理特殊字符的转义,不管用户输入什么内容,都不会干扰SQL的语法结构
  • 资源管理:Using语句会在代码块结束后自动释放NpgsqlCommand和NpgsqlDataAdapter的资源,比手动关闭更可靠

额外排查建议

如果修改后仍有异常,可以添加异常捕获逻辑,打印更详细的错误信息,方便定位问题:

Try
    ' 上面的参数化查询代码
Catch ex As NpgsqlException
    MessageBox.Show("数据库错误:" & ex.Message & vbCrLf & "内部详情:" & ex.InnerException?.Message)
Catch ex As Exception
    MessageBox.Show("其他错误:" & ex.Message)
End Try

内容的提问来源于stack exchange,提问作者Leogreen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:16:07