摘要:當今時代是飛速發(fā)展的信息時代,在各行各業(yè)中離不開信息處理,這正是計算機被廣泛應用于信息管理系統(tǒng)原因。VB和SQLServer分別是微軟公司推出的面向?qū)ο蟮某绦蛟O(shè)計語言和大型數(shù)據(jù)庫管理系統(tǒng),具有廣大的用戶群,二者的接合可開發(fā)出功能強大的C/S應用程序。該文就在VB中訪問SQLServer數(shù)據(jù)庫的實現(xiàn)多條件模糊查詢進行了討論,主要介紹在數(shù)據(jù)庫管理系統(tǒng)中實現(xiàn)多條件模糊查詢的方法與技巧。
關(guān)鍵詞:數(shù)據(jù)庫;多條件;模糊查詢
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)35-9904-03
Based on VB Programs and SQL Server Database, Multi-condition of the Realization of Fuzzy Query
WANG Da-long
(Dalian 91550 units 94 units,Dalian 116023,China)
Abstract: The present era is the rapid development of the information age,information processing in all walks of life can not be separated,which is widely used in computer information management system for the reasons.VB and SQLServer are Microsoft's object-oriented programming languages and large database management systems,with large user base,both of the joints can be developed a powerful C/S applications.This access SQLServer in VB database multi-fuzzy query conditions were discussed,mainly introduced in the database management system,multi-conditions,methods and techniques fuzzy queries.
Key words: database; multi-condition; fuzzy query
1 數(shù)據(jù)庫概述及應用
1)數(shù)據(jù)庫概述
數(shù)據(jù)庫應用系統(tǒng)開發(fā)的目標是建立一個滿足擁護長期需要的產(chǎn)品。開發(fā)的主要過程為理解用戶需求,然后,把它們轉(zhuǎn)變?yōu)橛行У臄?shù)據(jù)庫設(shè)計。把設(shè)計轉(zhuǎn)變?yōu)閷嶋H的數(shù)據(jù)庫,并且這些數(shù)據(jù)庫帶有功能完備、高效能的應用。
數(shù)據(jù)庫技術(shù)在計算機軟件領(lǐng)域研究中一直是非常重要的主題,產(chǎn)生于20世紀60年代,30多年來數(shù)據(jù)庫技術(shù)得到了迅速發(fā)展,并已經(jīng)成較為完整的理論體系和一大批實用系統(tǒng)。
2)數(shù)據(jù)庫系統(tǒng)
數(shù)據(jù)庫系統(tǒng)本質(zhì)上是一個用計算機存儲查詢記錄的系統(tǒng)。數(shù)據(jù)庫本身可被看作為一種電子文件柜也就是說,它是收集計算機數(shù)據(jù)文件的倉庫或容器。系統(tǒng)用戶可以對這些文件執(zhí)行插入數(shù)據(jù)、檢索數(shù)據(jù)、更改數(shù)據(jù)、刪除數(shù)據(jù)等一系列操作。
數(shù)據(jù)庫系統(tǒng)是一個計算機存儲記錄的系統(tǒng),即它是一個計算機系統(tǒng),該系統(tǒng)的目標存儲信息并支持用戶檢索和更新所需要的信息。
2 VB簡要概述
Visual Basic是Microsoft公司在1991年推出的用于開發(fā)Windows應用程序的開發(fā)工具,是基于DOS平臺下 Basic編程語言的可視化的程序設(shè)計語言。它繼承了 Basic所具有的程序設(shè)計語言簡單易用的特點,同時在其編程系統(tǒng)中采用了面向?qū)ο?、事件?qū)動的編程機制,開創(chuàng)了可視化編程的一代先河。
Visual是可視化的意思,Visual Basic的命名就表示它是一套可視化的程序開發(fā)工具。在設(shè)計過程中,可以用可視化的方法編排一個窗口程序在執(zhí)行時的外觀,同時也可以采用易學易懂的Basic語言,并且把界面操作的細節(jié)部分事先封裝起來,使得初學程序設(shè)計的人也可以輕而易舉的編寫出想象的程序。
通過VB實現(xiàn)對數(shù)據(jù)庫的一些功能有數(shù)據(jù)和數(shù)據(jù)說明的醒目顯示;匹配查詢、模糊查詢。
3 VB訪問SQL Server數(shù)據(jù)模糊查詢方法
在進行數(shù)據(jù)庫查詢時,有完整查詢和模糊查詢之分。
一般模糊語句如下:
SELECT 字段 FROM 表 WHERE 某字段 Like 條件
其中關(guān)于條件,SQL提供了四種匹配模式:
1)%:表示任意0個或多個字符??善ヅ淙我忸愋秃烷L度的字符,有些情況下若是中文,請使用兩個百分號(%%)表示。
比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'
將會把u_name為“張三”,“張貓三”、“三腳貓”,“唐三藏”等等有“三”的記錄全找出來。
另外,如果需要找出u_name中既有“三”又有“貓”的記錄,請使用and條件
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%貓%'
若使用 SELECT * FROM [user] WHERE u_name LIKE '%三%貓%'
雖然能搜索出“三腳貓”,但不能搜索出符合條件的“張貓三”。
2)_: 表示任意單個字符。匹配單個任意字符,它常用來限制表達式的字符長度語句:
比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找出“唐三藏”這樣u_name為三個字且中間一個字是“三”的;
再比如 SELECT * FROM [user] WHERE u_name LIKE '三__';
只找出“三腳貓”這樣name為三個字且第一個字是“三”的;
3)[ ]:表示括號內(nèi)所列字符中的一個(類似正則表達式)。指定一個字符、字符串或范圍,要求所匹配對象為它們中的任一個。
比如 SELECT * FROM [user] WHERE u_name LIKE '[張李王]三'
將找出“張三”、“李三”、“王三”(而不是“張李王三”);
如 [ ] 內(nèi)有一系列字符(01234、abcde之類的)則可略寫為“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
將找出“老1”、“老2”、……、“老9”;
4)[^ ] :表示不在括號所列之內(nèi)的單個字符。其取值和 [] 相同,但它要求所匹配對象為指定字符以外的任一個字符。
比如 SELECT * FROM [user] WHERE u_name LIKE '[^張李王]三'
將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
將排除“老1”到“老4”,尋找“老5”、“老6”、……
5)查詢內(nèi)容包含通配符時
由于通配符的緣故,導致我們查詢特殊字符“%”、“_”、“[”的語句無法正常實現(xiàn),而把特殊字符用“[ ]”括起便可正常查詢。據(jù)此我們寫出以下函數(shù):
function sqlencode(str)
str=replace(str,\"[\",\"[[]\") '此句一定要在最前
str=replace(str,\"_\",\"[_]\")
str=replace(str,\"%\",\"[%]\")
sqlencode=str
end function
在查詢前將待查字符串先經(jīng)該函數(shù)處理即可。
①利用比較操作符\"=\"進行模糊查詢
先把SET EXACT的設(shè)置置為OFF,這時,\"=\"用于兩個字符表達式之間作比較,其規(guī)則是:\"=\"右邊的字符逐個與\"=\"左邊相同位置的字符進行比較,只要遇到其中一個字符不相等,或者\"=\"右邊的字符表達式結(jié)束,比較操作就結(jié)束。所以,\"abc\"=\"abc\",\"abc\"=\"ab\",\"ab_\"=\"ab\",\"ab\"=\"\"的比較結(jié)果均為邏輯真(.T.)??梢姡@種方法的模糊性是不能令人滿意的。
②利用\"$\"進行包含比較,其模糊查詢的效果就比用\"=\"時好得多
這種方法是在\"$\"右邊的字符表達式中查找\"$\"左邊的字符表達式,若找到返回邏輯真(.T.),否則返回邏輯假(.F.)。用這種方法只要\"$\"左邊的字符表達式的每一個字符在\"$\"右邊的字符表達式中存在且位置不間斷,查找就能成功。
由此可見,直接利用\"=\"和\"$\"進行比較操作是不能太\"模糊\"的。
4 縮略語或多條件的模糊查詢方法
通常,縮略語或簡稱是由全稱中的某些排列位置不連續(xù)的字符組成的,因此,通過設(shè)置不同長度的字符串進行比較的規(guī)則,或者利用包含比較符\"$\",是不能對縮略語或簡稱進行模糊查詢的。這時可編寫一通用的自定義函數(shù),將用戶輸入的查詢條件(<字符串2>)與字符型字段變量(<字符串1>)進行逐字比較,如果<字符串2>是<字符串1>的縮略語或簡稱,則返回邏輯真(.T.)否則返回邏輯假(.F.),從而實現(xiàn)多條件的模糊查詢。
下面所編寫的自定義函數(shù)以供參考。
設(shè)計思想:此函數(shù)必須是一個通用代碼。為此,執(zhí)行時可先接受二個參數(shù)<字符串1>和<字符串2>。從<字符串2>的左邊開始取其第一、二個字符X1,用AT( )函數(shù)測試X1在<字符串1>中的位置S1,如果S1不為0,就將<字符串1>中包含X1以及左邊部分的字符截掉,并取<字符串2>中的第三、四個字符X2,用AT( )函數(shù)測試X2在<字符串1>的剩余部分中的位置S2,若S2不為0,就將<字符串1>的剩余部分中包含X2以及左邊部分的字符截掉……,直到將<字符串2>中的字符取完并在<字符串1>中測試完為止,最后本函數(shù)返回邏輯真(.T.)。在這個過程中只要有一次測試不成功(即Sn=0),則退出本函數(shù)并返回邏輯假(.F.)。因為一個漢字占二個ASCII字符,所以每次取二個相鄰字符進行測試(讓ZFBJ.PRG中的K=2)。這樣做,一是可以減少測試比較的次數(shù),提高程序運行速度。二是當<字符串2>中含有數(shù)字、字母等半角字符時,可以減少滿足條件的記錄數(shù)目,提高查詢的命中率。然而,若查詢條件中含有英文縮寫,則每次只能取一個ASCII字符進行測試,多條件模糊查詢的通用代碼:
str_query1 = \"select * from table\";
string key1 = \"\";
string key2 = \"\";
string key3 = \"\";
string key4 = \"\"; // 有幾個條件就加幾個key,我這里有四個
if (textBox1.Text.Trim() != \"\")
key1 = \" column1 like '%\" + textBox1.Text.Trim() + \"%'\";
if (textBox2.Text.Trim() != \"\")
key2 = \" column2 like '%\" + textBox2.Text.Trim() + \"%'\";
if (textBox3.Text.Trim() != \"\")
key3 = \" column3 like '%\" + textBox3.Text.Trim() + \"%'\";
if (textBox4.Text.Trim() != \"\")
key4 = \" column4 like '%\" + textBox4.Text.Trim() + \"%'\";
if (key1 != \"\" || key2 != \"\" || key3 != \"\" || key4 != \"\" )
{ str_query1 = \"select * from table where\";
if(key1!=\"\") // 這些條件是個遞增的過程,有幾個條件就加幾個if語句
{ str_query1 += key1;}
if (key1 != \"\" key2 != \"\")
{ str_query1 += \"and\" + key2; }
else
{ str_query1 += key2;}
if ((key1 != \"\" || key2 != \"\") key3 != \"\")
{ tr_query1 += \"and\" + key3;}
else
{ str_query1 += key3;}
if ((key1 != \"\" || key2 != \"\" || key3 != \"\") key4 != \"\"){ str_query1 += \"and\" + key4;}
else
{ str_query1 += key4;}
上面這些代碼的主要核心是但有一個條件不為空時肯定會有查詢語句加上where,然后當前n-1個條件有一個不為空時,肯定要在keyN之前加上and,這一點相信大家都知道,否則的話就是前n-1個條件都為空那么直接查詢語句直接加keyN就行了,因為前面沒有條件所以不用加and了,就這樣依次類推,可以逐漸的把查詢條件增加,又不會讓代碼的可讀性下降,當然了這個可以任意的添加修改key的數(shù)目,非常容易。通過上面介紹的代碼實現(xiàn)了真正的多條件模糊查詢,然而令人遺憾的是它的速度表現(xiàn)總使人感到美中不足,幸好在vb中引入了結(jié)構(gòu)化查詢語言SELECT-SQL。
5 利用vb中SELECT-SQL語句的模糊查詢方法
利用SQL的SELECT語句,可以非常方便、極其快速地進行十分復雜的查詢操作。特別值得推薦的是ELECT-SQL語句中的WHERE參數(shù)支持通配符\"%(百分符號)\"和\"_(下劃線符號)\",因此,對于查詢條件為縮略語或簡稱的情況,可以非常簡單地實現(xiàn)真正的模糊查詢。這里,百分符號\"%\"代表0個或0個以上的任意字符,下劃線符號\"_\"代表1個任意字符,它們只能與運算符LIKE搭配使用。
例如:設(shè)內(nèi)存變量m.field,其值為用戶輸入的用戶名稱的簡稱,如\"京師專\",現(xiàn)在要在KTJBK.DBF中查詢用戶名稱(字段名)為\"北京師范高等??茖W校\",或為\"北京師專\",或為\"京師專\"的全部記錄,可以用下面的一段程序?qū)崿F(xiàn):
m. field=\"京師專\"
mc_cxtj=\"%\"
FOR i=1 TO LEN(ALLTRIM(m.field)) STEP 2
mc_cxtj=mc_cxtj+SUBSTR(ALLTRIM(m.field),i,2)+\"%\"
ENDFOR
SELECT * ;
FROM KTJBK ;
WHERE KTJBK.用戶名稱 LIKE (mc_cxtj) ;
INTO CURSOR TEMP
利用VB中的結(jié)構(gòu)化查詢語言SELECT-SQL可以編寫出很漂亮的通用查詢程序。在數(shù)據(jù)庫管理系統(tǒng)的開發(fā)實踐中,用VB的屏幕生成器編寫過一通用查詢程序,其庫的通用性和執(zhí)行速度表現(xiàn)都非常好。
6 總結(jié)
在數(shù)據(jù)庫管理系統(tǒng)中vb訪問SQL實現(xiàn)查詢是一個很重要的內(nèi)容。然而,在多數(shù)情況下人們不能準確知道作為查詢條件的字段內(nèi)容,為保證能查到滿足條件的數(shù)據(jù)記錄,進行多條件的模糊查詢能達到很好的效果。
參考文獻:
[1] 崔德友,劉卉媚,朱小平.在VB應用程序中訪問SQL Server數(shù)據(jù)庫的實現(xiàn)方法[J].吉林廣播電視大學學報,2003(4).
[2] 朱可云.多條件模糊查詢的實現(xiàn)[J].信息工程學院學報,1999(3).
[3] 謝紅,李江華,解武,等.基于VB程序和SQL Server數(shù)據(jù)庫的多條件模糊查詢的實現(xiàn)[J].應用科技,2003,30(9).