【问题标题】:Better way to print out rows from a datatable in vb.net从 vb.net 中的数据表中打印出行的更好方法
【发布时间】:2012-01-31 04:13:39
【问题描述】:

我是 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

【问题讨论】:

    标签: vb.net dataset iteration


    【解决方案1】:

    以下是我将如何重写它的几个原因:

    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)
    

    【讨论】:

    • 非常感谢您的重写!
    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2016-08-11
    • 2012-12-05
    • 1970-01-01
    相关资源
    最近更新 更多