2011-12-31 67 views
2

我是vb.net的新手,我试图查询数据库并将行中的记录打印到控制台窗口。我已经开始工作了,但我有一种感觉,有一种更简洁的方式来做到这一点。我确信有一件事是错误的,那就是我必须将数据集转换为数据表才能检索值。那是对的吗?你可以看看下面的代码(特别是for循环),让我知道我可以改进什么?更好的方式来打印从vb.net数据表中的行

谢谢!

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 

回答

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 

最后一个音符:因为你只是打印到控制台,它并不重要,多,但只要你处理很多串,特别是那些要连接,你应该总是考虑使用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) 
+0

非常感谢您的重写! – 2011-12-31 19:46:47

相关问题