VB如何从Access数据库读取日期时间并与系统时间对比分类展示提醒
VB + Access 实现提醒分有效/过期展示的修正方案
需求说明
窗体需要分别展示两类提醒数据:顶部DataGridView展示未到截止时间的有效提醒,底部DataGridView展示已过截止时间的过期提醒,数据均存储在Access数据库的TblReminder表中。
窗体样式参考:
现有代码存在的问题
- 两次数据库查询逻辑混乱,第二次查询未配置数据库连接和查询语句,运行会直接报错
- 首次查询仅读取了最后一条提醒的日期,没有对全量提醒数据做时间对比
- 日期类型处理逻辑冗余,将FormatDateTime返回的字符串隐式转换为Date类型容易触发格式异常
- 缺少已过期提醒的展示逻辑
- 数据库连接释放不规范,存在连接泄露风险
实现思路
直接在SQL查询层面通过日期过滤分别拿到有效和过期提醒,无需在业务代码中循环判断,效率更高、逻辑更清晰:
- 有效提醒:
SELECT 所需字段 FROM TblReminder WHERE ReminderDate >= Now()(Access内置Now()函数取当前系统时间,和VB的Date.Now格式完全匹配) - 过期提醒:
SELECT 所需字段 FROM TblReminder WHERE ReminderDate < Now() - 直接将查询结果填充到DataTable绑定到对应DataGridView,无需手动逐行添加数据,后续扩展排序、筛选功能也更便捷
修正后完整代码
Imports System.Data.OleDb Public Class frmReminderInfo ' 假定DbConnect()是你已封装的数据库连接方法,连接成功返回True,全局连接对象为cn Private Sub frmReminderInfo_Load(sender As Object, e As EventArgs) Handles MyBase.Load LoadAllReminders() End Sub Private Sub LoadAllReminders() If Not DbConnect() Then MessageBox.Show("数据库连接失败,请检查配置") Exit Sub End If Try ' 加载当前有效提醒到顶部DataGridView Dim currentSql As String = "SELECT ReminderID, CustomerName, DeviceInfo, RepairPrice, ReminderDate FROM TblReminder WHERE ReminderDate >= Now()" Dim currentCmd As New OleDbCommand(currentSql, cn) Dim currentDt As New DataTable() currentDt.Load(currentCmd.ExecuteReader()) DgvCurrentReminders.DataSource = currentDt ' 加载已过期提醒到底部DataGridView,DgvExpiredReminders替换为你实际的控件名称 Dim expiredSql As String = "SELECT ReminderID, CustomerName, DeviceInfo, RepairPrice, ReminderDate FROM TblReminder WHERE ReminderDate < Now()" Dim expiredCmd As New OleDbCommand(expiredSql, cn) Dim expiredDt As New DataTable() expiredDt.Load(expiredCmd.ExecuteReader()) DgvExpiredReminders.DataSource = expiredDt Catch ex As Exception MessageBox.Show("加载提醒数据失败:" & ex.Message) Finally ' 无论是否报错都关闭数据库连接,避免连接泄露 If cn.State = ConnectionState.Open Then cn.Close() End If End Try End Sub End Class
内容的提问来源于stack exchange,提问作者Yousaer10
相关产品推荐
相关产品推荐

