2017-01-05 33 views
-4

したがって、Accessデータベース(2007)のテーブルから特定の列を読み取るVb.Netプロジェクトで実行するコードがあります。次に、Datagridviewに結果を設定します。問題はコードが乱雑です、私はすべての出来事を処分しています...等。それを最適化する方法はありますか?私が読んだところから、私は "using"というコマンドを使うことができますが、それを実装しようとして問題があります。このコードのクリーンアップに関するヘルプは関連しています。このデータベースコードを最適化する(Vb.Net)

Sub Populate_RecordsList_Via_Database() 

    'Create a connection to the database 
    Dim strConnection As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=SBS2257_Info.accdb;" 
    Dim objConnection As New OleDbConnection(strConnection) 

    'Open the connection with error handling 
    Try 
     objConnection.Open() 
    Catch OleDbExceptionErr As OleDbException 
     MessageBox.Show(OleDbExceptionErr.Message) 
    Catch InvalidOperationErr As InvalidOperationException 
     MessageBox.Show(InvalidOperationErr.Message) 
    End Try 

    'Create a command object with the SQL statement needed to select the first and last names 
    Dim strSQL As String = "SELECT [RecordID], [FName], [LName], [SBAlias1] FROM [Records];" 
    Dim objCommand As New OleDbCommand(strSQL, objConnection) 

    'Create a data adapter and data table then fill the data table 
    Dim objDataAdapter As New OleDbDataAdapter(objCommand) 
    Dim objDataTable As New DataTable("Info") 
    objDataAdapter.Fill(objDataTable) 

    'close connection and release resources 
    objConnection.Close() 
    objConnection.Dispose() 
    objConnection = Nothing 
    objCommand.Dispose() 
    objCommand = Nothing 
    objDataAdapter.Dispose() 
    objDataAdapter = Nothing 

    'Populate datagridview 
    For Each row As DataRow In objDataTable.Rows 

     Dim n As Integer = DGV_ListView.Rows.Add() 
     DGV_ListView.Rows.Item(n).Cells(0).Value = row.Item("RecordID") 
     DGV_ListView.Rows.Item(n).Cells(1).Value = row.Item("FName") 
     DGV_ListView.Rows.Item(n).Cells(2).Value = row.Item("LName") 
     DGV_ListView.Rows.Item(n).Cells(3).Value = row.Item("SBAlias1") 

    Next 

    'Release resources 
    objDataTable.Dispose() 
    objDataTable = Nothing 


End Sub 
+0

参照:[ステートメント(Visual Basic)の使用](https://msdn.microsoft.com/en-us/library/htd05whh.aspx) 'Close()'と 'Dispose()'は同じことを行います。つまり、一方は他方を呼び出します。変数を 'Nothing'に設定する必要もありません。あなたは 'Using'ステートメントによって3つすべてを置き換えることができます。 –

+0

usingステートメントにはどのようなコマンドを入れますか?のような:新しいOleDbDataAdapter(objCommand)としてobjDataAdapterを使用しますか? –

+0

グリッドを埋めるために独自のコードでループを開始するのではなく、グリッドDataSourceプロパティをDataTableに設定するのはなぜですか? – Steve

答えて

0

使い方は、使い捨てオブジェクトの周りで非常に便利です。つまり、IDisposableインターフェイスを実装するすべてのクラスは、そのライフタイム中に取得されたアンマネージリソースを解放することになっています。

ただし、ADO.NET there is no unmanaged resourceでは、OleDbDataAdapterとDataTableを削除する必要はありませんが、DbConnection基本クラスによって派生したクラスについては非常にお勧めします。

だからあなたの改訂コードは、この

Sub Populate_RecordsList_Via_Database() 

    Dim strSQL As String = "SELECT [RecordID], [FName], [LName], [SBAlias1] FROM [Records];" 
    Dim strConnection As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=SBS2257_Info.accdb;" 
    Try 
     Using objConnection = New OleDbConnection(strConnection) 
     Using objCommand = New OleDbCommand(strSQL, objConnection) 
     'Using objDataAdapter = New OleDbDataAdapter(objCommand) 
      Dim objDataTable As New DataTable("Info") 
      objDataAdapter.Fill(objDataTable) 
      ' No need to loop over the datatable, just assign it to the DataSource property 
      DGV_ListView.DataSource = objDataTable 
     'End Using 
     End Using 
     End Using 
    Catch OleDbExceptionErr As OleDbException 
     MessageBox.Show(OleDbExceptionErr.Message) 
    Catch InvalidOperationErr As InvalidOperationException 
     MessageBox.Show(InvalidOperationErr.Message) 
    End Try 
End Sub 

お知らせのtry/catchのようなものかもしれない例外的な状況は、このコンテキストで発生する可能性がどこに伝えることはできませんので、すべてのものだけではなく、接続の開口部を囲みます。

+0

データソースを使用してバインドする場合、colヘッダーをユーザーフレンドリーな名前に再割り当てするにはどうすればよいですか? –

+0

ああ、今私はそれを縛りたくない理由を覚えています。 Datagridviewを事前に選択することで、書式設定と編集不可能な行、カスタムヘッダーを設定できます。データソースの使用はすべての書式設定をバイパスし、設計時ではなく実行時にコードを生成する必要があります。 –

+0

はい、それは当てはまりますが、パフォーマンスに関しては、おそらくこのタスクをNETコードに残して、ヘッダーと行のカスタマイズを記述する必要があります。ところで、デザイナーでグリッドをカスタマイズしてから、InitializeComponentメソッドを見て、カスタマイズコードをつかんで、Constructor/Load/Shownイベントハンドラーに貼り付けて、デザイナーからすべて削除します。 – Steve

関連する問題