开发赛事日期搜索功能遇问题,请求代码排查修复
问题排查与修复
代码中的核心问题
- 参数类型不匹配:
SearchRace方法参数定义为String,但传入的是DateTime类型的DatRaceSearch.Value,类型不兼容会导致查询失败。 - 列表框对象混淆:清空的是
lstRacesResults,但添加项时用了lstCustomerSearchResults,导致结果无法显示到目标列表框。 - 循环终止错误:
While rs.Read循环内的End语句会直接终止程序,无法遍历所有查询结果。 - 空结果判断逻辑颠倒:当
lstRacesResults.Items.Count >=1时提示无赛事,逻辑完全相反,应在列表为空时才触发提示。 - 参数未正确使用:
SearchRace方法内直接调用DatRaceSearch.Value,而非传入的DayOfTheRace参数,导致方法失去复用性且逻辑冗余。 - 资源未安全释放:未用
Using语句管理数据库连接和命令对象,可能导致连接泄漏。 - 字段名拼写错误:
CurrentNumberOfRacer应为CurrentNumberOfRacers(与MaxNumberOfRacers保持复数形式一致),否则会抛出字段不存在的异常。
修复后的完整代码
Private Sub btnSearchRaces_Click(sender As Object, e As EventArgs) Handles btnSearchRaces.Click SearchRace(DatRaceSearch.Value) End Sub Private Sub SearchRace(DayOfTheRace As DateTime) ' 使用Using确保数据库连接自动释放 Using cn As OleDbConnection = GetConnection() If cn IsNot Nothing Then cn.Open() lstRacesResults.Items.Clear() ' 使用Using管理OleDbCommand,自动释放资源 Using SQLCmd As New OleDbCommand("Select * From TblRaces Where DayOfTheRace = @SearchRace", cn) SQLCmd.Parameters.AddWithValue("@SearchRace", DayOfTheRace.Date) ' 仅传递日期部分,避免时间干扰 Using rs As OleDbDataReader = SQLCmd.ExecuteReader() While rs.Read ' 修正字段名拼写,拼接显示文本 Dim DisplayValue As String = $"{rs("RaceID")} {rs("TrackName")}({rs("BookedTimeSlot")}) {rs("RaceEntryFee")} {rs("MaxNumberOfRacers")} {rs("CurrentNumberOfRacers")}" Dim RaceItem As New ListBoxData(DisplayValue, rs("RaceID")) lstRacesResults.Items.Add(RaceItem) ' 添加到正确的列表框 End While End Using ' 正确判断空结果 If lstRacesResults.Items.Count = 0 Then MessageBox.Show("该日期没有可用赛事", "赛事查询", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End If End Using End If End Using End Sub ' 辅助方法:获取数据库连接(替代原DbConnect(),避免全局连接变量) Private Function GetConnection() As OleDbConnection Try Dim connString As String = "你的数据库连接字符串" ' 替换为实际连接字符串 Return New OleDbConnection(connString) Catch ex As Exception MessageBox.Show("数据库连接失败:" & ex.Message) Return Nothing End Try End Function
额外说明
- 重构了数据库连接获取方式,用
GetConnection方法替代全局cn变量,结合Using语句确保连接自动关闭,避免资源泄漏。 - 查询时仅传递日期部分(
DayOfTheRace.Date),若数据库中DayOfTheRace字段为纯日期类型,可避免因时间部分不匹配导致的查询失败。 - 保留了
ListBoxData自定义项逻辑,确保列表框能正确绑定自定义数据。
内容的提问来源于stack exchange,提问作者JustAKidLearningToProgram
相关产品推荐
相关产品推荐

