如何在VB.NET中从Access获取员工排班时间数据?
搞定员工排班时间查询与显示的问题
嘿,我瞅了你的代码,思路是没问题的,但有几个关键细节没处理好,导致可能没法正常获取到排班数据,甚至会报错。我帮你修正一下,顺便说说为啥要这么改:
原代码里的坑
- 执行
ExecuteReader之后直接读列值,但没调用dr.Read()定位到查询结果的行,这肯定会出问题 - 日期参数的添加方式错误,
AddWithValue的写法容易导致类型不匹配 - 没妥善管理数据库连接和阅读器资源,长期运行可能造成资源泄漏
- 异常捕获范围太宽泛,没法准确区分是没找到数据还是其他数据库错误
修正后的完整代码
' 用Using语句自动管理连接,不用手动关连接,省心还安全 Using myConnection As New OleDbConnection("你的数据库连接字符串") myConnection.Open() ' 别用SELECT *,只查咱们需要的两列,效率更高也更清晰 Dim cmd As OleDbCommand = New OleDbCommand("SELECT HoradeComienzodeTrabajo, HoradeConclusiondeTrabajo FROM [Horario] WHERE [IddeEmpleado] = @Id AND [Fecha] = @Fecha ", myConnection) ' 添加员工ID参数 cmd.Parameters.AddWithValue("@Id", txtEmpID.Text) ' 处理日期参数:先验证格式,再转成Date类型,避免参数错配 Dim targetDate As Date If Date.TryParse(lblDate.Text, targetDate) Then cmd.Parameters.AddWithValue("@Fecha", targetDate) Else MsgBox("日期格式不对哦,请检查输入的日期", MsgBoxStyle.OkOnly, "错误提示") Return End If Dim dr As OleDbDataReader = cmd.ExecuteReader() ' 先检查有没有查到数据,再读值 If dr.Read() Then ' 把时间转成字符串显示到标签里 lblComienzo.Text = dr("HoradeComienzodeTrabajo").ToString() lblTermina.Text = dr("HoradeConclusiondeTrabajo").ToString() Else MsgBox("Sorry,No Hay Horario para el ID Entrado", MsgBoxStyle.OkOnly, "Invalid ID") End If ' 用完阅读器记得关掉 dr.Close() End Using
关键改进点说明
Using语句会自动释放数据库连接,避免因忘记关闭连接导致的资源浪费- 只查询需要的列,比
SELECT *更高效,后续维护也能清晰知道获取的是哪些数据 - 增加日期格式验证,避免用户输入的日期格式错误引发数据库异常
- 必须调用
dr.Read()才能定位到结果行,否则无法读取到有效数据 - 明确判断是否查询到数据,不用依赖异常捕获处理“无排班信息”的场景,逻辑更清晰
这样改完之后,你的代码就能稳定地根据员工ID和日期查询排班时间,并正确显示到对应的标签里啦~
内容的提问来源于stack exchange,提问作者Najuto
相关产品推荐
相关产品推荐

