Question

I have written some code for retrieving 3 seperate columns from my database, yet for some reason it isn't loading all of the records which result from my query.
Or well, at least it doesn't seem to do so.

Also, for some reason it won't show me a messagebox which should tell me howmany records have been read after the reader is closed.

Here's my code:

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

Edit: I noticed that when calling the form twice in a row, the second time I do get this error:

An unhandled exception of type 'System.ArgumentException' occurred in Microsoft.VisualBasic.dll Additional information: Argument 'Length' must be greater or equal to zero.

And it refers to this line of code:

yy = CInt(Replace(Mid(loc, 1, loc.IndexOf(",")), ".", ",", 1, -1, CompareMethod.Text))

Last but not least, the values which are used in that line of code:

    loc "7.305e-04]]"   String
    yy  131 Integer

PS: This may be helpful: the values which are in survivor.worldspace are in this format initially:

[168,[1291.16,5343.54,0.27]]

Was it helpful?

Solution

If the message box is not being displayed then the most likely situation is that an exception is being thrown inside the while loop which is probably silently caught somewhere else.

Unfortunately there are just too many places where an exception might occur withing that while loop so it's hard to say from just looking at that code. It could be trying to cast a DBNull to string, or an index out of bounds, etc.

My suggestion is to either step through with the debugger and identify the offending line, or put a try catch inside the while loop and put a break-point inside the catch. That should give you information about what (and where) the exception is occurring is..

Based on your update it looks like the problem is the arguments passed to the Mid() functions. Based on your data it looks like you are attempting to get a sub-string of loc using the start index of 1 and the end index of -1 which is what loc.IndexOf(",") returns in that case because there is no , (comma) in loc.

You probably want to re-factor that code a bit.. In particular it looks like you are actually trying to replace . with , but doing it after your attempt to call Mid(). That seems to be your problem!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top