Лучший способ распечатать строки из таблицы данных в vb.net - PullRequest
2 голосов
/ 31 декабря 2011

Я новичок в vb.net и пытаюсь запросить базу данных и распечатать записи в строке в окне консоли.Я заставил это работать, но у меня есть чувство, что есть более краткий способ сделать это.Я уверен, что неправильно то, что мне пришлось преобразовать набор данных в набор данных, чтобы получить значения.Это верно?Не могли бы вы взглянуть на приведенный ниже код (особенно цикл for) и дать мне знать, что я могу улучшить?

Спасибо!

Module Module1

Sub Main()

    Dim constring As String = "Data Source=C:\Users\test\Desktop\MyDatabase1.sdf"
    Dim conn As New SqlCeConnection(constring)
    Dim cmd As New SqlCeCommand("SELECT * FROM ACCOUNT")
    Dim adapter As New SqlCeDataAdapter
    Dim ds As New DataSet()

    Try
        conn.Open()
        cmd.Connection = conn
        adapter.SelectCommand = cmd
        adapter.Fill(ds, "testds")
        cmd.Dispose()
        adapter.Dispose()
        conn.Close()

        Dim dt As DataTable = ds.Tables.Item("testds")
        Dim row As DataRow
        Dim count As Integer = dt.Columns.Count()

        For Each row In dt.Rows
            Dim i As Integer = 0
            While i <= count - 1
                Console.Write(row(i))
                i += 1
            End While
            Console.WriteLine(Environment.NewLine())
        Next

    Catch ex As Exception
        Console.WriteLine("There was an error")
        Console.WriteLine(ex)
    End Try

    Console.ReadLine()

End Sub

End Module

1 Ответ

3 голосов
/ 31 декабря 2011

Вот как я бы переписал это по нескольким причинам:

1) Вы должны всегда использовать операторы Using с одноразовыми предметами, чтобы обеспечить их правильную очистку. Вы хорошо начали с команд dispose, но этот способ безопаснее.

2) Более эффективно использовать ExecuteReader, чем загружать все в набор данных.

3) Ваш оператор try / catch должен включать создание и выполнение объектов.

Наконец, в ответ на ваш вопрос о наборах данных и таблицах данных этот код был абсолютно корректным: набор данных состоит из нуля или более наборов данных, поэтому вы просто извлекаете существующий набор данных из набора данных.

    Try
        Dim constring As String = "Data Source=C:\Users\test\Desktop\MyDatabase1.sdf"

        Using conn As New SqlCeConnection(constring)
            conn.Open()
            Using cmd As New SqlCeCommand("SELECT * FROM ACCOUNT", conn)
                Dim reader As SqlCeDataReader

                reader = cmd.ExecuteReader()
                Do While reader.Read
                    For i As Integer = 0 To reader.FieldCount - 1
                        Console.Write(reader.GetString(i))
                    Next
                    Console.WriteLine(Environment.NewLine())
                Loop
            End Using
        End Using
    Catch ex As Exception
        Console.WriteLine("There was an error")
        Console.WriteLine(ex)
    End Try

    Console.ReadLine()
End Sub

Последнее замечание: поскольку вы просто печатаете на консоль, это не имеет большого значения, но всякий раз, когда вы имеете дело со множеством строк, особенно с теми, которые должны быть объединены, вам всегда следует использовать System.Text.StringBuilder .

Вот пример переписывания цикла, который выводится на консоль с использованием stringbuilder (строит строку в памяти, затем выводит ее на консоль; я также добавил имя поля для хорошей меры):

 Dim sbOutput As New System.Text.StringBuilder(500)
 For i As Integer = 0 To reader.FieldCount - 1
     If sbOutput.Length <> 0 Then
         sbOutput.Append("; ")
     End If
     sbOutput.Append(reader.GetName(i)).Append("=").Append(reader.GetString(i))
 Next
 sbOutput.AppendLine()
 Console.Write(sbOutput.ToString)
...