【发布时间】: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 XP、Access 2003 和各种版本的ADO (2.5, 2.6, 2.8) 上尝试过此代码。如果表已链接,ADO 将不起作用。
ADO 中存在一些导致该问题的缺陷。
我当然愿意。请记住,您看到的DEBUG.PRINT 查询在查询分析器中运行良好。它返回以下内容:
但是,当通过记录集运行时,相同的查询会返回空的描述值(其他一切都相同)(由于“Null”值导致消息框错误)。
我尝试将“description”字段重命名为“testdep”,但它仍然是空的。使其显示数据的唯一方法是删除查询的 WHERE 部分。我开始相信这是 ADO 的问题。也许我会用 DAO 重写它,看看我得到了什么结果。
编辑:我也尝试了几次压缩和修复。没有骰子。
【问题讨论】:
-
描述字段始终为空,但其他字段可以有数据(取决于 where 子句)。如果我在 where 子句中使用“LIKE”,它将返回一个完全空的记录集。与往常一样,查询分析器返回正确的数据。这可能是我使用 ADO 的问题吗?
标签: vba ms-access ms-access-2007 ado