在vb.net中从数据表打印行的更好方法

在vb.net中从数据表打印行的更好方法,vb.net,dataset,iteration,Vb.net,Dataset,Iteration,我是vb.net新手,正在尝试查询数据库并将行中的记录打印到控制台窗口。我让它工作,但我有一种感觉,有一个更简洁的方式来做到这一点。我确信有一件事是错误的,那就是我必须将数据集转换为datatable才能检索值。对吗?你能看看下面的代码(特别是for循环)并告诉我可以改进什么吗 谢谢 Module Module1 Sub Main() Dim constring As String = "Data Source=C:\Users\test\Desktop\MyDatabase1.sd

我是vb.net新手,正在尝试查询数据库并将行中的记录打印到控制台窗口。我让它工作,但我有一种感觉,有一个更简洁的方式来做到这一点。我确信有一件事是错误的,那就是我必须将数据集转换为datatable才能检索值。对吗?你能看看下面的代码(特别是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
副标题()
Dim解释为String=“数据源=C:\Users\test\Desktop\MyDatabase1.sdf”
Dim conn作为新SqlCeConnection(施工)
Dim cmd作为新的SqlCeCommand(“从帐户选择*)
Dim适配器作为新的SqlCeDataAdapter
将ds作为新数据集()进行调整
尝试
康涅狄格州公开赛
cmd.Connection=conn
adapter.SelectCommand=cmd
adapter.Fill(ds,“testds”)
cmd.Dispose()
adapter.Dispose()
康涅狄格州关闭
作为DataTable=ds.Tables.Item(“testds”)的Dim dt
将行变暗为数据行
Dim count As Integer=dt.Columns.count()
对于dt.行中的每一行
尺寸i为整数=0

而我以下是我将如何重写这篇文章的原因:

1) 您应该始终对一次性物品使用
语句,以确保它们得到正确清理。您使用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

最后一个注解:由于您只是在控制台上打印,这并不重要,但是每当您处理很多字符串时,尤其是要连接的字符串时,您应该总是考虑使用.< /P> 下面是一个使用stringbuilder打印到控制台的循环重写示例(在内存中构建字符串,然后将其转储到控制台;我还添加了字段名以便于度量):

输出为新System.Text.StringBuilder(500)
对于i,作为整数=0到reader.FieldCount-1
如果sbOutput.Length为0,则
sbOutput.Append(“;”)
如果结束
sbOutput.Append(reader.GetName(i)).Append(“=”).Append(reader.GetString(i))
下一个
sbOutput.AppendLine()
Console.Write(sbOutput.ToString)

非常感谢您重新编写!
 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)