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

如何计算过期日期?产品过期校验代码异常问题咨询

问题分析与修复

你的代码存在两个核心错误,导致总是执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:25:15