首页 > 解决方案 > 从 Access 文件到 DataTable 的数据检索不起作用

问题描述

我有一些代码可以将数据库与程序连接起来,但由于某种原因,在运行时它没有显示来自数据库的数据。

Public Class Form2

Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\employee\employee.accdb")
Dim cmd As New OleDbCommand("", con)
Dim empDA As New OleDbDataAdapter
Dim empTable As New DataTable
Dim dr As OleDbDataReader

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Me.EmpTableAdapter.Fill(Me.EmpDataSet.emp)
    Dim cmd As New OleDbCommand("select * from emp", con)
    empDA = New OleDbDataAdapter("select * from emp", con)
    empDA.Fill(empTable)
    DataGridView1.DataSource = empDA
End Sub

标签: vb.netms-access

解决方案


问题中的代码对于需要做什么似乎有点混乱。

变量应该限制在需要它们的最小范围内,并且有些东西需要在使用后处理掉(以避免内存泄漏、文件保持锁定以及其他计算机资源问题)。

对于处置,该Using语句很有用,因为它确保自动完成。

您应该尝试将每段逻辑代码放在适当的小方法中,以便更容易使用。也许是这样的:

Imports System.Data.OleDb

Public Class Form2

    Dim connStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\temp\employee.accdb"

    Sub ShowEmployeeData()
        Dim sql = "SELECT [Id], [FirstName] FROM [Employees] ORDER BY [Id]"

        Using conn As New OleDbConnection(connStr)
            Using cmd As New OleDbCommand(sql, conn)
                Dim employees As New DataTable()
                Dim da As New OleDbDataAdapter(cmd)
                da.Fill(employees)
                DataGridView1.DataSource = employees
            End Using
        End Using

    End Sub


    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ShowEmployeeData()

    End Sub

End Class

所以这个connStr变量在类中的任何地方都可用Form2,并且显示员工数据的代码在它自己的 Sub 中。

查询数据库时,您应该指定您需要的实际列,以便以您想要的顺序返回列,并按其中一个列排序,以便以可预测的顺序返回数据 - 数据库可以自由给出如果您不告诉他们,您可以订购任何东西。


推荐阅读