我已经编写了一些代码,用于从我的数据库中检索3个单独的列,但由于某种原因,它没有加载我查询产生的所有记录。
或者,至少它似乎没有这样做。
此外,出于某种原因,它不会向我显示一个消息框,它应该告诉我在阅读器关闭后如何读取多少记录。
这是我的代码:
Public Class frmPlayerLocations
Dim str(2), loc As String
Dim xx, yy As Integer
Dim itm As ListViewItem
Private Sub frmPlayerLocations_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ListView1.Columns.Add("ID", 60, HorizontalAlignment.Left)
ListView1.Columns.Add("Name", 115, HorizontalAlignment.Left)
ListView1.Columns.Add("Approximate Location", 115, HorizontalAlignment.Left)
Dim qry = "SELECT profile.unique_id, profile.name, survivor.worldspace FROM profile, survivor WHERE survivor.unique_id = profile.unique_id AND survivor.is_dead = '0' ORDER BY profile.name"
Dim connection As MySqlConnection
connection = New MySqlConnection()
connection.ConnectionString = "Host=" & adminPanel.IP & ";port=" & adminPanel.port & ";user=" & adminPanel.username & ";password=" & adminPanel.password & ";database=" & adminPanel.DBname & ";"
connection.Open()
Dim cmd As New MySqlCommand(qry, connection)
Dim reader As MySqlDataReader = cmd.ExecuteReader()
Dim count As Integer = 0
While reader.Read()
count += 1
str(0) = reader.GetString(0)
str(1) = reader.GetString(1)
loc = reader.GetString(2)
loc = Mid(loc, loc.IndexOf(",") + 3)
xx = CInt(Replace(Mid(loc, 1, loc.IndexOf(",")), ".", ",", 1, -1, CompareMethod.Text))
xx = (xx / 10000)
loc = Mid(loc, loc.IndexOf(",") + 2)
yy = CInt(Replace(Mid(loc, 1, loc.IndexOf(",")), ".", ",", 1, -1, CompareMethod.Text))
yy = 152 - (yy / 10000)
If xx < 100 Then
If xx < 10 Then
loc = "00" & xx.ToString & " | "
Else
loc = "0" & xx.ToString & " | "
End If
Else : loc = xx.ToString & " | "
End If
If yy < 100 Then
If yy < 10 Then
loc &= "00" & yy.ToString
Else
loc &= "0" & yy.ToString
End If
Else : loc &= yy.ToString
End If
str(2) = loc
itm = New ListViewItem(str)
ListView1.Items.Add(itm)
End While
reader.Close()
connection.Close()
MessageBox.Show(count)
End Sub
End Class
编辑:我注意到连续两次调用表单时,第二次出现此错误:
Microsoft.VisualBasic.dll中发生未处理的“System.ArgumentException”类型异常 附加信息:参数“长度”必须大于或等于零。
它引用了这行代码:
yy = CInt(Replace(Mid(loc, 1, loc.IndexOf(",")), ".", ",", 1, -1, CompareMethod.Text))
最后但并非最不重要的是,在该行代码中使用的值:
loc "7.305e-04]]" String
yy 131 Integer
PS:这可能会有所帮助:survivor.worldspace中的值最初采用以下格式:
[168,[1291.16,5343.54,0.27]]
答案 0 :(得分:1)
如果没有显示消息框,那么最可能的情况是在while循环中抛出异常,这可能会在其他地方被静默捕获。
不幸的是,有太多的地方可能会出现while循环的异常,因此很难说只是查看代码。它可能试图将DBNull
转换为字符串,或者将索引转换为界限等等。
我的建议是要么逐步调试并找出有问题的行,要么在while循环中放入try catch并在catch中放入一个断点。这应该为您提供有关发生异常的内容(和位置)的信息..
根据您的更新,问题似乎是传递给Mid()
函数的参数。根据您的数据,您似乎尝试使用起始索引1和 -1 的结束索引来获取loc
的子字符串,这是loc.IndexOf(",")
在这种情况下返回,因为,
中没有loc
(逗号)。
您可能希望稍微重新考虑一下代码..特别是看起来您实际上是尝试将.
替换为,
,但在尝试调用Mid()
后执行此操作}。这似乎是你的问题!