VB6基本數據庫應用(五):數據的查找與篩選

同系列的第五篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/9633139

 

數據的查找與篩選

第4篇發佈到現在已經過了4天,很抱歉,學生黨,還是悲催的高三,沒辦法,8月1就開學了。以後更新文章的速度可能會更慢,而且出完這套數據庫教程之後,未來一年都可能不會有新的教程了。就我而言是想寫下去,多寫點的,一是記錄下自己會的,另一方面把自己會的知識傳播出去,不過高三這段時間可能力不從心了。

 

繼續吧,看標題“包含表中局部數據的數據集,數據的查找”,看上去是兩項內容,實際上是一項。查找,篩選,實際上都是爲了獲取我們需要的數據,而不是將所有數據都提取出來。在這一章,我們將再次體會到SQL:Select語句的強大。

 

取得表中前n個或前n%的記錄

之前,我說過SQL:Select語句的一個簡化的語法,這已經是第三章的內容了,還記得嗎?複習一下:

SELECT fieldnamelist  FROM  tablename

要獲得表中前n個或前n%個記錄,儘管我們可以打開整張表的數據,然後在用循環顯示數據的時候最大值爲n,n爲我們想要的條數這種方式來實現,但是SQL:Select語句提供一個直接的方法來讓我們獲得表中前n個或前n%個記錄。這時候我們要擴充SQL:Select語句的語法了。我們來看新的語法:

SELECT TOP n [PERCENT] fieldnamelist  FROM  tablename

 

我們發現新的語法在fieldnamelist前面加入了TOP n [PERCENT]這一部分,TOP和PERCENT都是SQL的關鍵字,所以我也按照我之前所說的習慣:SQL語句的關鍵字用大寫。需要先說[PERCENT],[]這樣的語法表示的是可選,也就是說TOP這樣一個關鍵字加進去之後,n是必須的了,但是PERCENT依然是可選的,如果寫上他,那n就代表前n%,是一個百分數,可取的範圍是0<n<100;而如果沒有PERCENT,那麼n就代表前n條,可取的範圍是0<n<4294967295,也就是說如果表中有10000000000(不用數了,比4294967295多一位數字)條記錄(假設吧,Access一張表最多能有多少條記錄真沒查過,說不定最多只能有4294967295條,知道確切數字的告訴我一下,不過先假設他能儲存不止4294967295條吧),那麼你最多也只能選出前面4294967295條。

 

讓我們來實踐一下吧,假設我們要取出前30%的記錄,那麼我們可以這樣寫(還是在Student表,取出全部字段)

SELECT  TOP 30 PERCENT  * FROM Student

前面說到的[PERCENT]的[]代表的是可省略,其實[]僅僅是語法表達的需要,實際上寫SQL語句是不需要寫上去的。就像我上面的SQL語句一樣。

 

說完語法,照例是要上VB代碼的。不上代碼的話大家可能會產生疑惑,SQL的語法換了,那麼這個SQL語句又應該寫在哪裏??別急,下面會回答你這個問題。

 

數據的條件查找

要實現數據的查找,就必須要使用更復雜語法的SQL:Select語句。我們來看下面的語法:

SELECT fieldnamelist  FROM  tablename WHERE 條件

 

會發現,這個語法比最初的語法多了一個“WHERE 條件”,但又沒有了第一節的TOP n [PERCENT]這一部分,實際上除了最初給出來的語法內容是必須的,其他都是可以根據需要增添上去的。就是這個條件實現了數據的查找,也就是實現了把我們需要的數據從表裏面取出來,而不是像之前那樣取出一張表的全部數據。語法中“條件”兩個字實際上很虛無,到底這個條件怎麼寫呢?最簡單的是“ 字段名='內容'”,留意裏面的一對單引號,當內容是中文的時候就需要用單引號引起來,如果不是的話與一般來說可以不用單引號。一定要注意這是單引號!

 

我們來寫一個語句實踐一下吧。假設我們要找出Student表中的StudentName爲“黃飛鴻”的記錄,我們可以這樣寫:

SELECT  *  FROM Student  WHERE  StudentName='黃飛鴻'

前面 SELECT * FROMStudent 的部分之前已經說過,光是這樣沒有Where關鍵字就是選出全部的記錄。WHERE StudentName='黃飛鴻',就表示選出StudentName字段中內容爲“黃飛鴻”的記錄。

 

還是上面的實踐中的例子,需要留意的是,認真看一下實踐中我所寫的SQL語句,Select後面跟着的字段名列表是用*的,也就是全部字段都選出來。然後再看我SQL語句後面的解釋:“我們選出的是……的記錄”,注意是記錄,一個記錄有多個字段的數據組成。所以,上面我寫的語句的作用不僅僅是把StudentName字段中的“黃飛鴻”這個文本內容選了出來,同時還有StudentID字段中他所對應的的數據662356也被選了出來。這體現了數據庫的對應關係。

