如何计算过期日期?产品过期校验代码异常问题咨询
问题分析与修复
你的代码存在两个核心错误,导致总是执行else分支:
1. 计数器计算逻辑错误
循环中的count += count + 1写法错误,会让计数器以指数形式增长(初始0→1→3→7...),哪怕只有1条过期产品记录,最终count也会大于0,直接触发else分支。正确的计数方式应该是每次循环加1:
While dr.Read count += 1 ' 也可以写成 count = count + 1 End While
2. 参数赋值写法错误
这行连续赋值的逻辑存在问题:
a = cmd.Parameters.Add("@exp", MySqlDbType.DateTime).Value = DateTime.Now
你试图同时完成参数添加、赋值并将结果存入a,但实际上会把**赋值操作的布尔结果(True)**转换为日期类型赋值给a,虽然参数可能侥幸被正确赋值,但写法不规范且易出问题。建议改成以下两种规范写法之一:
' 写法1:拆分步骤,更清晰 cmd.Parameters.Add("@exp", MySqlDbType.DateTime) cmd.Parameters("@exp").Value = DateTime.Now ' 写法2:简化赋值 cmd.Parameters.AddWithValue("@exp", DateTime.Now)
修复后的完整代码
conn.Open() cmd = New MySqlCommand("SELECT * FROM tblproduct WHERE expdate < @exp", conn) ' 若认为当天到期不算过期,用<代替<= cmd.Parameters.AddWithValue("@exp", DateTime.Now) dr = cmd.ExecuteReader Dim count As Integer = 0 While dr.Read count += 1 End While conn.Close() If count = 0 Then MsgBox("the product is good") Else MsgBox("the product expired!") End If
额外优化建议
不需要读取所有记录来计数,直接用COUNT(*)查询效率更高:
conn.Open() cmd = New MySqlCommand("SELECT COUNT(*) FROM tblproduct WHERE expdate < @exp", conn) cmd.Parameters.AddWithValue("@exp", DateTime.Now) Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar()) conn.Close() If count = 0 Then MsgBox("the product is good") Else MsgBox("the product expired!") End If
这种写法无需创建DataReader,直接获取计数结果,性能更优。
内容的提问来源于stack exchange,提问作者Othman Athman
相关产品推荐
相关产品推荐

