如何用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
相关产品推荐
相关产品推荐

