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

編集:フォームを2回続けて呼び出すと、2回目にこのエラーが発生することに気付きました:

タイプ 'System.ArgumentException' の未処理の例外が Microsoft.VisualBasic.dll で発生しました追加情報: 引数 '長さ' は 0 以上である必要があります。

そして、次のコード行を参照します。

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

4

1 に答える 1

1

メッセージ ボックスが表示されない場合、最も可能性の高い状況は、while ループ内で例外がスローされ、おそらく別の場所で静かにキャッチされていることです。

残念ながら、その while ループ内で例外が発生する可能性のある場所が多すぎるため、そのコードを見ただけでは判断が困難です。文字列にキャストしようとしDBNullたり、範囲外のインデックスを作成しようとしている可能性があります。

私の提案は、デバッガーをステップ実行して問題のある行を特定するか、while ループ内に try キャッチを配置して、キャッチ内にブレークポイントを配置することです。これにより、例外が発生しているもの (および場所) に関する情報が得られるはずです..

更新に基づいて、Mid()関数に渡される引数に問題があるようです。データに基づいてloc、開始インデックス 1 と終了インデックス-1を使用して部分文字列を取得しようとしているように見えloc.IndexOf(",")ます。,loc

おそらく、そのコードを少しリファクタリングしたいと思う.でしょ,Mid()。それはあなたの問題のようです!

于 2013-03-20T19:53:41.040 に答える