如何通过文本框搜索功能返回日期列中空值与指定范围的所有记录
解决方法
核心逻辑调整说明
SQL中NULL值和任意值进行大小比较、等于比较的结果都为UNKNOWN,不会被WHERE条件筛选出来,必须单独使用IS NULL判断匹配空值。同时注意逻辑运算优先级:AND优先级高于OR,所以必须把原来的日期范围条件用括号包裹,避免逻辑错误。
1. 修改SQL查询语句
首先修正你原有代码中的三处错误:
- 表别名错误:语句中的
b.[Created_DateTime]需改为v.[Created_DateTime] - 变量名错误:拼接SQL时用的
DateStart、DateEnd和方法入参DateS、DateE不匹配 - SELECT字段缺失:需要查询
Created_DateTime字段才能在前端展示创建日期
修改后的查询逻辑如下,同时建议直接替换为参数化查询,避免SQL注入风险和日期格式兼容问题:
protected int DoItemList(SqlConnection connection, StringBuilder sb, string DateS, string DateE, string filter) { string sql = ""; SqlCommand readCommand = null; SqlDataReader reader = null; int count = 0; try { string itemFilter = DoFilter(filter); // 新增IS NULL判断,用括号包裹原有日期范围条件 sql = @"SELECT v.[Code], v.[Created_DateTime] FROM [CAS].[dbo].[Van] v WHERE (v.[Created_DateTime] >= @DateStart AND v.[Created_DateTime] <= @DateEnd) OR v.[Created_DateTime] IS NULL"; readCommand = new SqlCommand(sql, connection); // 参数化传值,自动处理日期格式转换 readCommand.Parameters.AddWithValue("@DateStart", DateTime.ParseExact(DateS, "MM-dd-yyyy", System.Globalization.CultureInfo.InvariantCulture)); readCommand.Parameters.AddWithValue("@DateEnd", DateTime.ParseExact(DateE, "MM-dd-yyyy", System.Globalization.CultureInfo.InvariantCulture)); reader = readCommand.ExecuteReader(); while (reader.Read()) { count++; AddRowItem(sb, reader, count); } reader.Close(); } catch (Exception e) { // 建议补充异常日志输出 } return count; }
2. 修复空值转换方法
原有ConvertDate方法没有处理数据库NULL值(对应C#的DBNull类型),会导致空值时报错,修改如下:
private string ConvertDate(Object obj) { // 处理数据库空值 if (obj == DBNull.Value) { return "null"; // 可根据需求改为空字符串等其他展示值 } if (obj is DateTime dt) { return dt.ToString("yyyy-MM-dd"); // 可调整为你需要的日期展示格式 } else { return obj?.ToString() ?? ""; } }
3. 调整行拼接逻辑
适配新增的创建日期字段,修改AddRowItem方法:
protected void AddRowItem(StringBuilder sb, SqlDataReader reader, int index) { sb.Append("<tr>"); sb.Append("<td>").Append(reader["Code"].ToString()).Append("</td>"); sb.Append("<td>").Append(ConvertDate(reader["Created_DateTime"])).Append("</td>"); sb.Append("</tr>"); }
内容的提问来源于stack exchange,提问作者MushroomT A.C.T
相关产品推荐
相关产品推荐

