【问题标题】:Access 2007 VBA Query Shows Data in Query Analyzer But Not in VBA Coded RecordsetAccess 2007 VBA 查询在查询分析器中显示数据,但在 VBA 编码记录集中不显示
【发布时间】:2010-09-20 05:09:24
【问题描述】:

我编写了一个函数,该函数最初应该采用字符串字段并使用值填充 Excel 电子表格。这些值不断出现为空。我开始将其跟踪回记录集,发现尽管查询有效并且通过 Access 查询分析器正常运行,但记录集为空或缺少字段。

为了测试这个问题,我创建了一个子程序,在其中创建了一个查询,打开了一个记录集,然后对值进行了分页(将它们输出到消息框)。问题中最令人困惑的部分似乎围绕查询的“WHERE”子句展开。如果我不在查询中放置“WHERE”子句,则记录集总是有数据,并且“DESCRIPTION”的值是正常的。

如果我将 anything 放入 WHERE 子句,则记录集要么完全为空 (rs.EOF = true),要么在其他字段具有值的情况下,描述字段完全为空白。我想再次强调,如果我 debug.print 查询,我可以将其复制/粘贴到查询分析器中,并获得我期望的有效和返回值。

我肯定会很感激这方面的帮助。谢谢!

Private Sub NewTest()

'  Dimension Variables
'----------------------------------------------------------
Dim rsNewTest As ADODB.Recordset
Dim sqlNewTest As String
Dim Counter As Integer

'  Set variables
'----------------------------------------------------------
Set rsNewTest = New ADODB.Recordset

sqlNewTest = "SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, " & _
                "dbo_part.partdescription as Description, dbo_partmtl.qtyper as [Qty Per] " & _
            "FROM dbo_partmtl " & _
            "LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum " & _
            "WHERE dbo_partmtl.mtlpartnum=" & Chr(34) & "3C16470" & Chr(34)

'  Open recordset
rsNewTest.Open sqlNewTest, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

    Do Until rsNewTest.EOF

        For Counter = 0 To rsNewTest.Fields.Count - 1
            MsgBox rsNewTest.Fields(Counter).Name
        Next

        MsgBox rsNewTest.Fields("Description")

        rsNewTest.MoveNext

    Loop

'  close the recordset

rsNewTest.Close
Set rsNewTest = Nothing

End Sub

编辑:有人要求我发布查询的 DEBUG.PRINT。这里是:

SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, dbo_part.partdescription as [Description], dbo_partmtl.qtyper as [Qty Per] FROM dbo_partmtl LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum WHERE dbo_partmtl.mtlpartnum='3C16470'

我已经尝试过使用 ASCII 字符和隐式的双引号和单引号。

例如:

"WHERE dbo_partmtl.mtlpartnum='3C16470'"

我什至用 chr(39) 尝试过你的建议:

"WHERE dbo_partmtl.mtlpartnum=" & Chr(39) & "3C16470" & Chr(39)

两者都返回一个空值作为描述。但是,如果我 debug.print 查询并将其粘贴到 Access 查询分析器中,它会显示得很好。同样(作为旁注),如果我在 WHERE 子句中执行 LIKE 语句,它将给我一个完全空的记录集。这里确实有些奇怪。


这是一个有趣的花絮。这些表链接到SQL Server。如果我在本地复制表(数据和结构),上面的 ADO 代码可以完美运行。如果我使用 DAO,它可以正常工作。我已经在Windows XPAccess 2003 和各种版本的ADO (2.5, 2.6, 2.8) 上尝试过此代码。如果表已链接,ADO 将不起作用。

ADO 中存在一些导致该问题的缺陷。


我当然愿意。请记住,您看到的DEBUG.PRINT 查询在查询分析器中运行良好。它返回以下内容:

工作/子版本描述每件数量 36511C01 主电气外壳 1 36515C0V 视觉系统 1 36529C01 主电气外壳 1

但是,当通过记录集运行时,相同的查询会返回空的描述值(其他一切都相同)(由于“Null”值导致消息框错误)。


我尝试将“description”字段重命名为“testdep”,但它仍然是空的。使其显示数据的唯一方法是删除查询的 WHERE 部分。我开始相信这是 ADO 的问题。也许我会用 DAO 重写它,看看我得到了什么结果。

编辑:我也尝试了几次压缩和修复。没有骰子。

【问题讨论】:

  • 描述字段始终为空,但其他字段可以有数据(取决于 where 子句)。如果我在 where 子句中使用“LIKE”,它将返回一个完全空的记录集。与往常一样,查询分析器返回正确的数据。这可能是我使用 ADO 的问题吗?

标签: vba ms-access ms-access-2007 ado


【解决方案1】:

当使用 ADO LIKE 搜索时,必须使用 % 而不是 *。我知道 * 在 Access 中有效,但由于某些愚蠢的原因,除非您改用 %,否则 ADO 将无法工作。

我遇到了同样的问题,并在尝试修复它时访问了这个论坛。用 % 替换 * 对我有用。

