2011-12-31 10 views
2

私はvb.netを初めて使用しています。データベースを照会し、その行のレコードをコンソールウィンドウに印刷しようとしています。私はそれを働かせましたが、私はこれを行うためのより簡潔な方法があるという気持ちがあります。私が間違っていることの1つは、値を取得できるようにデータセットをデータテーブルに変換しなければならないということです。あれは正しいですか?以下のコード(特にforループ)を見て、私が改善できるものを教えてください。vb.netのデータテーブルから行を印刷する方が良い

ありがとうございます!

1)あなたは常にそれらが正しくクリーンアップされていることを確認するために使い捨てのオブジェクトとUsingステートメントを使用する必要があります。ここでは

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

は、私はいくつかの理由のためにこれを書き換えるだろうかです。あなたはdisposeコマンドで良いスタートをしましたが、この方法はより安全です。

2)ExecuteReaderを使用すると、すべてをデータセットにロードするより効率的です。

3)try/catchステートメントには、オブジェクトの作成と実行が含まれている必要があります。

最後に、データセットとデータテーブルについての質問に答えて、そのコードは絶対に正しいものでした。つまり、データセットが0個以上のデータセットで構成されているため、データセットから既存のデータテーブルを抽出していました。

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を使用してください。

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) 
;ここ

は、(Iはまた、良好な尺度のフィールド名を追加した、コンソールにそれをダンプし、メモリ内の文字列を構築する)のStringBuilderを使用してコンソールに印刷ループの例書き換えあります

+0

ありがとう、書き直してください! –

関連する問題