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

开发赛事日期搜索功能遇问题,请求代码排查修复

问题排查与修复

代码中的核心问题

  • 参数类型不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:10:30