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 

편집 : 여기

내 코드의

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))

적어도 마지막으로는 가치있는 ES 코드의 라인에서 사용되는 :

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

PS :이 유용 할 수 survivor.worldspace에있는 값은 초기에이 형식이다 :

[168,[1291.16,5343.54,0.27]]

답변

1

메시지 박스이면 표시되지 않을 가능성이 가장 높은 상황은 예외가 다른 곳에서 조용히 잡히는 while 루프 내부에 던져지고 있다는 것입니다.

불행히도 예외가 발생할 수있는 곳이 너무 많습니다. while 루프에서는 코드를 보면 말할 수 없습니다. 그것은 문자열로 DBNull, 또는 경계 밖으로 인덱스를 캐스팅하려고 할 수있는 등

나의 제안은 디버거를 통해 단계로 잘못된 라인을 식별하거나, while 루프 내부의 시도 캐치를 넣어 중 하나이며, 캐치 안에 브레이크 포인트를 넣으십시오. 그게 당신에게 어떤 예외가 발생했는지에 대한 정보를 제공해야합니다 ..

업데이트에 따르면 Mid() 함수에 전달 된 인수가 문제 인 것처럼 보입니다. 귀하의 데이터를 바탕으로 시작 인덱스 1과 -1의 종료 색인을 사용하여 loc의 하위 문자열을 얻으려고 시도하는 것 같습니다. loc.IndexOf(","), (쉼표)가 없기 때문에 그 경우에 어떤 문자가 반환됩니까? loc.

아마도이 코드를 다시 고려하고 싶을 것입니다. 특히 .,으로 대체하려고 시도했지만 실제로는 Mid()으로 전화를 시도한 후 시도하는 것처럼 보입니다. 그게 당신 문제예요!