将Access表加载到DataSet .NET中

时间:2015-12-23 21:28:10

标签: .net vb.net ms-access-2013

美好的一天,

我使用VB.NET中的OleDbDataAdapter将查询结果加载到数据集中。

但是,当我单步执行代码时,它只会将列加载到数据集中而不是查询中的行。

我确实通过将查询结果导出到单独的Access DB中进行了简短的测试,然后尝试加载它并且它正常工作。

我不确定 Fill 的命令是否支持加载查询结果?

这是我用来加载Access表的代码:

    Dim dsAccess As New DataSet
    Dim da As OleDb.OleDbDataAdapter

    Try
        If conAccess.State = ConnectionState.Open Then
            sql = "SELECT * FROM " & strTblName
            da = New OleDb.OleDbDataAdapter(sql, conAccess)


            da.Fill(dsAccess, strTblName)
        Else
            Return False
        End If
    Catch ex As System.Exception
        Return False
    Finally
        da = Nothing
    End Try

注意,我已编辑此问题以显示我的"查询"的实际表格结构。

enter image description here

我尝试执行选择的查询。

查询的设计视图:

enter image description here

希望这有助于诊断此问题!

2 个答案:

答案 0 :(得分:1)

在没有检查错误消息的情况下进行尝试捕获并不是一个好主意。 MessageBox.Show(ex.Messasge)。您是否尝试过这个或者完全从try-catch中取出代码来查看是否抛出异常?

请尝试使用以下代码并对连接字符串和表名进行适当修改。希望返回数据或抛出异常。

还有一件事,如果字段名称中包含空格,例如名字你可能需要做一些像SELECT [First Name] ...而且如果任何字段是reserve words,比如Date,你应该将它们包装在[]中。

Public Sub SimpleDemo()
    Dim dt As New DataTable
    Dim strTblName As String = "SomeTable"
    Using cn As New OleDb.OleDbConnection With
        {
            .ConnectionString = "Your connection string goes here"
        }
        Using cmd As New OleDb.OleDbCommand With
            {
                .Connection = cn,
                .CommandText = "SELECT * FROM " & strTblName
            }
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
    End Using

    MessageBox.Show(dt.Rows.Count.ToString)
End Sub

答案 1 :(得分:0)

好的,经过多次研究,我终于找到了加载表格的方法。我在这里张贴此内容,以便遇到此事的其他人可以使用它!

无论如何,我发现当你使用Microsoft Access时,OleDbAdapter并不喜欢Like语句使用*通配符的事实。我发现在使用OleDbAdapter时你必须使用%运算符。一个简单的替换工作。

基本上我所做的就是,我找到了View后面的实际查询。我得到了它的视图定义(这是包含Like的讨厌的查询,从那里我只做了一个简单的替换)。

这里是代码(发布此代码以帮助其他人节省一些时间):

                Dim dtMeta As DataTable = conAccess.GetSchema("Tables")

                If drTableType.Length > 0 Then
                    If drTableType(0).Item("TABLE_TYPE") = "VIEW" Then
                        dtMeta = Nothing
                        dtMeta = conAccess.GetSchema("Views")
                        drTable = dtMeta.Select("TABLE_NAME='" & strTblName & "'")
                        If drTable.Length > 0 Then
                            strOriginalQuery = drTable(0).Item("VIEW_DEFINITION").ToString()
                            strModifiedQuery = strOriginalQuery.Replace("*", "%")

                            Dim myCommand As OleDbCommand = New OleDbCommand()
                            myCommand.CommandText = strModifiedQuery
                            da = New OleDbDataAdapter(myCommand.CommandText, conAccess)
                            da.Fill(dsAccess, strTblName)
                        End If
                    Else
                        da.Fill(dsAccess, strTblName)
                    End If
                End If

使用GetSchema方法获取表格的名称,然后再向下使用该方法再次检索Views集合,从这里我得到了{ {1}}后面有实际查询。