PostgreSQL日期字段空值查询问题:C#工具中空参数处理报错
解决日期参数空值忽略的方法
1. 调整SQL条件逻辑(兼容现有字符串拼接方式)
你原来的CASE写法会在strdate为空时返回NULL,导致WHERE条件不成立,改成和year/titel一致的OR逻辑即可:
strSQL = $@"SELECT year, titel, date FROM mydb.records WHERE true AND (year = '{stryear}' or '' = '{stryear}') AND (titel = '{strtitel}' or '' = '{strtitel}') AND (date = '{strdate}' OR '' = '{strdate}')";
注:修正了你原SQL里的笔误——第二个AND条件误写为year = '{strtitel}',应该是titel = '{strtitel}'。
如果想用NULLIF,需要正确处理NULL判断(SQL中不能用=判断NULL,必须用IS NULL):
AND (date = NULLIF('{strdate}', '') OR NULLIF('{strdate}', '') IS NULL)
2. 推荐使用参数化查询(避免SQL注入+更稳定)
直接拼接字符串存在严重SQL注入风险,且易出现类型转换错误,用C#参数化查询更安全可靠:
// 编写带参数的SQL模板 string sqlTemplate = @"SELECT year, titel, date FROM mydb.records WHERE 1=1 AND (year = @Year OR @Year = '') AND (titel = @Titel OR @Titel = '') AND (date = @Date OR @Date IS NULL)"; // 创建数据库命令并添加参数 using (var cmd = new SqlCommand(sqlTemplate, yourDbConnection)) { cmd.Parameters.Add("@Year", SqlDbType.VarChar).Value = stryear; cmd.Parameters.Add("@Titel", SqlDbType.VarChar).Value = strtitel; // 将空字符串转为DBNull.Value,适配SQL的NULL判断逻辑 cmd.Parameters.Add("@Date", SqlDbType.Date).Value = string.IsNullOrEmpty(strdate) ? DBNull.Value : strdate; // 执行查询并处理结果 using (var reader = cmd.ExecuteReader()) { // 读取数据逻辑 } }
参数化查询会自动处理日期类型转换,避免格式错误,同时彻底杜绝SQL注入风险。
内容的提问来源于stack exchange,提问作者MarkusH
相关产品推荐
相关产品推荐

