我正在研究一个项目,该项目允许用户按名称搜索排行榜数据库。鼓励我使用try ... except语句来停止错误(如果数据库不包含该名称),但是我不熟悉如何使用它,因此遇到了问题。请问我哪里出了问题以及如何纠正它?我希望记录显示搜索的名称,或者如果不存在该名称,则不显示任何记录。
Imports System.Data.OleDb
Public Class FrmAllResults
Dim CtnConnection As OleDbConnection
Dim DsDataset As New DataSet()
Dim StrConnectionString As String = vbNull
Dim StrSql As String
Private Sub FrmAllResults_Load(sender As Object, e As EventArgs) Handles MyBase.Load
StrConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=..\..\..\DbIteration2Database.mdb"
StrSql = "select * from Leaderboard"
CtnConnection = New OleDbConnection(StrConnectionString)
CtnConnection.Open()
Dim AdptOleDbAdapter As OleDbDataAdapter = New OleDbDataAdapter(StrSql, CtnConnection)
AdptOleDbAdapter.Fill(DsDataset)
AdptOleDbAdapter.Dispose()
LblAllResults.Text = DsDataset.Tables(0).ToString
End Sub
Private Sub BtnSearch_Click(sender As Object, e As EventArgs) Handles BtnSearch.Click
Dim StrNameSearched As String = TxtName.Text
Dim StrLeaderboardEntry As String
Try
StrLeaderboardEntry = (DsDataset.Tables(0).Rows(0).Item(StrNameSearched).ToString)
Catch ex As Exception
StrLeaderboardEntry = vbNull
End Try
LblAllResults.Text = StrLeaderboardEntry
End Sub
End Class
您可能对此感到困惑,因为这是对异常处理的错误使用。 (并且鼓励您这样做的人都误导了您。)异常是代码中意外的错误。
例如,如果代码根本无法连接到数据库,那么它可能会生成异常,并且应用程序应该能够从该异常中恢复。在数据中找不到匹配的记录也不例外。这不是错误。这只是一个简单的“未找到结果”的情况。
问题是找到了代码[[assumes结果,并且在此处人为地产生了错误:
StrLeaderboardEntry = (DsDataset.Tables(0).Rows(0).Item(StrNameSearched).ToString)
如果未找到任何记录,则Rows
将为空,因此将导致错误,因为代码假定
Rows
永远不会为空。该假设不正确,因此请更改假设。例如:If DsDataset.Tables(0).Rows.Count > 0 Then
StrLeaderboardEntry = (DsDataset.Tables(0).Rows(0).Item(StrNameSearched).ToString)
Else
' No records were found. Notify the user in some way.
End If
这找到了另一个很好的例外示例。如果查询成功,那么我至少希望Tables
总是有一个元素,这样的假设要安全得多,如果它为假,则确实发生了意外情况(异常)。但是Rows
在正常情况下在搜索中肯定可以为空,因此代码应期望并处理。作为一般建议,切勿将
Try/Catch
用于可以用If/Else
处理的内容。