Access 2007 VBA查询在查询分析器中显示数据但不在VBA编码记录集中显示数据

时间:2008-10-31 15:29:28

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

我有一个我编写的函数,最初应该采用字符串字段并使用值填充excel电子表格。这些价值不断上升。我开始将它追溯到记录集,发现尽管查询有效且通过Access查询分析器正常运行,但记录集为空或缺少字段。

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

如果我将任何放入WHERE子句中,记录集将返回完全为空(rs.EOF = true),或者说明字段完全为空,其他字段具有值。我想再次强调,如果我调试查询,我可以将其复制/粘贴到查询分析器中,并获得我期望的有效和返回值。

我肯定会感谢你的帮助。谢谢!

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)

两者都返回null值以进行描述。但是,如果我调试查询并将其粘贴到Access查询分析器中,它显示就好了。再次(作为附注),如果我在WHERE子句中执行LIKE语句,它将给我一个完全空的记录集。这里真的很不可思议。


这是一个有趣的小贴士。这些表链接到SQL Server。如果我在本地复制表(数据和结构),上面的ADO代码可以完美地工作。如果我使用DAO它工作正常。我在Windows XPAccess 2003以及各种版本的ADO (2.5, 2.6, 2.8)上尝试了此代码。如果表格已链接,ADO将无效。

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


我绝对是。请记住,您看到的DEBUG.PRINT查询在查询分析器中运行完美。它返回以下内容:

Job/Sub     Rev         Description                     Qty Per
36511C01     A          MAIN ELECTRICAL ENCLOSURE       1
36515C0V     A          VISION SYSTEM                   1
36529C01     A          MAIN ELECTRICAL ENCLOSURE       1

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


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

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

6 个答案:

答案 0 :(得分:3)

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

我遇到了同样的问题,并在尝试解决此问题时运行此论坛。用%替换*对我有用。

答案 1 :(得分:1)

描述是一个保留字 - 在SELECT语句中放置一些[]括号

修改

尝试将列命名为“描述”

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

再次编辑

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

答案 2 :(得分:1)

嗯,我担心的是这种情况。它与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

End Sub

我不在这个数据库的任何地方使用DAO,也不愿意启动。我们从哪里开始?

答案 3 :(得分:1)

我知道自从这个帖子开始以来已经过了一段时间,但是万一你想知道,我发现了一些对Access 2003的好奇,这个bug可能已经延续到了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子句中使用“*”;或者至少那是我的问题。

答案 4 :(得分:0)

我在SELECT语句中的“描述”一词旁边放了括号,但它的行为仍然存在。只要我没有在WHERE子句中放置任何内容,它就可以正常工作。我发现如果我在where子句中放入任何内容,描述是空白的(尽管在查询分析器中显示)。如果我在WHERE子句中使用LIKE语句,则整个记录集为空,但它仍然可以在查询分析器中正常工作。

答案 5 :(得分:0)

最终我觉得在Vista 64上运行ADO 2.8是个问题

我个人总是在Access项目中使用DAO。