2013-03-20 1 views
0

Я написал код для извлечения 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 

Edit: я заметил, что при вызове формы дважды подряд, второй раз, когда я получаю эту ошибку:

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

И это относится к этому строка кода:

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

И последнее, но не менее важное, Valu эс, которые используются в этой строке кода:

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

PS: Это может быть полезно: значения, которые находятся в survivor.worldspace в этом формате изначально:

[168,[1291.16,5343.54,0.27]]

ответ

1

Если ящик сообщений не отображается, тогда наиболее вероятная ситуация заключается в том, что исключение выбрасывается внутри цикла while, который, вероятно, бесшумно попадает в другое место.

К сожалению, есть слишком много мест, где может возникнуть исключение, если это цикл while, поэтому трудно сказать, просто глядя на этот код. Это может быть попытка наложить DBNull на строку или индекс за пределы и т. Д.

Мое предложение состоит в том, чтобы либо пройти через отладчик, либо определить линию нарушения, либо поместить попытку уловить внутри цикла while и поставить точку останова внутри улова. Это должно дать вам информацию о том, что (и где) имеет место исключение.

На основании вашего обновления похоже, что проблема заключается в аргументах, переданных в функции Mid(). Основываясь на ваших данных, похоже, что вы пытаетесь получить подстроку loc, используя начальный индекс 1 и конечный индекс -1, что и есть то, что loc.IndexOf(",") возвращает в этом случае, потому что нет , (запятая) в loc.

Возможно, вы захотите немного перефразировать этот код. В частности, похоже, что вы на самом деле пытаетесь заменить . на ,, но делаете это после попытки позвонить Mid(). Кажется, это твоя проблема!

 Смежные вопросы

  • Нет связанных вопросов^_^