我是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
答案 0 :(得分:3)
以下是我将如何重写此内容的原因:
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
最后一点:由于你只是打印到控制台,它并不重要,但是每当你处理很多字符串时,尤其是那些要连接的字符串,你应该总是考虑使用{{3 }}
以下是使用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)