ADODB Recordset 返回 Excel 中隐藏列的 Null 值

ADODB Recordset return Null values for hidden columns in Excel

提问人:brutus17 提问时间:11/17/2023 最后编辑:brutus17 更新时间:11/18/2023 访问量:62

问:

我正在尝试使用 ADODB.connection 和 .recordset 对象从 Excel 工作表中检索数据。通常,整个过程不会出现任何错误,但是,当隐藏源 excel 中的列/字段时,记录集查询仅为该特定隐藏列生成“Null”值。

隐藏的列显然可以通过连接/记录集看到,因为没有由于无法识别的字段而导致的 SQL 错误,我什至可以得到 rs。字段(i)。此隐藏列的名称值。但不知何故,ADO 无法获取隐藏列的值。

使用 rs.copyfromrecordset 方法、循环遍历每个字段的所有记录或签入即时窗口时,将返回 Null 值。

我没有看到可以处理这种情况的连接/记录集的任何属性。这是 ADO 的限制/错误吗?

编辑。

对于 ConnectionString,我使用具有读取模式和属性 Excel XML 或 Excel 宏的标准 ACE 提供程序。

cn.ConnectionString = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Mode='Read';" & _
    "Data Source=" & fullFilePath & ";" & _
    "Extended Properties='Excel 12.0 Xml;HDR=YES';"
cn.Open

对于记录集,我使用以下设置。

With rs
    .ActiveConnection = cn
    .CursonType = adOpenStatic
    .Source = SQL_Query
    .Open
End with

将不胜感激任何帮助。谢谢!

SQL Excel VBA ADO

评论

0赞 taller 11/18/2023
请在您的帖子中分享代码。我已经在 Excel 365 上测试了它 () 没有任何问题。Provider=Microsoft.ACE.OLEDB.12.0
0赞 brutus17 11/18/2023
@taller我已经编辑了我的问题以包含代码片段。谢谢
0赞 taller 11/18/2023
请使用简单的sql进行测试。假设 A:F 中有一个隐藏的列。sql = "select * from [sheet1$a:f]"
0赞 brutus17 11/18/2023
它返回可见列的所有值和隐藏列(空列)的 Null 值。返回的列/字段数等于 [sheet1$range] 范围内的列数
0赞 taller 11/18/2023
如果列为空/空,则该值应为 Null。它与隐藏无关。你的预期结果是什么?
1赞 Tim Williams 11/18/2023
该问题列可能具有混合类型(数字/文本/日期)的值?这可能会导致 ADO 返回 null 而不是列中的值。

答:

0赞 brutus17 11/26/2023 #1

正如 Tim 所建议的那样,问题在于受影响列中的值。出于某种原因,Microsoft.ACE.OLEDB 提供程序将该列解释为“日期”类型,并且所有未以“日期”格式格式设置的值都被删除(根据我的理解)。该列在任何单元格中都不包含任何日期值,因此尚不清楚为什么以这种方式解释列类型。我的解决方案是在第一行单元格中插入“ ' ”,以便将该列识别为文本类型。

评论

0赞 Michele La Ferla 11/27/2023
理想情况下,我会更好地格式化答案以显示代码片段