11.1 數據庫(DateBase)的基本概念 一、概念與術語 目
前幾乎所有的應用程序都需要存放大量的數據,這些大量數據一般都需要經過數據收集、分析后,整理成一定的組織結構,通過數據庫管理系統(tǒng)來進行管理。數據庫
管理系統(tǒng)提供了數據在數據庫內存放方式的管理能力,使程序設計人員在使用數據庫時不需要考慮數據的具體操作及數據之間的關系。 數據庫是一組排列成易于處理和讀取的相關信息的集合。數據庫按其模型結構可分為層次數據庫、網狀數據庫和關系數據庫。其中關系數據庫的理論發(fā)展最為完備,因此到目前為止關系數據庫的應用最為廣泛。 Visual Basic默認的數據庫為微軟的Access數據庫,可在Visual
Basic中利用數據庫管理器直接創(chuàng)建,數據庫文件的擴展名為.MDB。除此之外,Visual
Basic還可以處理各種外部數據庫,如dBASE、FoxPro、Paradox、Btrieve、Microsoft
Excel、Lotus1-2-3、Text等格式的數據庫,甚至其它非關系的數據庫,VB在調用這些數據時,都會自動將其轉換為關系型的數據庫來操作。 1. 數據表(Table) 數據表是一組相關聯(lián)的按行與列排列的邏輯數據的集合,簡稱為表。在數據庫理論中常用來表示一個實體,每個數據表必須有一個表名,一個數據庫一般由多個數據表組成,各個數據表之間一般應存在某種關系。 2. 字段(Field) 數據表中的每一列稱為一個字段。數據表是由其包含的所有字段構成的,每個字段用來描述它包含的數據。在創(chuàng)建數據表時,必須為每個字段起一個名稱一般稱為字段名,同時需要為每個字段分配一個數據類型、最大長度和其它屬性。 3. 記錄(Record) 數據表中的每一行稱為一條記錄。記錄是字段值的集合,所有用戶對數據的訪問對象是記錄,因此,如果想對某個數據項進行訪問,必須首先進行記錄定位,嚴格的說,在一個數據表中不允許存在兩條完全相同的記錄。 4. 關鍵字(Keyword) 如果數據表中某個字段值或若干個字段值的集合能唯一確定一條記錄,則稱該字段或字段的集合為該數據表的關鍵字。在一個數據表中,關鍵字可能存在多個,但需選定其中一個作為主關鍵字。對于數據表中的每條記錄來說,主關鍵字的值必須唯一。 5. 索引(Index) 為了提高訪問數據庫的速度,大多數數據庫都使用索引。索引即對數據表中的某個或幾個字段的值按某種特定的順序進行排列。在VB中利用索引可以加快數據檢索速度。 6. 結構化查詢語言(SQL) SQL(Structure Query Language)是結構化查詢語言的縮寫,是數據庫中通用的數據查詢編程語言,它是我們訪問數據庫的一種利器。在Visual
Basic 中訪問數據庫時,就可以利用SQL同數據庫進行通訊。 二、數據庫的設計 數據庫的設計一般需要借助E-
R圖進行數據建模,然后把整個E-R圖中的每個實體和有關的聯(lián)系,都轉化為關系。對每個關系再進行規(guī)范化,最后給出各個數據表完成數據庫的邏輯設計,對每
個關系來說,在選定的數據庫管理系統(tǒng)下,創(chuàng)建數據庫、數據表以及它們之間的關系,并輸入數據進行測試,完成數據庫的物理設計。具體內容請讀者參考相關的數
據庫理論方面的書籍。 11.2 Visual Basic的可視數據管理器 Visual Basic 所支持的不同類型的數據庫大都可以通過相應的數據庫管理系統(tǒng)來建立,如在MS
Access中可以建立.MDB的數據庫。也可以使用Visual Basic下的數據庫管理器來管理數據庫。 啟動數據庫管理器有兩種方法: (1)在Visual Basic集成環(huán)境中,單擊“外接程序”菜單下的“可視化數據管理器”命令,即可打開可視化數據管理器“VisData”窗口,如圖11-1所示。 (2)直接運行Visual Basic系統(tǒng)目錄中的VisData.exe程序文件來啟動可視化數據管理器。 VisData窗口由菜單欄、工具欄、工作區(qū)窗口與狀態(tài)欄組成,剛啟動時其工作區(qū)窗口為空。 圖11.2-1 可視化數據管理器窗口 一、可視數據管理器的使用 使用開可視化數據管理器建立默認數據庫――Access數據庫的步驟如下: 1.單擊“文件”菜單下的“新建”菜單項,將出現(xiàn)如圖12-2所示的選擇。單擊數據庫類型菜單中的Access將出現(xiàn)版本子菜單,在版本菜單中選擇要創(chuàng)建的數據庫版本后,出現(xiàn)如圖11-3所示的窗口。 圖11.2-2 “文件”菜單下的“新建”子菜單
圖11.2-3 創(chuàng)建數據庫窗口 2.單擊“保存”按鈕后,將會出現(xiàn)如圖11.2-4所示的窗口。 圖11.2-4 數據庫窗口與SQL語句窗口 3.右擊數據庫窗口,出現(xiàn)如圖1.2-5所示的窗口。 圖11-5 數據庫窗口 4.單擊“新建表”按鈕,即可打開如圖11.2-6所示窗口。即可新建表。 圖11.2-6 表結構窗口 5.然后單擊“添加字段”按鈕,可建立各個字段的屬性,最后單擊“新建表”按鈕,即可建立起表結構。有了表結構后就可對表進行數據的添加、修改和刪除等操作。 11.3 ADO數據控件 一、編寫一個簡單數據庫程序 首先介紹Visual Basic所提供的兩個控件ADO Data Control(簡稱ADODC)和DataGrid處理數據庫程序的方法。ADO
Data Control和DataGrid都屬于ActiveX控件,它們在使用前需要先將其添加到工具箱中,以便在工程中使用。單擊“工程/部件”菜單項,打開“部件”對話框,選定所需要的控件并確定,即可將其添加的工具箱中,如圖11.3-1所示。 圖11.3-1 添加ADODC與DataGrid控件到工具箱 在窗體上添加ADODC與DataGrid控件,如圖11-8所示,然后右擊ADODC控件,選擇其快捷菜單下“ADODC屬性”則打開如圖11-9所示的界面。 圖11.3-2 窗體窗口
圖11.3-3 屬性頁窗口 在上圖中,單擊生成“按鈕”,則打開如圖11.3-4所示的數據鏈接屬性窗口。 圖11.3-4 數據鏈接屬性窗口 在圖11.3-4中選中“Microsoft Jet 3.51 OLE DB Provider”,單擊下一步按鈕,進入如圖11.3-5所示的數據鏈接屬性窗口。 【注】Microsoft Jet 3.51 OLE DB Provider只能打開Access97下的數據庫,不能打開Access2000及以上版本的數據庫,如要打開Access2000下的數據庫,則必須選用Jet
4.0,否則系統(tǒng)會出錯。 圖11.3-5 數據鏈接屬性窗口 在圖11.3-5中,單擊“…”按鈕,選擇所要打開的數據庫文件后確定,即可單擊“測試連接”按鈕,測試是否連接成功。如果測試連接成功,則單擊“確定”按鈕后,返回圖11.3-2。 【注】如果數據庫文件與工程文件保存在同一個文件夾下,則可把上圖所示的文件xjgl.mdb前的字符刪除,這樣生成的程序,在復制到其它計算機上后不需重新對數據庫進行連接即可運行。 通過以上步驟,我們只是完成了ADODC控件的ConnectionString屬性設置,其值如下:Provider=Microsoft.Jet.OLEDB.3.51;Data
Source=e:\xjgl\xjgl.mdb;Persist Security Info=False 該屬性由三個參數組成: 然后把ADODC
控件的CommandType屬性設置為adCmdTable,接著單擊RecordSource屬性,可以看到數據庫xjgl.mdb下的所有數據表,
單擊“基本情況表”。再選定DataGrid控件,只需把DataSource設置為ADODC控件即可,完成程序設計。運行該程序即可對數據庫
xjgl.mdb下的“基本情況表”進行瀏覽。然后把DataGrid控件的AllowAddNew屬性設置為True、AllowDelete屬性設置
為True、AllowUpdate屬性設置為True,再次運行該程序,即可對“基本情況表”進行添加、刪除與修改數據操作,到目前為止沒有書寫一行代
碼,就已完成程序設計。 二、數據庫文件與ADODC、DataGrid的關系 1.ADODC與數據庫文件的關系 數據庫文件是一種格式十分復雜的文件,對任何一個程序員來說,如果想自行解析文件格式進而存取數據庫中的內容,都是一件十分困難的事情。因此VB提供了ADODC控件,其功能是進行數據庫文件結構分析,并且根據程序將來可能操作數據庫(如:讀取、寫入、新增、刪除等),建立必要的操作接口(包含屬性、方法和事件),然后封裝成為一個控件。 對數據庫程序而言,如果通過ADODC控件來存取數據,則不必了解數據庫文件格式,只要通過ADODC所提供的操作接口,即可達到存取數據庫的目的。數據庫程序、ADODC控件與數據庫文件三者之間的關系用下圖表示:
ADODC
圖11.3-6 數據庫文件與ADODC控件的關系 2.DataGrid與ADODC之間的關系 雖然ADODC控件具有存取數據庫數據的能力,但卻沒有提供顯示數據的功能,如果想要顯示數據庫的內容,除了利用ADODC來讀取數據之外,還得編寫顯示數據的程序。 1)利用DataGrid來顯示數據 要使用DataGrid
來顯示數據庫內容必須設置好它的DataSource屬性,這個屬性的作用是讓DataGrid控件與ADODC控件產生連接關系,也就是告訴
DataGrid控件它所存取的是哪一個ADODC所打開的數據庫,接著DataGrid就會自動使用ADODC的接口,將數據庫的內容顯示出來。其關系
如圖11.3-7:
圖11.3-7
DataGrid與ADODC控件的關系 2)關鍵屬性和參數總結 ADODC控件的屬性及參數: (1)ConnectionString(連接字符串)屬性:該屬性有兩個重要參數Provider和Data
Source。 Provider參數:Provider是OLE DB Provider的簡稱,其主要用途在于指定存取數據庫所使用的OLE
DB驅動程序。如“Microsoft Jet 3.51 OLE DB Provider”。 Data Source(數據源)參數:此參數通常用來指定數據庫文件的完整路徑和文件名。有了此參數,ADODC控件才能打開指定的數據庫文件。 (2)CommandType(命令類型)屬性:共有四個值:adCmdTable(數據表)、adCmdText(指令)、adCmdStoredProc(存儲過程)、adCmdUnknown(未定義)。 (3)RocordSoure(記錄源)屬性:指定確定的表。 DataGrid控件的屬性: (1)DataSource(數據源)屬性:由于DataGrid控件并不直接存取數據庫中的數據,因此必須將其屬性設置成某一個ADODC控件,DataGrid控件才能具備存取數據庫的能力。 (2)AllowAddNew(允許新增)屬性:若允許用戶新增數據,須將此屬性設置為True。 (3)AllowDelete(允許刪除)屬性:若允許用戶新增數據,須將此屬性設置為True。 (4)AllowUpdate(允許更新)屬性:此屬性的默認值為True。 三、Visual Basic中與數據庫中相關的對象 就像數據庫是有組織結構的一樣,VB所提供的數據庫對象也是有組織的,而且與數據庫的組織結構有著很好的對應關系。 1.Field對象與字段 字段是數據庫中最小的數據單位。在VB所提供的對象中,與字段對應的對象是Field,我們從Field對象的以下屬性可以得知字段的相關信息: Name屬性:字段的名稱 Value屬性:字段的數據 Name屬性 Field對象
Value屬性 2.Fields集合對象與數據記錄 對VB所提供的對象而言,F(xiàn)ield對象的集合構成Fields集合對象,所以Fields集合對象可以視為與數據庫記錄對應的對象。 Fields對象編號:0 1 2
Fields(0)
Fields(1) Fields(2) 共同構成Fields集合對象 由于Fields是一個集合對象,所以可以利用Count屬性得知某一個Fields集合對象中的Field對象的數目,并可利用下面的方法顯示集合中的Field對象的內容,如: For i=0 to fds.Count-1 ‘fds為一個Fields集合對象 Debug.Print fds(i).Name ‘顯示字段名稱 Debug.Print fds(i).Value ‘顯示字段數據內容 Next 3.Recordset對象與數據記錄集合 Visual Basic中與數據表對應的對象稱為Recordset對象,先介紹“當前數據記錄”的概念。 1)由于數據庫無法將整個數據表完全裝入到內存中,因此便規(guī)定程序每次只能存取一條記錄,此記錄數據就稱為“當前記錄數據”。 注:雖然程序每次只能存取當前記錄數據,但并不表示數據庫每次只裝入一條記錄數據,為了提高執(zhí)行效率,數據庫每次會裝入一大段記錄數據,但程序存取的動作還是以一條為單位。 2)利用Recordset對象改變當前記錄數據的方法 程序運行后當前記錄數據,將定位于第一條記錄。若要改變當前記錄,程序必須調用Recoedset對象的方法改變當前數據記錄,方可存取每一條數據記錄,進而達到存取整個數據表的功能。下表為Recoedset對象的幾個常用方法。
如圖11.3-8為Visual Basic中幾個對象間的關系。
11.3-8 ADODC、Recordset、Fields、Field幾個對象關系圖 在上圖中位于下方的稱為上方對象的子對象。若要存取某一個對象,必須從最上層的父對象向下指定對象的路徑。如: Adodc1.Recordset Adodc1.Recordset.Fields Adodc1.Recordset.Fields(i) 11.4 Recordset對象 Recordset
對象是數據記錄的集合,而數據記錄又是字段的集合,因此利用Recordset對象,在程序中就可以存取所有數據記錄的每一個字段的數據了,所以說
Recordset對象是存取數據庫數據最重要的源頭。在數據庫的程序設計中,Recordset對象是最為重要的對象。 一、Recordset與數據表的存取 前面介紹幾個改變Recordset對象的當前數據記錄的方法――MoveNext、MovePrevious、MoveFirst、MoveLast方法,通過這幾個方法就可以存取整個數據表的數據。其關系可用圖11-15來表示。 MoveFirst MovePrevious MoveNext MoveLast
當前記錄
以Recordset.Fields來存取
圖11.4-1 Recordset對象與數據表之間的關系 如程序: for I=0 to
Adodc1.Recordset.Fields.Count-1 Debug.Print
Adodc1.Recordset.Fields(i).Value Next 1.避免沒有當前數據記錄的錯誤 利用MovePrevious、MoveNext移到記錄指針時,應注意移過頭現(xiàn)象發(fā)生。所謂移過頭是指: 指針位于第一天記錄時,調用MovePrevious方法。 指針位于最后一條記錄時,調用Monenext方法。 我們可以利用Recordset對象的EOF或BOF屬性,來加以判斷。 BOF及EOB屬性的應用: Adodc1.Recordset.MoveFirst While
Not Adodc1.Recordset.Eof s=”” For
I=0 to Adodc1.Recordset.Fields.Count-1 s=s
& Adodc1.Recordset.Fields(i).Value & vbTab Next List1.Additem s Adodc1.Recordset.MoveNext Wend Adodc1.Recordset.MoveNext While
Not Adodc1.Recordset.Bof s=”” For
I=0 to Adodc1.Recordset.Fields.Count-1 s=s
& Adodc1.Recordset.Fields(i).Value & vbTab Next List1.Additem s Adodc1.Recordset.MovePrevious Wend 2. 存取字段數據的幾種各數 1)Adodc1.Recordset.Fields(i).Value 如:Adodc1.Recordset.Fields(0).Value 2)Adodc1.Recordset.Fields(字段名稱).Value 如:Adodc1.Recordset.Fields(“學號”).Value 3.省略.Value的語句
如:Adodc1.Recordset.Fields(“股票代號”) 4.省略.Fields的語句
如:Adodc1.Recordset(“股票代號”) 5.Recordset![字段名稱]
字段名稱不能加引號 【注】Recordset(“字段名稱”)最容易書寫。 二、Recordset與數據記錄的增刪修改 在前面我們使用DataGrid控件的AllowAdd屬性和AllowDelete屬性設置為True,使它具有修改、增加和刪除數據的功能。但大批數據的處理使用該方法不方便,下面介紹Recordset對象修改、增加和刪除數據的方法。 1. 刪除數據記錄 首先要將欲刪除的記錄置為當前記錄,然后調用Recordset.Delete方法進行刪除。如: Adodc1.Recordset.MoveLast Adodc1.Recordset.Delete 刪除多條記錄時,在Delete方法后加上DoEvents語句。 2. 修改數據記錄 修改數據記錄分兩步走,先把數據寫到緩沖區(qū),然后再寫入數據庫。數據寫入可調用Recordset.Update方法和使用Move…方法。其具體過程如下: 方法一: Adodc1.Recordset(“字段名稱1”)=字段新值 Adodc1.Recordset(“字段名稱2”)=字段新值 … Adodc1.Recordset.Update 方法二: Adodc1.Recordset(“字段名稱1”)=字段新值 Adodc1.Recordset(“字段名稱2”)=字段新值 … Adodc1.Recordset.MoveNext CancelUpdate方法:取消更新的數據 除了調用Update方法或改變當前數據記錄的位置來使要更新的數據立即寫入到數據庫中之外,Recordset對象也允許在修改數據記錄之后,數據尚未寫入數據庫之前,將更新的數據撤消,讓表中的數據恢復原狀,此時調用的方法是CancelUpdate方法。 3. 新增數據記錄 新增數據記錄是先建立一個緩沖區(qū),并將此緩沖區(qū)設置為當前記錄,然后就可以像修改記錄的數據一樣,修改當前記錄的內容。最后,如果確定要新增該條記錄數據,就調用Update方法或移動當前數據記錄將數據寫入到數據庫中;如果要取消新增的記錄數據的操作,就調用CancelUpdate方法,其新增記錄數據的語句大致如下: Adodc1.Recordset.AddNew Adodc1.Recordser(“字段名稱1”)=
“新的字段值1” Adodc1.Recordser(“字段名稱2”)=
“新的字段值2” … Adodc1.Recordset.Update
或Adodc1.Recordset.CancelUpdate 三、Recordset與數據記錄的檢索 1.檢索數據記錄的方法 1)Find方法 格式:Recordset.Find
Criteria,SkipRows,SearchDirection,Start 參數1:Criteria:檢索記錄數據的表達式。如:“語文>85”。該參數的變化相當多,稍后進一步說明。 參數2:SkipRows:跳過幾條記錄開始檢索??墒÷?,若省略其默認值為0,表示從第一條記錄開始。 參數3:SearchDirection:檢索的方向??梢允莂dSearchForward或adSearchBackward,可以省略,若省略表示向下檢索。 參數4:Start:開始檢索的位置??墒÷?,若省略表示從當前數據記錄開始檢索。 2)檢索結果與當前記錄 如果調用Find方法后找到符合要求的記錄數據,則當前記錄將移至被找到的記錄,否則當前記錄數據變成不存在??衫肦ecordset對象的BOF、EOF屬性進行判斷。 2. 檢索數據記錄的表達式 在Find方法的參數中,變化最多的是Criteria參數,在此作進一步的討論。 1)表達式的基本格式 “字段名稱 比較運算符 比較的數據” 2)表達式的字段名稱 表達式=字段名稱 比較符號 比較的數據 (1)表達式中的“字段名稱”必須是數據表中已存在的字段名稱。 (2)如果字段名稱中含有空格字符,則字段名稱前后必須加[ ]。 3)表達式之“比較的數據” 表達式=字段名稱 比較符號 比較的數據 (1)比較的數據是常量 比較的數據按數據類型可分為“數值”、“日期時間”和“字符串”三種類型。
(2)比較的數據是變量 設v為數值: “字段名稱比較符號>”
& v v為日期數據:“字段名稱比較符號 #” & v & “#” v為字符串: “字段名稱比較符號 ‘”
& v “’” 4)表達式之“比較符號” 表達式=字段名稱 比較符號 比較的數據 VB程序中的比較符號包含=、<>、>、<、>=、<=均可用于記錄數據的比較。此外,Like比符號也可用于比較表達式中。其格式: 字段名稱 Like 比較的字符串 該表達式用于字符串數據的“近似”(Like)比較,其中“比較的字符串”部分可以包含“%”、“*”或“_”(下劃線)通配符。如: “姓名 Like‘張%’” 11.5 Data-Aware(數據識別)控件 前面介紹了兩種存取數據的方法:使用Recordset對象和DataGrid控件。經過比較容易發(fā)現(xiàn)DataGrid控件比Recordset對象簡便得多。。 像DataGrid
控件一樣具有自動顯示和更新數據功能的控件,稱為Data-Aware(數據識別)控件(簡稱數據識別控件)。在Visual
Basic中,除了DataGrid控件外,數據識別還有Label、TextBox、CheckBox、ListBox、ComboBox、
Image、PictureBox、MonthView、DTPicker、DataList、DataCombo等控件。如能充分運用,就可在數據庫程
序的設計中游刃有余了。 一、數據識別控件的基本概念 數據識別控件分為兩類:表格式和單欄式。 表格式指DataGrid控件。 單欄式是指每次只能存取當前數據記錄的某個字段的數據。單欄式控件必須設置兩個屬性:DataSource屬性設置為ADODC控件的名稱和DataField(數據字段)屬性設置為某一個字段名。 二、數據識別控件的選擇
三、舉例-DTPicker控件的使用 單擊“工程/
部件”打開部件對話框,選定Microsoft ADO Data Control6.0(OLEDB)和Microsoft Windows
Common Controls-2
6.0,把ADODC和DTPicker控件添加到工具箱,布置窗體如圖11-11所示,把ADODC控件連接到xjgl.mdb下的“基本情況表”,把
Text1-Text5依次學號、姓名、性別、成分和籍貫字段進行綁定,DTPicker控件與出生日期字段進行綁定,運行該程序并單擊DTPicker
控件即出現(xiàn)圖11-16界面,即可對出生日期字段的值進行修改。 圖11.5-1 DTPicker控件的使用 11.6 結構化查詢語言(SQL) 一、 SQL簡介 1.SQL概念 SQL(Structured Query Language,結構化查詢語言)是要求數據庫操作其數據的語句,它是專門為數據庫設計出來的語言,比一般的程序語言簡單。SQL語言主要分成兩部分:DDL(Data
Definition)和DML(Data Manipulation Language)。其中DDL是建立數據表和字段的語句集,而DML則是操作記錄數據的語句集。 2.SQL基本格式 Select…From… Select
學號,姓名,籍貫 From 基本情況 3.利用VB下達Select語句 CommandType屬性:1-adCmdText RecordSource(記錄源)屬性:Select
學號,姓名,籍貫 From 基本情況表 使用SQL顯示xjgl.mdb下“基本情況表”的步驟: 1) 添加Microsoft ADO Data
Control6.0(OLEDB)和Microsoft DataGrid Control6.0 (OLEDB)到窗體,將ADODC連接到數據庫xjgl.mdb。 2)設置ADODC控件的RecordSource屬性,如圖11.6-1所示。單擊確定按鈕。 3)將DataGrid控件的DataSource屬性設置為ADODC控件。 運行程序,即可得到如圖11.6-2所示的結果。 圖11.6-1 SQL的使用 圖11.6-2 SQL運行結果 二、Select語法簡介 1.基本語法一:Select字段列表 From 數據表 1)字段列表的變化一 (1)“*”語法 如果字段列表涵蓋數據表中的所有字段,則可用“*”代表。如: select * from 基本情況 (2)as語法 字段列表還可以是別名。如:字段名1 as 別名1,字段名2 as 別名2 2)字段列表的變化二 除了字段名可以成為Select語句的字段列表外,用字段名稱組合出的表達式,也可成為字段列表成員。如: select
學號,姓名,語文,英語,數學,語文+英語+數學 as 總分 from 成績 3)字段列表的變化三 在Select中只要是符合VB規(guī)則的表達式都可以用來定義新字段。如: select
right(學號,2) as 編號,姓名,數學 from 成績 2.基本語法二:select…from…where篩選表達式 如果只想篩選出部分數據,就可增加Where表達式。 1)篩選表達式的變化 篩選表達式中可使用=、>、<、<>、>=、<=等運算符,也可使用and、or、not邏輯運算符和Like近似比較運算符。 (1)字符串的近似(Like)選取 select * from 成績 where 姓名 like ‘王%’ (2)%與_的區(qū)別 2)其它的where篩選表達式 除使用以上運算符外,還可使用以下一些運算符: (1)where 字段名稱 between 值1 and 值2 where 字段名稱 not between 值1 and 值2 (2)where 字段名稱 in(值1,值2,…)集合運算 (3)where 字段名稱 is Null與where 字段名稱 is not Null 如果某一筆記錄的某一字段并未輸入任何數據,那么該字段就為Null字段。上面的篩選表達式可以挑出某一字段為Null或非Null的記錄數據。 3)VB函數的使用 其實VB函數也可用于where篩選表達式,如: select * from 成績單 where mid(姓名,2,1)=‘小’ 3.基本語法三:select…from…order by 字段列表 1)單字段排序 Order By子句主要對最終輸出結果進行排序,這有助于數據的瀏覽與查閱。如: Select
* from 成績 order by 語文 2)多字段排序 如:Select
* from 成績 order by 語文,英語,數學 3)排序方式 asc(默認)升序
deac降序 4)select top:限定選取數據記錄的條數 如:select
* from 成績 order by 語文+英語+數學 desc select
top 10 * from 成績 order by 語文+英語+數學 desc
`取前十條 select
top 10 percent * from 成績 order by 語文+英語+數學 `desc 取百分比 三、動態(tài)執(zhí)行Select語句的技巧 前面已經介紹利用Recordset
對象的Find方法進行數據的查找。對SQL而言,“where
篩選表達式”中的“篩選表達式”,與Find方法的“搜尋數據的表達式”在功能上十分類似。但Find方法對數據進行逐條比較,數據量較大時,效率很低。
因此,可先用SQL語句篩選符號條件的記錄,然后再進行Find方法查找。 1.動態(tài)執(zhí)行Select語句的技巧 要想動態(tài)執(zhí)行某一Select語句,程序必須如下: Adodc1.CommandType=adCmdText Adodc1.RecordSource=Select語句 Adodc1.Refresh 2.動態(tài)組合SQL語句的注意事項 字符型數據:select * from 數據表 where 字段名稱=’” & Text1.Text & “’” 日期型數據:select * from 數據表 where 字段名稱= ” & Text1.Text & “ ” 數值型數據:select * from 數據表 where 字段名稱=” & Text1.Text 3.Where篩選表達式與Find表達式的差異 1.Where篩選表達式可使用邏輯運算符and、or、not,F(xiàn)ind表達式不能使用邏輯運算符。 2.Where篩選表達式中的Between…And和Is Null/Is Not Null均無法在Find中使用。 3.Where篩選表達式中可以使用VB函數,而Find表達式中是不能使用的。 11.7 ADO(Active Data Objects)對象模型 我們前面一直使用ADODC和其它數據識別控件來設計數據庫程序。為了打好數據庫基礎,Visual Basic數據庫最核心的對象群-- Active
Data Objects(簡稱ADO)就是我們必須要掌握的,如圖11-19。
圖 11.7-1 ADO對象結構圖 一、ADO的首次使用 對比圖11.3-8中可以看出ADO比 ADODC控件復雜一點,實際上它們的概念是一致的。在ADO對象結構圖中可以發(fā)現(xiàn)一個熟悉的名字—Recordset,它與我們前面使用的Recordset(ADODC的屬性)是相同的對象。 先看一個ADO打開數據庫的例子: Dim conn As New
ADODB.Connection Dim rs As New
ADODB.Recordset Private Sub
Form_Load() Dim
ConnStr As String ConnStr
= "Provider=Microsoft.Jet.OLEDB.3.51;" & _ "Data
Source=f:\xjgl\xjgl.mdb" conn.Open
ConnStr rs.CursorLocation
= adUseClient rs.Open
"基本情況表", conn, adOpenKeyset, adLockPessimistic End Sub Private Sub
Command1_Click() ' 顯示 Recordset 的所有記錄數據 Dim
S As String, i As Integer rs.MoveFirst List1.Clear While
Not rs.EOF S="" For
i = 0 To rs.Fields.Count - 1 S=S
& rs.Fields(i).Value & vbTab Next List1.AddItem
S rs.MoveNext Wend End Sub 在以上程序中,使用了MoveFirst、EOF、MoveNext方法和Fields子對象,使用這些方法和Fields子對象的對象不再是Adodc1.Recordset對象,而是rs對象。 1.打開數據庫(表) 我們再看一下上面打開數據庫的語句: ConnStr =
"Provider=Microsoft.Jet.OLEDB.3.51;" & _ "Data
Source=e:\xjgl\xjgl.mdb" conn.Open
ConnStr rs.CursorLocation
= adUseClient rs.Open "基本情況表",conn,adOpenKeyset,adLockPessimistic 其主要由三部分組成: Provider參數:用來指定OLE
DB驅動程序。 DataSource參數:用來指定數據庫的來源,它與Provider參數合起來構成“連接字符串”。 股票行情表:出現(xiàn)在rs.Open方法的參數,用來指定想要打開的數據表。 結論:通過比較我們發(fā)現(xiàn)前面兩個例子打開數據庫的方法幾乎是一樣的,ADODC控件仍調用ADO所提供的方法來打開數據庫(表)。 2.使用ADO對象之前 在使用ADO對象之前,必須先利用VB菜單的“工程/引用”來引用“Microsoft Active Data Objects 2.0
Library”,如圖11-20所示,然后ADO對象群中Connection、Recordset、Command、Fields等對象才會成為可以引用的對象。否則,類似下面的語句: dim
conn as new ADODB.Connection dim
rs as New ADODB.Recordset 都會產生“用戶定義類型未定義”的錯誤,因為“Connection”和“Recordset”都是定義在“Microsoft Active Data Objects 2.0
Library”中的。如果沒有事先將其引用的話,VB將無法辨識它們。 圖11.7-2 Microsoft Active
Data Objects 2.0 Library的引用 3.使用ADO的基本概念 從以上例子中我們可以看到,使用ADODC比使用ADO要簡單得多,但使用ADO比使用ADODC專業(yè)的多。 “對象類別”的引用及表示法: 語句格式:dim rs as ADODB.Recordset 其中,rs稱為“對象變量”,Recordset稱為“對象類別名稱”,ADODB則稱為“對象類別模塊”,整個語句被解釋為“建立一個Recordset類別的對象變量、而Recordset對象類型是來自ADODB對象類別模塊的”。 注意:ADODB正是“Microsoft Active Data Objects 2.0 Library”在程序設計中的簡稱。 二、Connection對象:操作數據庫的源頭 ADO對象群以Connection對象為源頭,通過Connection對象才可以打開其下面的Recordset及Command對象,進而對數據庫進行操作。 1.Connection對象的建立及打開 1)Connection對象的建立 要使用某一對象時,必須經過“定義”和“建立”兩個步驟。即: Dim
conn as ADODB.Connection ‘定義一個Connection類別的對象變量 Set
conn=New ADODB.Connection ‘建立對象,并指定給conn對象變量 也可合二為一: Dim
conn as New ADODB.Connection 2)Connection對象的打開 以上語句只是建立了Connection對象,還無法使用。要想使用Connection對象,就必須指定OLE DB Provider和Data Source兩個參數,然后再調用Open方法。如: Connstr=“Provider=Microsoft.Jet.OLEDB3.51;”
& “Data Source=f:\xjgl\xjgl.mdb” Conn.Open
Connstr 2.數據表的打開與Connection對象 打開數據表可用以下語句 Dim
conn as New ADODB.Connection Connstr=“Provider=Microsoft.Jet.OLEDB3.51;”
& “Data Source= f:\xjgl\xjgl.mdb” Conn.Open
Connstr Rs.CursorLocation=adUseClient Rs.Open
“基本情況”,conn,adOpenKeyset,adLockPessimistic 3.Connection對象的關閉及釋放 當程序不再使用數據庫時,可以調用Connection對象的Close方法將其關閉。 1)Connection對象的關閉 Dim
conn as New ADODB.Connection Connstr=“Provider=Microsoft.Jet.OLEDB3.51;”
& “Data Source= f:\xjgl\xjgl.mdb” Conn.Open
Connstr Rs.CursorLocation=adUseClient Rs.Open
“基本情況”,conn,adOpenKeyset,adLockPessimistic … conn.Close 2.Connection對象的歸還 Connection對象一經關閉,Connection對象和Recordset對象就不可使用,但Connection對象仍然存在,還會占有一定的系統(tǒng)資源,如果想完全釋放,則必須調用以下語句: Set conn=Nothing 總結:從Connection對象的建立、打開數據庫、打開數據表、關閉數據庫到歸還Connection對象所占有的系統(tǒng)資源,其完整過程如下: ‘步驟一:建立Connection對象 dim conn as New ADODB.Connection ‘步驟二:打開數據庫 conn.Open ConnStr ‘步驟三:打開數據表 Rs.CursorLocation=adUseClient Rs.Open “基本情況”,conn,adOpenKeyset,adLockPessimistic … ‘步驟四:關閉數據庫 conn.Close ‘步驟五:歸還Connection對象所占用的系統(tǒng)資源 Set conn=Nothing 一般會省略第四步和第五步,因為程序關閉時,該程序所打開的數據庫會自動關閉,而Connection對象所占用的系統(tǒng)資源也會自動釋放給系統(tǒng)。 三、Command對象與SQL語句的執(zhí)行 Command對象也是ADO對象群的一員。Command對象主要是專門用來執(zhí)行SQL語句的。 我們先來回憶一下前面介紹的SQL語句的執(zhí)行過程: ‘使用ADODC Adodc1.RecordSource=SQL語句 Adodc1.CommandType=adCmdText Adodc1.Refresh ‘使用Recordset.Open方法執(zhí)行SQL語句 rs.Open
SQL語句,conn,adopenDynamic,adLockOptimistic 顯然,上面兩種方法都沒有使用Command對象,但一樣執(zhí)行SQL語句。 1.Command對象執(zhí)行SQL語句 Dim
conn As New ADODB.Connection Dim
cmd As New ADODB.Command Dim
rs As New ADODB.Recordset Set
cmd.ActiveConnection = conn SQL
= "Select * From 基本情況表Where 姓名 Like '李%'" cmd.CommandText
= SQL Set
rs = cmd.Execute
Command對象
Set Cmd.ActiveConnection=conn
Set rs=Cmd.Execute SQL語句 通過以上比較發(fā)現(xiàn),兩種方法其實是同樣的。 2.帶參數的SQL語句 其實Command對象最大的妙用在于執(zhí)行“帶參數的SQL語句”。如: Select * from 成績 where 語文 between [low] and [high]
3.執(zhí)行帶參數的SQL語句 如何執(zhí)行帶參數的SQL語句?如下: Set cmd.ActiveConnection = conn SQL="Select * From 成績表 Where 語文 Between [low] And
[high]" cmd.CommandText = SQL Dim param(1) ' 定義兩個含有兩個元素的數組陣列 param(0) = Val(Text1.Text) param(1) = Val(Text2.Text) Set rs = cmd.Execute(, param) 以上cmd.Execute語句多了兩個參數,其意義如下: 參數1:返回數據記錄的條數,若省略,就表示返回所有的數據記錄。 參數2:用來指定SQL語句的參數值,應該傳人一個一維數組。如上例。 帶有參數的SQL語句的變形: Select * From 成績 Where 語文 Between [low] And [high] Select * From 成績 Where 語文 Between ?And ? 11.8 數據環(huán)境與報表設計器 通過前面的學習,我們了解到存取數據庫的首要任務,是建立Recordset對象,然而建立Recordset對象的方法有許多變化,變化之多,常令初學者不知所措,而Data
Envionment的主要功能就是把這些讓人眼花繚亂的內容集成在一起,一方面提供給用戶容易操作的可視化環(huán)境,另一方面也提供給數據庫程序一致的界面。 一、 Data
Envionment使用 1.Data
Envionment的添加與設置 利用Data
Environment打開xjgl.mdb的“基本情況表”,那么操作過程如下: 1)選取Visual Basic菜單的“工程/更多ActiveX設計器”,再單擊“Data
Environment”,添加一個Data Environment到工程中,此時Data Environment所顯示的窗口如圖11.8-1。Data
Environment默認名稱為DataEnvironment1,已包含一個連接對象Connection1。 2)在Connection1對象上單擊鼠標右鍵,選擇其快捷菜單下的“屬性”命令,接下來會出現(xiàn)“數據連接屬性”對話框,然后選取“Provider”選項卡下的“Microsoft
Jet 3.51 OLE DB Provider”,在“連接”選項卡中選“xjgl.mdb”,當設置完成后,單擊“確定”按鈕返回到Data
Environment窗口中。(此設置過程與ADODC控件的設計界面是相同的)。 3) 在Connection1對象上單擊鼠標右鍵,選擇其快捷菜單下的“添加命令”命令,如圖11.8-2所示,在Connection1下面會添加一個Command對象,其默認名稱為Command1。 4)在Command1對象上單擊鼠標右鍵,選擇其快捷菜單下的“屬性”命令,接著會出現(xiàn)“Command1屬性”對話框,在“通用”選項卡中選取“數據庫對象”下拉列表中的“表”選項,在“對象名稱”
下拉列表中的“基本情況表”,如圖11.8-3所示。 圖11.8-1
Data Environment窗口 圖11.8-2 添加命令窗口 圖11.8-3 Command1屬性窗口 經過以上四個步驟之后,我們其實就是建立了一個Connection對象和一個Command對象,具體設置如下:
如果我們不使用Data
Environment,而使用ADO來建立這兩個對象,則程序如下: Dim Connection1 As New ADODC. Dim Command1 As New ADODC.Command ConnStr=“Provider=Microsoft.Jet.OLEDB.3.51;Data Source=xjgl.mdb” Connection1.Open ConnStr Set Command1.ActiveConnection=Connection1 Command1.CommandType=adCmdTable Command1.CommandText=“基本情況表” 就像ADODC不具備顯示數據的能力一樣,Data Envionment也不具備顯示數據的能力,如要顯示數據,就必須使用數據識別控件。以DataGrid為例:
運行該程序,DataGrid就會顯示出來自DataEnvionment1/Command1的數據了。 2.多數據來源與DataMember屬性 若與ADODC相比,在設置過程中數據識別控件與Data Envionment連接所需要的屬性比ADODC的連接多了一個DataMember屬性。 其實DataMember在Data Envionment中十分重要,因為在同一個Data
Envionment下可以建立多個Connection對象,而同一個Connection對象下又可以建立多個Command對象,通過Command對象可以存取不同的數據源。下面接著上面的例子來說明。 1)在Connection1對象上單擊鼠標右鍵,選擇其快捷菜單下的“添加命令”命令,在Connection1下面會添加一個Command對象,其默認名稱為Command2。 2) 在Command2對象上單擊鼠標右鍵,選擇其快捷菜單下的“屬性”命令,接著會出現(xiàn)“Command2屬性”對話框,在“通用”選項卡中選取“數據庫對象”下拉列表中的“表”選項,在“對象名稱”
下拉列表中的“成績表”。 3)先選取DataGrid對象,然后單擊其DataMember屬性,這時可以看到可選擇的屬性值多了一個Command2,如圖11-24。如果將DataGrid的DataMember屬性設置為Command2,那么程序運行后,DataGrid將會顯示“成績表”的內容。 圖11.8-4 屬性窗口 其實,除了可以添加Command
對象外,也可添加Connection對象,添加方法是在DataEnvionment1上單擊鼠標右鍵,選擇快捷菜單下的“添加連接”命令,即可添加另
一個Connection對象,其默認名稱為Connection2,這樣Connection2下又可以添加多個Command對象用于分別連接不同的
數據表。 二、報表設計器 Data Envionment的另一個重要用途是為“報表設計器”提供數據源。VB6所提供的報表設計器稱為Data Report,但必須在專業(yè)版或企業(yè)版中才有這個控件。新建工程后,選取VB菜單的“工程/添加Data
Report”命令,即可添加Data Report至工程中。 我們把xjgl.mdb數據庫下的“基本情況表”輸出成報表,下面介紹報表制作過程: 1)首先添加一個Data Envionment到工程中,并連接好xjgl.mdb數據庫下的“基本情況表”。 2)添加一個Data Report到工程中,Data Report的結構如圖11-25所示,含有報表標頭、頁標頭、細節(jié)、頁注腳和報表注腳五個帶區(qū),在屬性窗口可以發(fā)現(xiàn)除Data
Report是一個對象外,Data Report上面的每一個帶區(qū)也各是一個對象。 圖11.8-5 Data Report對象窗口 3)利用屬性窗口設置Data Report對象的DataSource屬性值為DataEnvionment1,DataMember屬性值為Command1。 4)從Data Envionment中拖動對象Command1到Data Report的細節(jié)帶區(qū),出現(xiàn)如圖11-26所示結果。 圖11.8-6
Data Report的細節(jié)帶區(qū)窗口 5)在窗體上放置一個命令按鈕,并在其Click事件中輸入如下代碼: DataReport1.Show 執(zhí)行該程序并單擊命令按鈕,則會出現(xiàn)Data Report的報表預覽窗口。 |
|