JET-SQL 是否支援 ACCESS APP的內建函數 比如 DSUM() ?

來源:互聯網
上載者:User

JET-SQL 是否支援 ACCESS APP的內建函數 比如 DSUM() ? 一直以為不能,結果上周在論壇,看到這個貼子,http://topic.csdn.net/u/20090119/15/44bb05d8-cd87-4861-8f4c-c9d3ec662d74.html

 

 表一
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中使用這些內建函數。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.