VB6基本數據庫應用(九):【增補篇】不同的引擎的語法差異

同系列的第九篇,上一篇在: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章