来自 Access 的 Excel VBA SQL 没有结果
Posted
技术标签:
【中文标题】来自 Access 的 Excel VBA SQL 没有结果【英文标题】:Excel VBA SQL from Access no results 【发布时间】:2016-08-17 19:48:17 【问题描述】:使用 Excel 2010 查询 Access 2010 数据库(通过用户窗体)。
当我执行代码时,我得到了我的消息框“No Results”(在 sub 末尾附近调用)。但是,当我输入某个搜索字符串时,应该有 12 条记录被拉出来。
我认为我的 SQL 字符串可能不正确,所以我将 SQL 语句写入 Sheet1 Cell A2。然后我打开了我的 Access 数据库,创建了一个 SQL 查询,并从单元格 A2 复制/粘贴了 SQL 语句——它运行良好。 --> 所以不是 SQL 语句。
为什么我的代码找不到数据? SQL 语句工作正常。当我尝试建立 ADODB 连接时,我没有收到任何错误。
编辑:我在另一个 sub 中使用完全相同的数据库连接设置,它工作正常。
Private Sub searchAllInJobs(searchStr As String)
Dim con As Object, rs As Object, accessFile As String, strTable As String, sql As String, keyStr As String, i As Integer
accessFile = "******************" '<--hidden on purpose
Set con = CreateObject("ADODB.connection")
If Err.Number <> 0 Then
MsgBox "Failed database connection", vbCritical, "Connection Error"
Exit Sub
End If
On Error GoTo 0
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & accessFile
'Wild card string
keyStr = """*" & searchStr & "*"""
'I have tested this SQL statement in the Access database and works great
sql = "SELECT * FROM tbl_job_tables WHERE ([MODELNO] LIKE " & keyStr & ");"
'Write the SQL to a cell, to make sure the statement was constructed properly
Sheets("Sheet1").Range("A2").value = sql
Set rs = CreateObject("ADODB.Recordset")
'Open the database recordset from the SQL statement
rs.Open sql, con
'Clear the current ListBox
Me.list_SearchJobs.Clear
i = 0
If Not (rs.EOF and rs.BOF) Then
'Move to the first item
rs.MoveFirst
'While going through the records, if you haven't reached the End-of-file then...
Do While Not rs.EOF
With Me.list_SearchJobs
.AddItem
.List(i, 0) = rs!JOB_NUM
.List(i, 1) = rs!customer
.List(i, 2) = rs!MODELNO
.List(i, 3) = rs!CREATE_DATE
End With
i = i + 1
rs.MoveNext
Loop
'Close the recordset and database connection
rs.Close
con.Close
'Set the objects to "Nothing" (clears the cache)
Set rs = Nothing
Set con = Nothing
Else
'Close the recordset and database connection
rs.Close
con.Close
'Set the objects to "Nothing" (clears the cache)
Set rs = Nothing
Set con = Nothing
MsgBox "No Results", vbCritical, "No results"
Exit Sub
End If
End Sub
【问题讨论】:
如果您无法创建 ADODB.Connection object,您的错误消息实际上是在生成连接失败,而不是如果它无法连接到数据库。在您进行测试之前移动con.Open
语句以查看它是否可以打开,如果您收到“数据库连接失败”消息,请告诉我们。
好收获。不,错误没有产生。不过,谢谢您接听。
【参考方案1】:
我想我知道为什么会这样。 Access 中的通配符是 *
,但对于大多数其他 SQL 变体,它是 %
。您在这里使用 ADO。见this
试试这个:
keyStr = "%" & searchStr & "%" 'Not sure if you need the extra "'s either
【讨论】:
你是对的。奇怪的是,我曾经使用“%”,但在 Access 2010 中,通配符实际上是星号“*”。我想知道为什么它们如此不同以上是关于来自 Access 的 Excel VBA SQL 没有结果的主要内容,如果未能解决你的问题,请参考以下文章
从 Excel VBA 运行嵌套的 Access SQL 查询
具有更多条件的日期之间的 SQL 查询(VBA Excel - Access)
使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询
在 Excel VBA 中使用长 Access SQL 查询