美好的一天,
我使用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
注意,我已编辑此问题以显示我的"查询"的实际表格结构。
我尝试执行选择的查询。
查询的设计视图:
希望这有助于诊断此问题!
答案 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}}后面有实际查询。