JET-SQL 是否支持 ACCESS APP的内建函数 比如 DSUM() ? 一直以为不能,结果上周在论坛,看到这个贴子,
表一
questionid 选项1 选项2 选项3 选项4
1 S D I C
2 D S I C
3 I D S C
4 C S I D
5 S I C D
6 C D I S
表二
nameid name questionid 选项
001 小章 1 4
001 小章 2 2
001 小章 3 2
001 小章 4 3
001 小章 5 2
001 小章 6 1
表三
tool 分数
D 5
I 6
S 7
C 8
要求得到的结果为
nameid name D总数 I总数 S总数 C总数 总分数
001 小章 1 2 1 2 40
由于没有说明是在ASP+ACCESS环境下,所以直接在ACCESS环境中做了测试,
create table 表一
(
questionid integer,
选项1 char,
选项2 char,
选项3 char,
选项4 char
)create table 表二
(
nameid varchar(4),
name varchar(20),
questionid integer,
选项 integer
)create table 表三
(
tool char,
分数 integer
)TRANSFORM Sum(q1.CNT) AS CNTOfSum
SELECT q1.nameid, q1.name
FROM (
select a.nameid,a.name,a.questionid, Choose(选项,选项1,b.选项2,b.选项3,b.选项4) & '总数' as CATE,1 as CNT
from 表二 a inner join 表一 b on a.questionid=b.questionid
union all
select a.nameid,a.name,a.questionid,'总分数' as CATE ,dlookup("分数","表三","tool='" & Choose(选项,选项1,b.选项2,b.选项3,b.选项4) & "'" )
from 表二 a inner join 表一 b on a.questionid=b.questionid
) q1
GROUP BY q1.nameid, q1.name
PIVOT q1.CATE ;nameid name C D I S 总分数
001 小章 2 1 2 1 40
结果,发现要求是在ASP中,一直以为在JET-SQL中是不支持诸如 DUM() 这些ACCESS APPLITION 内建函数的。 本打算改成IIF 和 子查询,不过心存侥幸,到本机的IIS上试着用ASP试了一下这个语句,竟然能通过!!!。
几天来一直很奇怪,因为记忆中这些函数以前开发的时候是不行的。 今天又测试了一下看看是不是因为本机安装了ACCESS程序的原因。结果在服务器上用ASP一试,果然报错。
为什么同样的JET-SQL,有ACCESS的机器上可以?没有ACCESS的不行?
利用 MS的 Filemon.exe来得到系统访问了哪些文件的log,结果没有什么异常,再用 Regmon.exe来看注册表的访问历史,结果看到
dllhost.exe:2708 HKLM/SOFTWARE/ODBC/odbcinst.ini/Microsoft Access Driver (*.mdb)/setup C:/WINNT/system32/odbcjt32.dll
再比较两台机器上的odbcjt32.dll
结果本机的是, 版本是4.0.6200.0
Directory of C:/WINNT/system32
06/21/2003 04:00a 270,608 odbcjt32.dll
1 File(s) 270,608 bytes
0 Dir(s) 35,632,940,032 bytes free
服务器上的是, 4.0.6305.0, 版本反而高?!
Directory of C:/WINNT/system32
02/17/2007 03:43 PM 278,559 odbcjt32.dll
1 File(s) 278,559 bytes
0 Dir(s) 347,160,576 bytes free
在继续跟踪,发现,本机的访问 c:/Program Files/Microsoft Office!!
原来如此。 就是在MS Office安装的时候,会将增加一些注册项指向ACCESS.EXE所在的目录,这样当系统调用 JET-SQL ODBC的时候,会利用OFFICE中的DLL来进行SQL语句的解析。 这样也就解释了为什么在有OFFICE安装的机器上可以用ACCESS的内建函数,但在WINDOWS基本配置上仅有的JET-SQL 驱动仅支持 JET-SQL列出的标量函数。
结论
JET-SQL本身不支持ACCESS的内建函数。 但如果代码运行的环境中安装了MS ACCESS则JET-SQL引擎会调用MS OFFICE中的组件来运行这些函数。故在开发的时候如确认将来的运行环境,
- 如有ACCESS安装(如CS结构,现在WINDOWS用户基本都安装了OFFICE),则可以使用这些函数。
- 如无法保证(如服务器上),则应避免这些函数。用其它方法来替代实现。
考虑到系统将来的移植性,个人认为不推荐在ADO中使用这些内建函数。