VB.NET秒表数据存入Access数据库报错及定时自动保存实现方法
问题解答
数据类型不匹配报错的解决思路
- 首先校验文本异常:直接对
CATimer.Text做 Trim 处理清除不可见空白/控制字符再写入,修改参数赋值代码为:
绝大多数该类报错都是因为计时控件更新文本时附带了不可见字符,额外的Label赋值时相当于做了一次清洗所以能正常写入。cmd.Parameters.Add("@CAHours", OleDbType.VarChar).Value = CATimer.Text.Trim() - 确认控件与字段类型匹配:
- 检查
CATimer控件确实是文本显示类控件(Label/TextBox),不要和系统自带的Timer计时控件混淆,确保其Text属性就是你要存储的时长文本 - 确认Access中
SaintStaff表的StaffHours字段类型和你传入的参数类型一致:如果该字段设为数值/时间类型,不要直接传字符串,先把时长文本转成对应类型再写入,比如转成总分钟数的整数,或者转成TimeSpan类型传入,后续统计工时也更方便。
- 检查
- 注意OleDb参数匹配规则:OleDb不支持命名参数匹配,完全按照参数添加的顺序和SQL语句中占位符的顺序一一对应,不要随意调整参数的Add顺序,否则也会触发类型不匹配报错。
每分钟自动执行更新的实现方法
直接新增一个独立的Timer控件实现定时触发即可,步骤如下:
- 在窗体设计器中添加新的
System.Windows.Forms.Timer控件,命名为AutoSaveTimer,将其Interval属性设置为60000(单位为毫秒,60000ms=1分钟) - 给
AutoSaveTimer添加Tick事件处理,将你现有TestButton_Click中的数据库保存逻辑完整复制到该Tick事件中即可,可额外加运行状态判断减少无用数据库请求:
Private Sub AutoSaveTimer_Tick(sender As Object, e As EventArgs) Handles AutoSaveTimer.Tick ' 仅计时运行时更新数据,可根据需求调整判断条件 If CAstopwatch.IsRunning Then ' 此处复制原有TestButton_Click中的数据库更新代码 End If End Sub
- 在窗体加载事件中启动该计时器即可:
Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load AutoSaveTimer.Start() End Sub
- 额外补充:如果需要应用关闭时强制保存最新数据,直接在窗体的
FormClosing事件中调用一次相同的保存逻辑即可。
内容的提问来源于stack exchange,提问作者SaintKev
相关产品推荐
相关产品推荐