【讨论】:

    【解决方案2】:

    描述是一个保留字 - 在 SELECT 语句中用一些 [] 括号括起来

    编辑

    尝试将列命名为描述之外的其他名称

    您还确定在 where 子句中使用相同的值 - 因为它是左连接,所以如果 dbo_part 中没有相应的记录,Description 字段将为空白

    再次编辑

    如果您得到有趣的结果 - 尝试压缩/修复数据库 - 它可能已损坏

    【讨论】:

      【解决方案3】:

      好吧,我担心的就是这种情况。它适用于 DAO 但不适用于 ADO。

      这是工作代码:

      Private Sub AltTest()
      
      '  Dimension Variables
      '----------------------------------------------------------
      Dim rsNewTest As DAO.Recordset
      Dim dbl As DAO.Database
      
      Dim sqlNewTest As String
      Dim Counter As Integer
      
      '  Set variables
      '----------------------------------------------------------
      
      sqlNewTest = "SELECT dbo_partmtl.partnum as [Job/Sub], dbo_partmtl.revisionnum as Rev, " & _
                      "dbo_part.partdescription as [TestDep], dbo_partmtl.qtyper as [Qty Per] " & _
                  "FROM dbo_partmtl " & _
                  "LEFT JOIN dbo_part ON dbo_partmtl.partnum = dbo_part.partnum " & _
                  "WHERE dbo_partmtl.mtlpartnum=" & Chr(39) & "3C16470" & Chr(39)
      
      
      Debug.Print "sqlNewTest: " & sqlNewTest
      Set dbl = CurrentDb()
      Set rsNewTest = dbl.OpenRecordset(sqlNewTest, dbOpenDynaset)
      
      
      ' rsnewtest.OpenRecordset
      
          Do Until rsNewTest.EOF
      
              For Counter = 0 To rsNewTest.Fields.Count - 1
                  MsgBox rsNewTest.Fields(Counter).Name
              Next
      
              MsgBox rsNewTest.Fields("TestDep")
      
              rsNewTest.MoveNext
      
          Loop
      
      '  close the recordset
      
      dbl.Close
      Set rsNewTest = Nothing
      

      结束子

      我没有在这个数据库中的任何地方使用 DAO,并且不想开始。我们从这里去哪里?

      【讨论】:

      • 您使用的是最新的 ADO 版本吗?你安装的是什么版本?也许下载并安装最新的 MDAC 包?
      • 我在 Vista 64 - SP1 上运行。参考是说 ADO v2.8... 但是,我也尝试过 2.5 和 2.6。你知道 - Office 2007 一直看起来更糟。我在 2003 年从未遇到过 ADO 问题。:\
      • 我之前遇到过问题 ADO(2.6 版),但 2.8 对我来说非常可靠。
      • 我有一个参考 ADO 6.0 版的选项...以前从未听说过...
      • 那是 Vista 的 - 这就是你应该使用的版本!!
      【解决方案4】:

      我知道这个线程开始以来已经过去了一段时间,但如果您想知道,我发现了一些对 Access 2003 的好奇,并且该错误可能已经延续到 2007 年(我可以看到它已经)。

      我在 WHERE 子句中遇到了类似的问题,因为我需要一个包含时间的日期字段中的记录,所以整个字段内容看起来像 #6/14/2011 11:50:25 AM# (#的添加用于格式化目的)。

      与上述相同的问题,查询可以正常使用“WHERE ((tblTransactions.TransactionDate) Like '” & QueryDate & “*');”在查询设计视图中,但在使用 ADO 的 VBA 代码中不起作用。

      所以我求助于使用 "WHERE ((tblTransactions.TransactionDate) Like '" & QueryDate & " %%:%%:%% %M');"在 VBA 代码中,使用 ADO,它工作得很好。显示我正在寻找的记录,诀窍是不要在 Like 子句中使用“*”;或者至少这是我的问题。

      【讨论】:

      • 显然,DAO 对日期值进行部分比较没有问题(您使用 LIKE),而 ADO 不喜欢这样。我认为 DAO 也不应该这样做,因为 SQL 应该在实际存储的值上运行,而不是在显示的字符串表示上运行。
      【解决方案5】:

      我在 SELECT 语句中的“描述”一词周围加上了括号,但它的行为仍然存在。只要我不在 WHERE 子句中添加任何内容,它就可以正常工作。我发现如果我在 where 子句中放了任何东西,描述是空白的(尽管出现在查询分析器中)。如果我在 WHERE 子句中使用 LIKE 语句,整个记录集是空的,但它在查询分析器中仍然可以正常工作。

      【讨论】:

      • 尝试将列命名为描述之外的其他名称
      • 另外你确定你在 where 子句中使用相同的值 - 因为它是左连接,所以如果 dbo_part 中没有相应的记录,Description 字段将为空
      • 我已尝试重命名该列。我发布了 debug.print,以便您可以看到输入到查询分析器中的确切查询。
      • "Description" 是 Access 中的保留字,但我不确定它是否是 Jet 保留字。
      【解决方案6】:

      最终我认为这是在 Vista 64 上运行 ADO 2.8 的问题

      就我个人而言,我一直在 Access 项目中使用 DAO。

      【讨论】:

        猜你喜欢
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 2011-01-06
        相关资源
        最近更新 更多