現在來回答上一節的最後,提出的語法改變了,那麼新的SQL語句又要寫在什麼地方的問題。其實還是老地方,其實每調用一次SQL:Select語句,無論是之前的簡單語法,還是現在有Where的語法,甚至以後更復雜的語法,SQL:Select語句的作用都是返回一個數據集(如果符合Where條件的記錄找不到,那這個數據集就是空的)。所以,所有的SQL:Select語句都可以作爲參數傳遞給Recordset對象的Open方法。

 

照樣,現在我們把實踐中寫的那個SQL語句作爲參數傳遞給Recordset對象的Open方法,並顯示在表格裏。這個還是寫在Load事件裏吧。這次我把Load事件裏的代碼全都列出來,包括之前的連接數據庫的,還有打開整張表的代碼,這樣做是爲了給大家一個提醒,具體提醒是什麼?認真看看註釋吧,代碼後面還會說的。

VB代碼開始:

Private Sub Form_Load()

'創建新的Connection對象

Set Cnn = NewADODB.Connection

 

'注意要記住該數據庫目錄爲你數據庫文件當前的位置

Cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Sample.mdb;Persist Security Info=False"

'創建新的Recordset對象

Set rec = New ADODB.Recordset

 

'打開student表的全部字段的全部內容

'adOpenKeyset, adLockOptimistic。鍵集遊標和開放式鎖。

'單純爲了讀取數據應該使用只進遊標和只讀鎖。

'但是爲了方便就統一使用鍵集遊標和開放式鎖了

'詳細參見第十章

rec.Open"SELECT * FROM Student", Cnn, adOpenKeyset, adLockOptimistic

 

'---------------------------------------------------------------------

'“----”註釋裏的是第五章新加的代碼

'---------------------------------------------------------------------

 

'注意了!!如果使用之前的Recordset對象變量rec

'而且之前的rec已經被Open過了,那麼必須調用Close

'將其關閉之後才能再調用Open方法

rec.Close

 

'打開student表中StudentName爲“黃飛鴻”的記錄

rec.Open"SELECT * FROM Student Where StudentName='黃飛鴻'", Cnn,adOpenKeyset, adLockOptimistic

 

'---------------------------------------------------------------------

'這一章新加的代碼就到這裏,下面的還是之前的代碼

'---------------------------------------------------------------------

 

'數據的提取

Do Until rec.EOF =True

    List1.AddItem rec.Fields("StudentID").Value

        'Fields對象,括號裏的是索引(Index),索引填寫的內容爲字段的名稱

        'Item屬性是Fields對象的默認屬性,他的一個參數就是Index

        'Fields("Student")表示一個Field對象

        'Fields("Student")等價於

        'rec.Fields.Item ("Student")或

        'rec.Fields! ("Student")

        '!表示默認屬性

 

    List2.AddItem rec.Fields("StudentName").Value

    '移動下一條記錄爲當前記錄

    rec.MoveNext

Loop

End Sub

VB代碼結束:

這裏我們可以看到3行的紅色註釋(雖然VB的IDE裏的註釋是用綠色顯示的,不過這裏爲了強調就用紅色),非常顯眼。這就是我要提醒大家的地方。實際的數據庫應用裏,往往需要將Recordset對象回收再用。例如這裏我需要顯示出全部的人名,待會我可能又根據用戶的需要去找某個人的記錄,或者待會可能還要排一下序。我們不可能創建那麼多的Recordset對象,如果要的話就意味着我們需要聲明很多個Recordset對象變量,這很可能會很混亂。所以Close之後重新用Open執行其他的操作,這樣的手段是經常用到的。

 

我們可以看到,之前的打開整張表的代碼我沒有去掉,然後就是在一堆註釋之後直接Close,再用Open來寫今天的代碼了。而後面的輸出到List控件的代碼也被保留了下來,接在了今天新的代碼之後。所以現在的輸出List1裏就只有662356,List2就只有”黃飛鴻“了。

 

當前的代碼運行結果如下圖:



最後,給大家留個作業吧。第一節“取得表中前n個或前n%的記錄”的SQL語句我一直沒寫用在VB上的代碼,既然都知道了還是作爲參數傳遞給Recordset對象的Open方法,那麼自己去試一下吧。以爲WHERE關鍵字的作用就怎麼點??還沒完呢!下一章,我們將來講述:多重條件搜索。本套教程未完,待續。


第六章:續篇序 和 給學習者的話 http://blog.csdn.net/jiluoxingren/article/details/48402835


發佈了47 篇原創文章 · 獲贊 178 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章