来自 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 = "%" &amp; searchStr &amp; "%" '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 查询

从 Excel VBA 运行工作参数化 Access SQL 查询 (INSERT INTO) 时出现“需要对象”错误

如何使用sql语句和vba将数据从MS-Access导入excel power查询?