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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:05:39