繁体   English   中英

优化此数据库代码 (Vb.Net)

[英]Optimize this Database Code (Vb.Net)

所以我有在 Vb.Net 项目中运行的代码,该项目从 Access 数据库 (2007) 的表中读取特定列。 然后用结果填充 Datagridview。 问题是代码很乱,我正在处理所有事件……等等。 有没有办法优化它? 从我读到的内容来看,我可以使用“using”命令,但在尝试实现它时遇到了问题。 任何有关清理此代码的帮助都是相关联的。

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

using 语句对于一次性对象非常有用。 这意味着实现 IDisposable 接口的每个类都应该释放在其生命周期中获得的非托管资源。

然而,在ADO.NET 中没有非托管资源,因此并不真正需要处理 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 包含所有内容,而不仅仅是连接的打开,因为您永远无法判断在这种情况下哪里会出现异常情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM