同样的Access查询,直接找开或DAO打开结果正确,但使用ADO代码打开则结果不正确

2017-09-07 23:13:00
zstmtony
原创
417


今天有Access网友在Access QQ群中提出个问题,完全一样的Access查询,直接找开或DAO打开结果正确,但使用ADO代码打开则结果不正确

就是查询如果比较复杂的话,通过ADO获取这个查询的记录的时候,有些字段的值全部是空的

如果用Access双击打开这个查询,里面的值又是可以计算出来的,最后我只有手工的将查询的结果转存到表里,然后读表,好坑



找了个Access实例( 问卷扣分查询 与ADO代码对比)



查询与ADO代码对比的结果




查询的详细SQL视图里的语句如下:



SELECT 问卷扣分.网点代码, IIf((问卷选项.K0 Like '*4*')+(问卷选项.K0 Like '*5*')+(问卷选项.K0 Like '*6*'),-1,IIf(IIf(IsNull(问卷扣分.K0),0,问卷扣分.K0)+IIf(IsNull(问卷扣总分.K0),0,问卷扣总分.K0)<0,IIf(IsNull(问卷扣分.K0),0,问卷扣分.K0)+IIf(IsNull(问卷扣总分.K0),0,问卷扣总分.K0),0)) AS K0 FROM 问卷扣分 INNER JOIN (问卷选项 INNER JOIN 问卷扣总分 ON 问卷选项.网点代码 = 问卷扣总分.网点代码) ON 问卷扣分.网点代码 = 问卷扣总分.网点代码;




而使用ADO VBA代码 如下:


Public Sub ff()
    Dim rs As New ADODB.Recordset
    rs.Open "Select 网点代码,K0 From 问卷扣分查询1", CurrentProject.Connection
    Do Until rs.EOF
        Debug.Print rs.Fields(0).Value, rs.Fields(1).Value
        rs.MoveNext
    Loop
    rs.Close
End Sub


但ADO获取的结果不对。


经过分析,原来是 ADO 的SQL 中的通配符必须 使用 % ,而不是使用 *


1. 解决办法一:将查询中的 * 改为 % ,则通过  ADO调用正常 (tmtony)


SELECT 问卷扣分.网点代码, IIf((问卷选项.K0 Like '%4%')+(问卷选项.K0 Like '%5%')+(问卷选项.K0 Like '%6%'),-1,IIf(IIf(IsNull(问卷扣分.K0),0,问卷扣分.K0)+IIf(IsNull(问卷扣总分.K0),0,问卷扣总分.K0)<0,IIf(IsNull(问卷扣分.K0),0,问卷扣分.K0)+IIf(IsNull(问卷扣总分.K0),0,问卷扣总分.K0),0)) AS K0 FROM 问卷扣分 INNER JOIN (问卷选项 INNER JOIN 问卷扣总分 ON 问卷选项.网点代码 = 问卷扣总分.网点代码) ON 问卷扣分.网点代码 = 问卷扣总分.网点代码; 


还真的是啊,可是Access上显示的结果就是错误的,看来Access是用的DAO运算的查询
忘记了ADO使用%的了
【管理员】tmtony小辣椒(18449932)  17:58:13
ADO是使用%
所以这个要2边都使用,最好是把查询Sql 放在代码里


我只能将ado 换成dao 了,得将我原来的adohelper 类模块换成daohelper 才能统一了
【话唠】ZPY2(1928323988)  18:22:36
ado不能匹配%?
【话唠】ZPY2(1928323988)  18:25:56
能转义的吧
【吐槽】064-姚文涛-10年(21959068)  18:26:10
不是,我得将查询里的*换成%,这样双击这个查询打开看到的结果就是错误的,当然用ado 读取的记录集数据就对了
两者不一致,容易造成使用的人迷糊
【话唠】ZPY2(1928323988)  18:27:11

【话唠】ZPY2(1928323988)  18:28:18
可以都用  %做通配符的,数据库 选项 兼容 sql
【话唠】ZPY2(1928323988)  18:30:31

这个转义 ,我倒是忘了,是那个了 Excel是左上~


2. 解决办法二 :ZPY2的解决办法 可以都用  %做通配符的,数据库 选项 兼容 sql


【话唠】ZPY2(1928323988) 2017/09/07 18:37:55
工具 选项 表/查询 有个 兼容 sql server 选项
    分享