ASP.NET C#中PostgreSQL LIKE运算符查询返回空值问题排查
问题分析与解决方案
原可运行代码(字符串拼接SQL)
public void select() { string str = "SELECT * FROM gazettes g WHERE g.title LIKE '%"+ hidden_key.Value +"%' OR serial LIKE '%"+ hidden_key.Value +"%'"; /*'%' || @title || '%'*/ SqlDataSource1.SelectCommand = str; GV_Gazette.DataBind(); }
参数化版本的错误点
- 核心错误:
SqlDataSource1.SelectCommand = dt.ToString();dt是DataTable对象,调用ToString()只会返回类型名System.Data.DataTable,这根本不是有效的SQL语句,导致SqlDataSource执行无效查询,自然返回空结果。 - 逻辑冗余:你已经通过
c.PopulateData(cmd)获取到了填充好的查询结果DataTable,没必要再通过SqlDataSource中转绑定,直接把GridView和DataTable关联即可。
修正后的代码
public void select() { string str = "SELECT * FROM gazettes g WHERE g.title LIKE @title OR serial LIKE @title"; cmd.CommandText = str; // 若cmd是复用对象,先清空旧参数避免重复添加 cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@title", "%" + hidden_key.Value + "%"); DataTable dt = c.PopulateData(cmd); // 直接绑定DataTable到GridView GV_Gazette.DataSource = dt; GV_Gazette.DataBind(); }
额外注意事项
- 如果
cmd是类成员变量(复用的命令对象),每次使用前必须调用cmd.Parameters.Clear(),否则会重复添加参数,引发参数数量不匹配的异常。 - 参数化查询能有效避免SQL注入风险,是推荐的数据库操作方式,比直接拼接SQL更安全可靠。
内容的提问来源于stack exchange,提问作者Lolly Molly
相关产品推荐
相关产品推荐

