0

Visual Basic (vb.net) をいじり始めたばかりで、TextBox に複数のデータベース行を表示しようとしています。これまでのところ、次のようになっています。

Private Sub foobox_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Dim conn As MySqlConnection

        conn = New MySqlConnection
        conn.ConnectionString = connStr

        Try
            conn.Open()
        Catch myerror As MySqlException
            MsgBox("No connection")
        End Try

        Dim myAdaptor As New MySqlDataAdapter

        Dim sqlquery = "SELECT * FROM foo ORDER BY id DESC"
        Dim myCommand As New MySqlCommand()
        myCommand.Connection = conn
        myCommand.CommandText = sqlquery

        myAdaptor.SelectCommand = myCommand
        Dim myData As MySqlDataReader
        myData = myCommand.ExecuteReader()

        If myData.HasRows Then
            myData.Read()
            Viewer.Text = myData("foo1") & myData("foo2")

        End If

        myData.Close()
        conn.Close()

    End Sub

これはデータベースに正常に接続しますが、1行しか出力しません。どうすればさらに出力できますか?

4

2 に答える 2

2

データを読み取り、StringBuilder に行ごとに格納するループが必要です。
次に、読み取りループを終了するときに、テキストボックスの Text プロパティを設定します

    Dim sb as StringBuilder = new StringBuilder()
    While myData.Read()
        sb.AppendLine(myData("foo1") & myData("foo2"))
    End While
    Viewer.Text = sb.ToString        

もちろん、テキストボックスのMultiLineプロパティをTrueに設定する必要があります

あなたの質問に対するこの直接的な回答とは別に、使用後に接続とデータリーダーを破棄するようにコードを変更する必要があります。ここでは必要ないため、DataAdapter も削除しました。

    Using conn = New MySqlConnection(connStr)
        Try
            conn.Open()
        Catch myerror As MySqlException
            MsgBox("No connection")
        End Try

        Dim sqlquery = "SELECT * FROM foo ORDER BY id DESC"
        Dim myCommand As New SqlCommand(sqlquery, conn)
        Using myData = myCommand.ExecuteReader()
            Dim sb as StringBuilder = new StringBuilder()
            While myData.Read()
                sb.AppendLine(myData("foo1") & myData("foo2"))
            End While
            Viewer.Text = sb.ToString        
        End Using
    End Using
于 2013-03-04T21:42:30.863 に答える
1

ある種のループが必要です。また、Usingステートメントを使用して、例外が発生した場合でもすべての管理されていないリソースが破棄されるようにします (接続も閉じます)。

Using conn As New MySqlConnection(connStr)
    Using myCommand As New MySqlCommand("SELECT * FROM foo ORDER BY id DESC", conn)
        Try
            conn.Open()
            Using myData = myCommand.ExecuteReader()
                If myData.HasRows Then
                    While myData.Read()
                        Dim line = String.Format("{0}{1}{2}",
                                                 myData.GetString(myData.GetOrdinal("foo1")),
                                                 myData.GetString(myData.GetOrdinal("foo1")),
                                                 Environment.NewLine)
                        viewer.Text &= line
                    End While
                End If
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.ToString())
        End Try
    End Using
End Using

ただし、複数のレコードを表示する場合は、代わりに をお勧めしListBoxます。多くのアイテムでより効率的であり、それらを互いに論理的に分離します。

viewer.Text &= line(に置き換えるだけですListBox1.Items.Add(line))

于 2013-03-04T21:50:32.153 に答える