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