同系列的第九篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/48474545
VB6基本數據庫應用(九):【增補篇】不同的引擎的語法差異
正篇在寫的時候出了一些問題。這些問題在以前的內容中沒有被提及,或者提及了卻沒有細說,如今在繼續的時候如果不說清楚,會讓後面的學習變得含混不清,爲此決定發佈兩篇增補篇,來解決一下以前的遺留問題。
本來打算用LIKE模糊查詢,讓賬戶框可以顯示出符合當前開頭賬戶名。結果卻發現無論怎麼查詢都沒有結果。當時候我寫的SQL語句是這樣的:
SELECT * FROM UserAccount WHERE AccountName LIKE '幾*'
幾羅星人是我爲自己創建的賬號,結果這個語句在Access裏能查到賬戶名是“幾羅星人”的記錄,而在VB裏卻沒有任何記錄返回。
幾經查找,才發現是數據庫引擎在作怪。雖然我知道不同的數據庫對SQL的支持不一樣,不過沒想到會栽在這裏。
原來,SQL有自己的國際標準ANSI SQL,而微軟的Access數據庫使用的是自己的Jet OLEDB數據庫引擎(在連接字符串中也有體現,如下圖),兩者雖然絕大多數的語法一樣,但是還是有一定的差異,而這個通配符就是其中之一。
下面的表格列出了Access、SQL Server以及ADO所使用的SQL語法:
數據庫/對象 |
SQL語法 |
Access |
Jet SQL |
SQL Server |
ANSI SQL |
ADO |
ANSI SQL |
顯然,Access和我們所使用的ADO所支持的語法是不一樣的,所以才導致了SQL語句在Access能用,在VB上不能用的現象。
實際上,目前發現的差異並不多。一個是Jet SQL中的Betweenvalue1 And value2,允許value1> value2,但這並沒有什麼卵用,這種情況下結果與交換value1與value2的位置產生的結果是一樣的。
第二個差異就是通配符,下面的表格列出了兩種語法支持的通配符以及對應關係:
Jet SQL |
ANSI SQL |
||
匹配類型 |
模式 |
匹配類型 |
模式 |
多個字符:* |
a*a |
多個字符:% |
a%a |
*ab* |
%ab% |
||
ab* |
ab% |
||
特殊字符:[] |
a[*]a |
未提及 |
|
單個字符:? |
a?a |
單個字符:_ |
a_a |
單個數字:# |
a#a |
單個數字:[0-9] |
a[0-9]a |
字符範圍:[?-?] |
[a-z] |
字符範圍:[_-_] |
[a-z] |
範圍之外:[!?-?] |
[!a-z] |
同樣 |
|
數字值:[#-#] |
[0-9] |
||
非數字值:[!#-#] |
[!0-9] |
||
複合值:組合上述語法 |
a[!b-m]# |
主要的差異爲多個字符的表示,一個字符的表示,一個數字的表示有不同。
所以,當初的SQL語句在VB中應該寫成:
SELECT * FROM UserAccount WHERE AccountName LIKE '幾%'
而且值得注意的是,不能直接在Access的查詢中使用ANSI SQL語法,也就是說兩種語法互不兼容,只能使用一種。
下一篇依然是增補篇,簡介遊標與鎖。
下一篇:【增補篇】遊標Cursor和鎖Lock簡介 http://blog.csdn.net/jiluoxingren/article/details/48738905