




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第9章數(shù)據(jù)庫管理.VisualBasic在數(shù)據(jù)庫應(yīng)用程序的開發(fā)方面提供了包含數(shù)據(jù)管理器、數(shù)據(jù)控件和數(shù)據(jù)訪問對象等功能強大的工具,可協(xié)助編程人員輕松地連接數(shù)據(jù)庫文件,快捷、簡便地實現(xiàn)對數(shù)據(jù)庫的訪問和操作。在VisualBasic6.0的集成開發(fā)環(huán)境中,用戶可以用各種集成的可視化數(shù)據(jù)庫工具以及數(shù)據(jù)環(huán)境設(shè)計器管理和操作各種數(shù)據(jù)庫(包括像Oracle、SQLServer這樣的大型數(shù)據(jù)庫),并且能夠創(chuàng)建出各種可重用的數(shù)據(jù)訪問查詢,以及在報表設(shè)計器中通過拖動方式輕松地創(chuàng)建出優(yōu)秀的報表。9.1數(shù)據(jù)庫管理基本知識
在實際應(yīng)用中,我們常常需要借助數(shù)據(jù)庫管理系統(tǒng)(DBMS,DataBaseManagementSystem)管理大量的數(shù)據(jù)。VisualBasic提供強有力的數(shù)據(jù)庫管理功能,可在單機或網(wǎng)絡(luò)上生成并訪問數(shù)據(jù)庫。VisualBasic6.0將數(shù)據(jù)庫技術(shù)與面向?qū)ο蟮木幊碳夹g(shù)結(jié)合在一起,并加入了可任意與數(shù)據(jù)綁定的ActiveX技術(shù),使編程人員能夠很輕松地開發(fā)出使用方便、易于掌握的應(yīng)用程序,從而在很大程度上減輕了編程工作量,更有效地管理信息。VisualBasic建立的數(shù)據(jù)庫格式默認MSAccess應(yīng)用程序的MDB數(shù)據(jù)庫格式,不僅具有數(shù)據(jù)庫引摯,還能處理其它數(shù)據(jù)庫格式(如dBASE、Foxbase、FoxPro、Paradox等),針對其中的數(shù)據(jù)進行訪問操作。此外,VisualBasic也可以通過ODBC(開放式數(shù)據(jù)庫連接,OpenDataBaseConnectivity)以客戶/服務(wù)器方式來連接SQLServer等關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。9.1.1數(shù)據(jù)庫的體系結(jié)構(gòu)
數(shù)據(jù)庫是特定主題或目的相關(guān)的數(shù)據(jù)集合。該集合進一步組成表,用大家熟悉的記錄(行)和字段(列)格式表示特定主題的信息。數(shù)據(jù)庫通常由數(shù)據(jù)庫管理系統(tǒng)(DBMS)來建立和管理。例如,F(xiàn)oxPro、Paradox等都是數(shù)據(jù)庫管理系統(tǒng)。數(shù)據(jù)庫無論大小,都是由數(shù)據(jù)按照一定的結(jié)構(gòu)組織起來。數(shù)據(jù)庫的組織稱為結(jié)構(gòu),包括表、字段名、字段數(shù)據(jù)類型、字段大?。▽挾龋┖退饕取?shù)據(jù)庫的結(jié)構(gòu)必須在數(shù)據(jù)存入數(shù)據(jù)庫前定義。一個滿足用戶需求的數(shù)據(jù)庫,其結(jié)構(gòu)必須仔細地設(shè)計。表含有所有數(shù)據(jù),表中的每個字段有特定的數(shù)據(jù)類型;記錄存儲特定的人、事件和事物的所有信息(如一個學(xué)生的學(xué)籍信息)。在表中,所有的記錄含有相同的字段,表由相同類型的記錄集合組成。在表中,特定數(shù)據(jù)值存放在字段(列)和記錄(行)的交叉點。例如,學(xué)生“張萍”的出生年月存放在“張萍”記錄的“出生年月”字段中,可以通過查找記錄來查看該字段是否有相應(yīng)的數(shù)據(jù)值。數(shù)據(jù)庫中的數(shù)據(jù)可根據(jù)不同項目進行分類管理。以學(xué)籍表為例,學(xué)生的數(shù)據(jù)按順序分類成學(xué)號、姓名、性別、出生年月等字段,如表9-1所示。除此之外,還可以對每個學(xué)生的成績數(shù)據(jù)、獎懲情況、家庭情況等再建立多個表,形成一個彼此關(guān)聯(lián)的表群組。所謂的數(shù)據(jù)庫,就是由這些表群組的成員組成。因此,不僅數(shù)據(jù)庫中的數(shù)據(jù)可視需要隨時更新,數(shù)據(jù)庫中所包含的表成員也可視需要進行增減。學(xué)號姓名性別出生年月D001王濤男1982/5/4D002李冰女1982/1/3D003張紅女1980/9/17D004鄭潔女1980/10/15D005袁明男1981/2/10D006張萍女1980/11/2D007張駿男1980/12/23D008羅娟女1981/5/249.1.2數(shù)據(jù)庫管理的概念
本節(jié)簡單介紹數(shù)據(jù)庫管理中常用到的術(shù)語。1.數(shù)據(jù)庫和表目前使用的大部分數(shù)據(jù)庫都是關(guān)系型數(shù)據(jù)庫(RelationalDatabase)。一個關(guān)系型數(shù)據(jù)庫通過若干個表(Table)來存儲數(shù)據(jù),并且通過關(guān)系(Relational)將這些表聯(lián)系在一起。表以二維表格形式來表示。表是由行和列組成的數(shù)據(jù)集合,表中一行為一個記錄(Record),一列為記錄中的一個字段(Field)。例如,表9-1中所示的學(xué)籍表中,學(xué)號、姓名、性別、出生年月等都是字段,每個學(xué)生的字段數(shù)據(jù)構(gòu)成了該學(xué)生的一條記錄。可以將表看成是一種用戶自定義類型,表中的每一條記錄是一個這種用戶自定義類型的變量,字段是這種用戶自定義類型的各個分量。例如,若將表9-1稱為“學(xué)籍表”,該表可以看作是以下用戶自定義類型:
Type學(xué)籍表學(xué)號AsString姓名AsString性別AsString
出生年月AsDataEndType
其中,“學(xué)號”、“姓名”、“性別”和“出生年月”是組成用戶自定義類型“學(xué)籍表”的四個變量,正好與表中的四個字段對應(yīng)。表中的所有記錄相當(dāng)于一組被聲明為用戶自定義類型“學(xué)籍表”的變量。2.記錄和字段在表9-1中,每一行數(shù)據(jù)構(gòu)成了學(xué)籍表中的一條記錄,記錄是數(shù)據(jù)庫管理中操作的基本數(shù)據(jù)。每一列數(shù)據(jù)構(gòu)成了學(xué)籍表中的一個字段,每個字段都有相應(yīng)的字段名、數(shù)據(jù)類型、數(shù)據(jù)寬度等結(jié)構(gòu)描述信息。3.索引(Index)為了快速查詢數(shù)據(jù),數(shù)據(jù)庫中一般都使用索引。索引是以某個字段作為關(guān)鍵字進行排序,對數(shù)據(jù)庫中的數(shù)據(jù)進行組織。在某些條件下查詢數(shù)據(jù)庫時,使用索引可以顯著提高查詢的速度。4.關(guān)系在數(shù)據(jù)庫中,將表中可用來唯一標識記錄的字段稱為主關(guān)鍵字。主關(guān)鍵字指定的字段中,不能出現(xiàn)相同的值。例如,在表9-1的“學(xué)籍表”中,“學(xué)號”字段可唯一地標識不同的學(xué)籍記錄,因而可指定為該“學(xué)籍表”的主關(guān)鍵字。主關(guān)鍵字不僅可以是一個字段,也可以是多個字段。一般情況下,數(shù)據(jù)庫中表與表之間的關(guān)系是指某個表的主關(guān)鍵字和另一個表的主關(guān)鍵字之間的對應(yīng)關(guān)系。5.查詢(Query)由數(shù)據(jù)庫中按照關(guān)系組合而成的具有實際使用意義的表,稱為查詢。查詢不是數(shù)據(jù)庫中存儲的表,而是按照各種規(guī)則和要求“查”出來的表。查詢可通過SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)創(chuàng)建。SQL是一種標準的查詢語言,幾乎所有的關(guān)系數(shù)據(jù)庫系統(tǒng)都支持這種語言。各種關(guān)系型數(shù)據(jù)庫中的SQL語言有所不同,但最基本的語句和使用方法是一樣的。存儲在數(shù)據(jù)庫中的查詢,稱為視圖(View)。存儲在客戶/服務(wù)器數(shù)據(jù)庫中的、用SQL語句編寫的程序段,稱為存儲過程(StoredProcedure)。
SQL語言的主要功能由八個動詞來表達,用戶只需要寫出做什么,就可以得到查詢的結(jié)果。(1)數(shù)據(jù)查詢功能。SQL中用動詞Select實現(xiàn)查詢。查詢是SQL語言的核心,SQL的查詢操作可以從一個或多個表中找出滿足條件的元組。用Select可以實現(xiàn)數(shù)據(jù)庫的選擇、投影和連接等操作。例如,用以下Select語句可從數(shù)據(jù)庫中列出滿足查詢條件的指定字段值:
Select<字段列表>From<表列表>WHERE<查詢條件>
該語句可從<表列表>所指定的表中取出<字段列表>指定的字段,并通過<查詢條件>進行篩選,只有滿足條件的記錄才可被選出,從而創(chuàng)建了一個查詢。(2)數(shù)據(jù)定義功能。SQL的數(shù)據(jù)定義功能包括定義數(shù)據(jù)庫、定義基本表、定義視圖、定義索引等。SQL的數(shù)據(jù)定義可用相應(yīng)的動詞實現(xiàn),如Create等。(3)數(shù)據(jù)更新功能。SQL中用動詞Insert、Delete、Update實現(xiàn)數(shù)據(jù)更新。(4)數(shù)據(jù)控制功能。SQL中用動詞Grant、Revote實現(xiàn)數(shù)據(jù)控制。由于不同的數(shù)據(jù)庫管理系統(tǒng)在實現(xiàn)SQL語言時各有差別,并且一般都做了某種的擴充。因此,用戶在使用時應(yīng)參閱系統(tǒng)提供的有關(guān)手冊。6.Recordset(記錄集)對象應(yīng)用程序開始運行后,VisualBasic根據(jù)數(shù)據(jù)控件的設(shè)置打開所選取的數(shù)據(jù)庫,同時建立Database對象和Recordset對象。該對象在窗體的Form_Load()事件開始執(zhí)行前已自動產(chǎn)生。簡單地說,Recordset對象的作用是在程序中代表數(shù)據(jù)庫中的表(Table)。因此,在對數(shù)據(jù)控件連接的表進行“新增”、“修改”、“刪除”、“查詢”操作時,實際上是以Recordset對象所屬的AddNew、Edit、Delete和Seek等方法來處理。7、關(guān)系型數(shù)據(jù)庫的種類通常使用的關(guān)系型數(shù)據(jù)庫可分為兩類:文件數(shù)據(jù)庫(如Access、FoxPro、Paradox等)和客戶/服務(wù)器數(shù)據(jù)庫(如SQLServer、Oracle、Sybase等)??蛻?服務(wù)器數(shù)據(jù)庫是最典型的分布應(yīng)用結(jié)構(gòu)。客戶/服務(wù)器應(yīng)用程序分為兩部分,一部分位于客戶機,負責(zé)向用戶提供信息以及和用戶進行交互;另一部分位于服務(wù)器,負責(zé)進行具體的計算和數(shù)據(jù)庫的操作。在客戶/服務(wù)器數(shù)據(jù)庫中,對數(shù)據(jù)的處理和操作都是通過存儲過程(StoredProcedure)來完成的。存儲過程是用SQL語句編寫的程序段,就像VisualBasic中的函數(shù)或子程序。用戶可以通過編寫存儲過程在服務(wù)器端完成諸如修改數(shù)據(jù)、添加數(shù)據(jù)、刪除數(shù)據(jù)和查詢等工作。在使用中,只要通過位于客戶端的應(yīng)用程序調(diào)用這些存儲過程,就可以在服務(wù)端完成相應(yīng)的操作。由于存儲過程經(jīng)過預(yù)編譯和優(yōu)化,因而具有很高的效率??蛻?服務(wù)器數(shù)據(jù)庫的特點決定了其適用于大型、分布式、多用戶的數(shù)據(jù)庫系統(tǒng)。文件數(shù)據(jù)庫也可以放在服務(wù)器上供多個用戶使用,由于文件數(shù)據(jù)庫只能提供存取數(shù)據(jù)的功能,數(shù)據(jù)庫文件中被申請的所有數(shù)據(jù)都會被傳送到客戶機,在客戶機中進行查詢操作,而查詢出來的數(shù)據(jù)量一般只占所傳送數(shù)據(jù)的一小部分,從而增加了網(wǎng)絡(luò)流量,降低了應(yīng)用程序的性能。此外,對文件數(shù)據(jù)庫進行添加、刪除、修改等操作都要在客戶端通過查詢來完成。例如,若需要修改數(shù)據(jù)庫中的某個數(shù)據(jù),只能將表中的所有數(shù)據(jù)都傳送到客戶端,經(jīng)過修改后再將整個表送回到服務(wù)器端的數(shù)據(jù)庫中。因此,文件數(shù)據(jù)庫適用于小型的、單機的數(shù)據(jù)庫系統(tǒng)。進行數(shù)據(jù)庫開發(fā)時,應(yīng)先根據(jù)各種數(shù)據(jù)庫的特點和具體情況選擇一種合適的數(shù)據(jù)庫類型。9.1.3VisualBasic數(shù)據(jù)庫應(yīng)用程序的組成
1.用戶界面用戶界面包括用于與用戶交互的所有界面和代碼,如對數(shù)據(jù)庫記錄進行添加、修改、刪除、查詢的VisualBasic代碼,完成查詢和數(shù)據(jù)更新的窗體等。用戶界面不對數(shù)據(jù)庫進行實際的操作,而是請求數(shù)據(jù)庫服務(wù)的數(shù)據(jù)訪問對象和方法。2.數(shù)據(jù)庫引擎數(shù)據(jù)庫引擎是一組動態(tài)連接庫(DLL),主要任務(wù)是解釋應(yīng)用程序的請求并形成對數(shù)據(jù)倉庫的物理操作,管理對數(shù)據(jù)庫的物理操作,維護數(shù)據(jù)庫的完整性和安全性,處理結(jié)構(gòu)化查詢語言SQL的查詢操作,實現(xiàn)對數(shù)據(jù)庫的檢索、添加、刪改,管理查詢返回的結(jié)果等。應(yīng)用程序運行時,這些功能通過將動態(tài)連接庫連接到VisualBasic程序中來實現(xiàn)。3.數(shù)據(jù)倉庫數(shù)據(jù)倉庫是存放數(shù)據(jù)的地方,由若干個表文件組成。數(shù)據(jù)倉庫只包含數(shù)據(jù),而對數(shù)據(jù)的計算、檢索、排序等操作都由數(shù)據(jù)庫引擎來完成。可見,數(shù)據(jù)庫引擎是VisualBasic應(yīng)用程序與數(shù)據(jù)庫之間的橋梁,應(yīng)用程序通過數(shù)據(jù)庫引擎來完成對數(shù)據(jù)庫文件的存取操作。9.1.4用戶與數(shù)據(jù)庫引擎的接口
VisualBasic6.0中提供了生成并訪問數(shù)據(jù)庫的大量部件,包括數(shù)據(jù)控件(DataControl)、數(shù)據(jù)訪問對象(DAO,DataAccessObjects)和ActiveX數(shù)據(jù)對象(ADO,ActiveXDataObjects),可以用這些工具作為與數(shù)據(jù)庫引摯的接口。1.數(shù)據(jù)控件(DataControl)用數(shù)據(jù)控件可以不經(jīng)過編程而訪問數(shù)據(jù)庫。根據(jù)需要設(shè)置好數(shù)據(jù)控件的屬性后,即可通過諸如文本框之類的控件與數(shù)據(jù)控件綁定,從而實現(xiàn)對數(shù)據(jù)庫中各個記錄的訪問。但是,數(shù)據(jù)控件的功能有限,若要完成復(fù)雜的功能,還是需要編程來解決。2.數(shù)據(jù)訪問對象(DAO)數(shù)據(jù)訪問對象(DAO)是由MicrosoftJet數(shù)據(jù)庫引擎定義的對象,是通過程序訪問數(shù)據(jù)庫的對象結(jié)構(gòu)??梢杂脭?shù)據(jù)訪問對象(如Database、TableDef、Recordset對象)表示在代碼中用來組織和操作數(shù)據(jù)的對象。
DAO模型采用與關(guān)系型數(shù)據(jù)庫邏輯結(jié)構(gòu)相同的類的結(jié)構(gòu),對應(yīng)于數(shù)據(jù)庫的不同部分,存在相應(yīng)的數(shù)據(jù)訪問對象(如Database、TableDef、Field和Index對象),因而具有較高的效率。DAO模型向用戶提供創(chuàng)建數(shù)據(jù)庫、定義表和字段、建立和維護索引、建立表間的關(guān)系、進行結(jié)構(gòu)化查詢等工具在內(nèi)的一系列操作的屬性和方法。DAO不僅簡化了代碼,而且使數(shù)據(jù)庫的底層結(jié)構(gòu)更加透明,編程人員可以用同樣的對象、屬性和方法來處理各種不同數(shù)據(jù)庫格式,從而具有更多的靈活性。3.ActiveX數(shù)據(jù)對象(ADO)
ADO是VisualBasic6.0為數(shù)據(jù)訪問提供的全新技術(shù)。ADO是一種建立在最新數(shù)據(jù)訪問接口OLEDB之上的高性能的、統(tǒng)一的數(shù)據(jù)訪問對象,通過它可以訪問文件數(shù)據(jù)庫、客戶/服務(wù)器數(shù)據(jù)庫甚至非關(guān)系型數(shù)據(jù)庫。ADO提供了更高的性能、更小的系統(tǒng)開銷、更簡單的模型以及更靈活的操作。因此,ADO已經(jīng)成為VisualBasic中最主要的數(shù)據(jù)訪問對象。
注意:為了與VisualBasic早期的版本兼容,使得VisualBasic早期版本創(chuàng)建的數(shù)據(jù)庫工程能夠被VisualBasic6.0打開,原有的數(shù)據(jù)訪問對象還可以在VisualBasic6.0中繼續(xù)使用。9.1.5VisualBasic6.0可以訪問的數(shù)據(jù)庫類型
VisualBasic6.0通過數(shù)據(jù)庫引擎可以識別以下三類數(shù)據(jù)庫:1.VisualBasic數(shù)據(jù)庫
VisualBasic數(shù)據(jù)庫文件使用與MicrosoftAccess相同的格式,又稱內(nèi)部數(shù)據(jù)庫或本地數(shù)據(jù)庫。由于可用Jet引擎直接創(chuàng)建和操作這些數(shù)據(jù)庫,可以提供最大程度的靈活性和速度。2.外部數(shù)據(jù)庫在VisualBasic6.0中,能夠創(chuàng)建和操作所有“索引順序訪問方法(ISAM)”數(shù)據(jù)庫,如dBASE、FoxPro、Btrieve、Paradox等,還可以訪問電子表格軟件MSExcel或Lotus123、文本文件數(shù)據(jù)庫等。3.ODBC數(shù)據(jù)庫
VisualBasic可以訪問ODBC標準的客戶/服務(wù)器數(shù)據(jù)庫,如MSSQLServer等。利用VisualBasic提供的ODBCDirect模式,可以把命令直接傳遞給服務(wù)器處理,以創(chuàng)建真正的客戶/服務(wù)器數(shù)據(jù)庫管理程序。9.1.6創(chuàng)建Access2003數(shù)據(jù)庫
[例9-1]創(chuàng)建一個訂單管理的Access2003數(shù)據(jù)庫。
[分析]
要實現(xiàn)在VB6中操作數(shù)據(jù)庫,必須先規(guī)劃和建立數(shù)據(jù)庫。雖然VB6.0內(nèi)置了一個微型的數(shù)據(jù)庫設(shè)計器,一般在實際中比較少用,這里以常用的桌面小型數(shù)據(jù)庫Access2003為例,建立一個簡單的訂單管理數(shù)據(jù)庫db1.mdb,學(xué)習(xí)在MicrosoftAccess2003中創(chuàng)建數(shù)據(jù)庫的操作方法。該數(shù)據(jù)庫將作為本章后續(xù)范例的數(shù)據(jù)庫。
[規(guī)劃表結(jié)構(gòu)]
建立數(shù)據(jù)庫前,對需要保存的信息進行分析,然后對表結(jié)構(gòu)進行規(guī)劃。根據(jù)一般訂單需要保存的數(shù)據(jù),規(guī)劃表結(jié)構(gòu)如表9-2、表9-3和表9-4所示。其中,表示該字段為主關(guān)鍵。表9-2訂單表字段名訂單編號產(chǎn)品編號客戶編號數(shù)量單價下單日期送貨日期經(jīng)手人類型(長度)文本(20)文本(20)文本(20)整數(shù)數(shù)值
(2位小數(shù))日期日期文本(20)表9-3產(chǎn)品表字段名產(chǎn)品編號產(chǎn)品名稱單位規(guī)格類型(長度)文本(20)文本(50)文本(10)文本(20)表9-4客戶信息表字段名客戶編號姓名性別生日聯(lián)系電話公司地址類型(長度)文本(20)文本(50)是/否日期文本(20)文本(100)[建立表結(jié)構(gòu)]
在Access中創(chuàng)建表結(jié)構(gòu)的基本步驟如下:(1)啟動Access2003。(2)在菜單欄上選擇“文件→新建”選項,在“新建文件”任務(wù)窗格中選擇“空數(shù)據(jù)庫…”選項(見圖9-1),彈出“文件新建數(shù)據(jù)庫”對話框,如圖9-2所示。圖9-1“新建文件”任務(wù)窗格(3)選擇保存數(shù)據(jù)庫的位置和文件名,本例保存為C:\db1.mdb,如圖9-2所示。圖9-2“文件新建數(shù)據(jù)庫”對話框(4)單擊“創(chuàng)建”按鈕,打開表設(shè)計器,用表設(shè)計器創(chuàng)建“訂單表”,如圖9-3所示。雙擊打開表設(shè)計器表設(shè)計器圖9-3打開表設(shè)計器(5)設(shè)置“訂單編號”為主關(guān)鍵字,保存為“訂單表”,如圖9-4所示。建立好的訂單表,雙擊打開進行數(shù)據(jù)錄入圖9-4保存“訂單表”(6)按以上步驟依次建立“產(chǎn)品表”和“客戶信息表”,如圖9-5和圖9-6所示,完成數(shù)據(jù)庫的創(chuàng)建。圖9-5產(chǎn)品表
圖9-6客戶信息表9.2SQL語言基礎(chǔ)
數(shù)據(jù)庫查詢語言(SQL)是關(guān)系數(shù)據(jù)庫的標準語言,被很多類型的數(shù)據(jù)庫所支持。本節(jié)介紹最常用的操作數(shù)據(jù)庫的SQL語句,如數(shù)據(jù)查詢、刪除、添加和更新的實現(xiàn)等。其中四個最常用的SQL語句是本章使用ASP.NET數(shù)據(jù)控件的基礎(chǔ),即Select、Insert、delete和Update。更多的細節(jié)請參閱有關(guān)書籍。9.2.1查詢記錄的Select語句
Select語句的一般格式:Select<字段列表>Form<表名>[Where條件]
功能:Select語句功能非常豐富,可以按任意條件從一個表或多個表中查詢滿足條件的數(shù)據(jù),其語法也比較復(fù)雜。[例9-2]查詢“訂單表”中所有的數(shù)據(jù)。命令:Select*From訂單表說明:“*”號代表表中所有的字段,也可以按例9-3的方式列出每一個選擇的字段。[例9-3]以“訂單編號”為查詢條件,在“訂單表”中列出滿足條件的記錄。命令:Select訂單編號,產(chǎn)品編號,客戶編號,數(shù)量,下單日期,送貨日期From訂單表Where訂單編號="A1000"
說明:Select關(guān)鍵字后面需要列出的字段以逗號分隔;由于“訂單編號”字段為字符串類型,具體的值需要用雙引號作為定界符。如果將該SQL語句保存到字符串變量中,需要將雙引號改為單引號,如下所示:
DimsqlAsStringsql="Select訂單編號,產(chǎn)品編號,客戶編號,數(shù)量,下單日期,送貨日期From訂單表Where訂單編號='A1000'"[例9-4]查詢“訂單表”中數(shù)量>10或下單日期在2007-05-9與2007-09-09之間的訂單。命令:Select*From訂單表Where數(shù)量>10OR(下訂日期<=#2007-09-09#And下訂日期>=#2007-09-09#)
說明:條件Where關(guān)鍵字后面,如果字段類型為數(shù)字,則值不需要加任何定界符;如果是日期類型,其值必須帶#定界符。可以用邏輯運算符(And、Or和Not)連接多個條件。以上三個例子是分別以文本類型、數(shù)值類型和日期類型字段作為條件,使用SQL命令查詢數(shù)據(jù)所用的語法??梢栽贏ccess中對以上SQL語句的正確性進行驗證,檢查SQL語句是否正確,以及能否按照我們的條件得到所需要的結(jié)果。方法如下:(1)在Access中打開[例9-1]中建立的數(shù)據(jù)庫,選擇“查詢”對象,如圖9-7所示。2134雙擊添加[訂單表]圖9-7打開數(shù)據(jù)庫,選擇查詢對象(2)進入SQL命令的查詢設(shè)計模式,如圖9-8所示。添加的表選擇SQL視圖以便測試SQL命令圖9-8進入SQL命令查詢設(shè)計模式(3)輸入SQL命令并執(zhí)行命令,如圖9-9所示。
[例9-5]統(tǒng)計表的記錄數(shù)。命令:SelectCount(*)as記錄數(shù)From訂單表說明:在SQL語句中,可以使用內(nèi)部函數(shù)對記錄進行統(tǒng)計。Count函數(shù)作用是得到表中的記錄總數(shù)。
[例9-6]
統(tǒng)計“訂單表”中訂單編號="A1000"And客戶編號="K1"的訂貨總數(shù)量。命令:
SelectSum(數(shù)量)as訂貨量
From訂單表
Where訂單編號="A1000"and客戶編號="K1"
說明:本例用到Count()和Sum()函數(shù),以及其他函數(shù),如Max()、Min()等。[例9-7]在“客戶信息表”中查詢姓“張”的客戶信息(姓名以張開頭)。命令:Select*From客戶信息表where姓名Like"李*"
說明:Like關(guān)鍵字用于模糊匹配,“*”代替任意多個字符;“?”代表任意一個字符。
Select還有更多、更靈活的使用方式,可以滿足幾乎任何對表數(shù)據(jù)的查詢要求(讀者可參考其他相關(guān)資料)。1.輸入SQL命令2執(zhí)行SQL命令3執(zhí)行SQL命令結(jié)果4回到設(shè)計視圖圖9-9輸入并執(zhí)行SQL命令9.2.2添加記錄的Insert語句
Insert語句的一般格式:Insert
Into
表名(字段列表)Values(值列表)
功能:向表中添加一條新記錄。[例9-8]向訂單表添加一條新記錄。命令:
InsertInto訂單表(訂單編號,客戶編號,產(chǎn)品編號,數(shù)量,單價,下訂日期,送貨日期)Values("A2000","K1","C100",12,12.89,#2007-09-07#,#2007-12-30#)
注意:值列表的位置和個數(shù)類型應(yīng)與字段列表一一對應(yīng)。文本字段類型和日期字段類型對應(yīng)的常數(shù)值需要使用定界符。9.2.3刪除記錄的Delete語句
Delete語句的一般格式:Delete*From<表名>[Where條件][例9-9]刪除“訂單表”中訂單編號為A2000的記錄。命令:Delete*From訂單表Where訂單編號="A2000"說明:如果沒有Where子句,則刪除整個[訂單表]數(shù)據(jù)。9.2.4更新記錄的Update語句
Update語句的一般格式:Update<表名>Set<字段名=新字段值,[字段名=新字段值,>[Where條件][例9-10]修改“訂單表”,將訂單編號為“A1000”的“數(shù)量”改為20。命令:Update訂單表Set數(shù)量=20Where訂單編號="A1000"
說明:如果沒有Where子句,則所有記錄的“數(shù)量”字段值都將修改為20。9.3使用ADODC控件實現(xiàn)數(shù)據(jù)庫操作
9.3.1ADODC控件簡介在VB6的工具箱中的Data控件,只能連接Access2000及以下版本的數(shù)據(jù)庫。因此,本節(jié)使用外部控件ADODC控件連接Access2003數(shù)據(jù)庫,并使用外部表格控件顯示數(shù)據(jù)庫中表的數(shù)據(jù)。ADO是VisualBasic6.0為數(shù)據(jù)訪問提供的全新技術(shù)。ADO是一種建立在最新數(shù)據(jù)訪問接口OLEDB之上高性能的、統(tǒng)一的數(shù)據(jù)訪問對象,通過它可以訪問文件數(shù)據(jù)庫、客戶/服務(wù)器數(shù)據(jù)庫甚至非關(guān)系型數(shù)據(jù)庫。ADO提供了更高的性能、更小的系統(tǒng)開銷、更簡單的模型以及更靈活的操作。因此,ADO已經(jīng)成為VisualBasic中最主要的數(shù)據(jù)訪問對象。ADODC控件是將部分ADO對象及方法包裝起來,提供更加簡捷的方式進行數(shù)據(jù)庫的訪問。1.添加ADODC控件要使用ADODC控件連接數(shù)據(jù)庫并選擇數(shù)據(jù),必須添加ADODC控件到設(shè)計環(huán)境;要將ADODC控件選擇的數(shù)據(jù)顯示出來,可以使用標準控件中的文本框、列表框等數(shù)據(jù)控件,也可以使用外部的表格控件,如DataGrid。圖9-10是在工具箱中添加這兩個控件,并添加到窗體上的操作步驟。2.使用Adodc控件和DataGrid控件顯示數(shù)據(jù)庫中某個表數(shù)據(jù)的一般步驟(1)設(shè)置Adodc控件連接字符串屬性,選擇連接字符串,并選擇指定的數(shù)據(jù)庫文件(2)設(shè)置Adodc控件的記錄源屬性,按不同命令方式選擇表中的數(shù)據(jù)(3)設(shè)置DataGrid數(shù)據(jù)源為Adodc3.Adodc主要屬性(1)ConnectionString屬性:連接字符串。連接字符串相當(dāng)于數(shù)據(jù)庫的驅(qū)動程序,不同類型的數(shù)據(jù)庫有對應(yīng)的連接字符串。一般Access數(shù)據(jù)庫連接字符串的格式如下:
Provider=Microsoft.Jet.OLEDB.4.0;DataSource=指定的mdb數(shù)據(jù)庫位置
Provider部分為數(shù)據(jù)庫提供者;DataSource部分為指定的數(shù)據(jù)庫位置(2)CommandType屬性:命令類型??梢赃x擇AdCmdText(使用SQL命令)、AdCmdTable(使用表名稱)和AdCmdStoredProc(使用數(shù)據(jù)庫中已經(jīng)建立的存儲過程)。如果CommandType屬性的值等于adCmdUnknown(默認值),系統(tǒng)的性能將會降低。原因是ADO必須調(diào)用提供者,以確定CommandText屬性是SQL語句還是存儲過程或表格名稱。第二步第一步圖9-10控件添加(3)RecordSource屬性:記錄源。如果CommandType屬性值為AdCmdText,則該屬性為SQL命令文本;如果CommandType屬性值為AdCmdTable,則該屬性為具體表名稱。4.DataGrid主要屬性(1)DataSource屬性:數(shù)據(jù)來源。指明表格顯示的數(shù)據(jù)來源。(2)AllowaddNew屬性:是否容許添加數(shù)據(jù)(3)AllowDelete屬性:是否容許刪除數(shù)據(jù)(4)AllowUpdate屬性:是否容許修改數(shù)據(jù)9.3.2ADODC控件的應(yīng)用
[例9-11]根據(jù)[例9-1]的內(nèi)容規(guī)劃和建立的“訂單管理”數(shù)據(jù)庫db1.mdb,在窗體上用ADODC控件和數(shù)據(jù)表格控件DataGrid顯示“訂單表”的數(shù)據(jù)。
[分析]
首先必須通過ADODC控件選擇數(shù)據(jù)來源,即連接數(shù)據(jù)庫;選擇需要操作的數(shù)據(jù)庫對象,即具體的表。每個ADODC控件當(dāng)前只能操作一張表數(shù)據(jù),ADODC控件沒有顯示數(shù)據(jù)功能,若要顯示數(shù)據(jù),需要借助數(shù)據(jù)顯示控件,如文本框、列表框、表格控件等,本例選擇DataGrid表格控件。[建立工程]
創(chuàng)建工程,將ADODC控件和DataGrid控件添加到當(dāng)前工具箱,然后添加到窗體,采用默認名稱,分別為Adodc1和DataGrid1。設(shè)置Adodc1的Caption屬性為:訂單表,界面布局如圖9-11所示。圖9-11界面布局
圖9-12ADODC屬性[屬性設(shè)置]1.用鼠標右擊Adodc1控件,在彈出的快捷菜單中選擇“ADODC屬性”,如圖9-12所示。在屬性頁中選擇“通用”選項卡,選擇“連接資源”為“使用連接字符串”,單擊“生成(U)…”按鈕,如圖9-13所示。圖9-13ADODC控件屬性頁2.在“數(shù)據(jù)鏈接屬性”對話框(見圖9-14)中選擇Access數(shù)據(jù)庫連接字符串:MicrosoftJet4.0OLEDBProvider,單擊“下一步”按鈕。圖9-14數(shù)據(jù)鏈接屬性3.在“連接”選項卡(見圖9-15)中選擇數(shù)據(jù)庫所在位置;單擊“測試連接”按鈕,測試是否連接成功。確定后,將在“屬性頁”的“通用”選項卡中(見圖9-16)看到自動生成了連接字符串。選擇數(shù)據(jù)庫實際所在的位置測試是否連接成功圖9-15選擇數(shù)據(jù)庫及測試連接圖9-16生成連接字符串以上過程僅指定了連接不同類型數(shù)據(jù)庫使用的連接字符串,如果要顯示某個表的數(shù)據(jù),必須指定具體的表。在“屬性頁”對話框中選擇“記錄源”選項卡,按照圖9-17所示進行選擇,在當(dāng)前數(shù)據(jù)庫中準備選擇具體操作的表。最后,將DataGrid1表格控件的DataSource屬性設(shè)置為Adodc1,以便顯示Adodc1中選擇的數(shù)據(jù):[運行結(jié)果]完成以上操作后,按F5運行程序(不用寫一行代碼),即可以看到圖9-18所示的運行結(jié)果。在表格控件中可以直接修改數(shù)據(jù)、刪除數(shù)據(jù)和插入新記錄,數(shù)據(jù)自動完成更新操作。1.選擇命令類型為:2-adCmdTable2.選擇表名稱:訂單表圖9-17選擇記錄源圖9-18運行結(jié)果[總結(jié)與提高]本例在[屬性設(shè)置]中設(shè)置了ADODC控件的幾個屬性,其中,圖9-13~9-16所示操作設(shè)置了Adodc的ConnetionString屬性,可以在屬性窗口中看到該屬性值為圖9-17所示操作設(shè)置了CommandType屬性值為RecordSource屬性值為如果按照條件選擇數(shù)據(jù),可以用SQL語句實現(xiàn)條件選擇。操作方法:在RecordSource屬性中單擊[…]按鈕,彈出圖9-19所示對話框,按圖選擇和輸入SQL命令,實現(xiàn)條件選擇。圖9-19修改記錄源9.3.3ADODC控件的高級應(yīng)用
[相關(guān)知識]ADODC對象組織關(guān)系如圖9-20所示。ADODCRecordS[相關(guān)知識]ADODC對象組織關(guān)系etFieldsField如圖9-20所示。其中,F(xiàn)ield對象代表數(shù)據(jù)表格最小的數(shù)據(jù)單位,即表格中的字段(單元格),具有名稱Name(字段名)和值Value(字段值)屬性;數(shù)據(jù)表格中的每一列中所有的字段,組成Fileds字段集合,第1列為Fileds(0),第2列為Fields(1)…
…,如圖9-21所示。表格中的每一行,構(gòu)成一條記錄Record,RecordSet對象用來讀取每一條記錄的信息。實際上,RecordSet是指向表記錄的指針,包含當(dāng)前記錄(行)的信息,如果需要取得每一行的數(shù)據(jù),需要依次移動記錄指針來獲取。圖9-21RecordSet對象和Fileds集合對象示意VisualBasic6.0中,在一個數(shù)據(jù)庫表中取得任意字段信息(字段名和字段值)的操作步驟:“選擇并連接數(shù)據(jù)庫”→“選擇表”→“移動記錄指針”→“讀取字段屬性”例如,打開圖9-21中的“學(xué)生信息表”時,當(dāng)前記錄指針指向第1條記錄,讀取字段值的操作如下:取得第1個字段的值:Adodc1.recordset.Fields(0).value
取得第2個字段的值:Adodc1.recordset.Fields(1).value
…
…取得第N個字段的值:Adodc1.recordset.Fields(N-1).value由于Value是Fileds默認的屬性,且Fileds是RecordSet默認的屬性,因此,取得第1個字段值得方法可以為:Adodc1.recordset.Fields(0)或Adodc1.recordset.(0)。此外,也可以使用字段名的形式讀取字段信息,見表9-5。表9-5存取字段數(shù)據(jù)的其他形式格式格式形式比較1Adodc1.Recordset.Fields(“字段名稱”).value用字段名存取,不必關(guān)心字段位置2Adodc1.Recordset.Fields(“字段名稱”)用字段名存取,省略value[默認]3Adodc1.Recordset(“字段名稱”)簡潔,推薦使用的格式4Adodc1.Recordset![字段名稱]字段名稱必須為常數(shù),不常用例如:
Adodc1.Recordset(“姓名”):取得當(dāng)前記錄的姓名字段值
Xm=“姓名”
Adodc1.Recordset(Xm):取得當(dāng)前記錄的姓名字段值
Adodc1.Recordset![姓名]:取得當(dāng)前記錄的姓名字段值,但不能寫成:Adodc1.Recordset![Xm],使用該格式時,[]內(nèi)必須是常數(shù)。如果要取得第2~N條記錄中的字段信息,ADODC提供移動記錄指針的方法,參見表9-6。表9-6Recordset對象主要方法和屬性方法或?qū)傩悦Q描述Adodc1.Recordset.MoveFirst向前移動到第一條記錄Adodc1.Recordset.MoveLast向后移動到第最后一條記錄Adodc1.Recordset.MoveNext向后移動到下一條記錄Adodc1.Recordset.MovePrevious向前移動到上一條記錄Adodc1.Recordset.BOF向前移動時,是否移過第一條記錄Adodc1.Recordset.EOF向后移動時,是否移過了最后一條記錄Adodc1.Recordset.RecordCount記錄數(shù)Adodc1.Recordset.Fields.Count字段數(shù)ADODC控件中,記錄的移動(記錄導(dǎo)航按鈕)實際上是調(diào)用其RecordSet對象的移動記錄方法來實現(xiàn),各導(dǎo)航按鈕對應(yīng)的方法如圖9-22所示。圖9-22記錄移動方法其中,Adodc1.Recordset.AddNew為添加新記錄。[例9-12]讀取數(shù)據(jù):在例9-11建立的數(shù)據(jù)庫中,將“訂單表”中的的記錄讀取到列表框中顯示,結(jié)果如圖9-23所示。圖9-23運行界面[建立工程]創(chuàng)建工程,在窗體上添加一個ADODC控件、一個List控件和一個按鈕,名稱默認,分別為Adodc1、List1和Command1。調(diào)整布局如圖9-23所示。按照例9-11的步驟,設(shè)置Adodc1控件的ConnectionString和RecordSource屬性,連接數(shù)據(jù)庫,并指定記錄源。
[程序代碼]1 PrivateSubForm_Load()2 Adodc1.Refresh3 EndSub4 5 PrivateSubCommand1_Click()6 DimRecStrAsString7 List1.Clear8 9 Adodc1.Recordset.MoveFirst10 Fori=0ToAdodc1.Recordset.RecordCount-111 Forj=0ToAdodc1.Recordset.Fields.Count-112 RecStr=RecStr&Adodc1.Recordset.Fields(j).Value&vbTab13 Next14 List1.AddItemRecStr15 RecStr=""16 Adodc1.Recordset.MoveNext17 Next18 EndSub[代碼分析]
行1~3:當(dāng)Adodc控件沒有綁定到任何顯示的數(shù)據(jù)控件時,必須調(diào)用其Refresh方法,連接數(shù)據(jù)庫,并執(zhí)行記錄源讀取。行6:定義變量RecStr,準備保存讀取的記錄。行9:將記錄指針移到第一條記錄,以便可以重復(fù)讀取記錄。
行10:根據(jù)數(shù)據(jù)表中的記錄數(shù)RecordCount,準備循環(huán)讀取記錄行11:Adodc1.Recordset.Fields.Count,每一條記錄具有的字段數(shù)。行12:Adodc1.Recordset.Fields(j).Value,第j個字段的值。vbTab為系統(tǒng)常數(shù),相當(dāng)于四個長度的空格,便于對齊數(shù)據(jù)。行16:要讀取下一條記錄,必須將記錄指針移動到下一條。注意:本例運行前,必須將Adodc1控件連接上數(shù)據(jù)庫,并設(shè)置其記錄源。
[運行結(jié)果]
按F5運行程序,單擊Command1按鈕,將看到圖9-23所示結(jié)果。[例9-13]刪除指定記錄:刪除[訂單表]中訂單編號為A1000的記錄
[建立工程]
在例9-12的基礎(chǔ)上,在界面上添加一個按鈕控件,名稱為Command2,編寫以下代碼,實現(xiàn)將滿足條件的記錄刪除。
[程序代碼]1 PrivateSubCommand2_Click()2 Adodc1.Recordset.MoveFirst'將指針移到第一條記錄
3 WhileNotAdodc1.Recordset.EOF'依此取得每一條記錄
4 IfAdodc1.Recordset("訂單編號")="A1000"Then'通過[訂單編號]字段的值比較是否滿足條件
5 Adodc1.Recordset.Delete6 EndIf7 Adodc1.Recordset.MoveNext'取得下一條記錄,特別注意!。不移動記錄將進入死循環(huán)
8 Wend9 EndSub[代碼說明]行2:將記錄指針移動到第一條記錄,準備從第一條記錄到最后一條記錄中查找滿足條件的記錄。行3:EOF屬性表示,在移動記錄過程中,是否已經(jīng)超過了最后一條記錄,如果值為True是,則已經(jīng)處于最后一條記錄了,不能再往前移動了,而BOF屬性表示向后移動記錄時,是否已經(jīng)超過了第一條記錄,如果值為True,則不能再往后移動了,否則將出錯。行4:判斷字段值是否滿足要刪除的條件。這是Adodc1.Recordset.Fields("訂單編號").Value的簡潔寫法。行5:執(zhí)行記錄刪除。行7:繼續(xù)移動記錄,直到全部記錄查找完畢。[例9-13]修改記錄:將“訂單表”中訂單編號為A1001的記錄,數(shù)量修改為20,客戶編號修改為K3,送貨日期修改為今天日期。[建立工程]在例9-12的基礎(chǔ)上,在界面上添加一個按鈕控件,名稱為Command3,編寫以下的代碼,可以修改滿足條件的記錄。[程序代碼]PrivateSubCommand3_Click()Adodc1.Recordset.MoveFirst'將指針移到第一條記錄
WhileNotAdodc1.Recordset.EOF'依次取得每一條記錄
IfAdodc1.Recordset("訂單編號")="A1001"Then'比較是否滿足條件
Adodc1.Recordset("數(shù)量")=10'數(shù)字類型數(shù)據(jù)
Adodc1.Recordset("客戶編號")="K3"'字符串類型數(shù)據(jù)
Adodc1.Recordset("送貨日期")=Now'日期類型格式'如果是常數(shù),則使用如:#9/9/2009#Adodc1.Recordset.Update'修改后,執(zhí)行更新動作
EndIfAdodc1.Recordset.MoveNextWendEndSub[代碼說明]本例通過Adodc控件的Recordset對象的方法實現(xiàn)記錄的修改,基本思路:找到需要修改的記錄,將字段內(nèi)容設(shè)置為新的值,然后執(zhí)行更新操作。其他說明見代碼中的注釋。[例9-14]添加新記錄:添加新記錄到訂單表。[建立工程]在例9-12的基礎(chǔ)上,在界面上添加一個按鈕控件,名稱為Command4,編寫以下的代碼,在當(dāng)前表中插入新記錄。[程序代碼]PrivateSubCommand4_Click()Adodc1.Recordset.AddNewAdodc1.Recordset("訂單編號")="A2008"Adodc1.Recordset("客戶編號")="KK"Adodc1.Recordset("產(chǎn)品編號")="C2000"Adodc1.Recordset("數(shù)量")=2Adodc1.Recordset.UpdateEndSub[代碼說明]在表中添加新記錄,必須通過.Recordset對象的方法AddNew先插入一空行,然后依次填充每個字段值,最后保存記錄。[總結(jié)與提高]例9-11~例9-14界面布局如圖9-24所示。List1Adodc1Command1~Command4圖9-24界面布局完整的源代碼如下:PrivateSubForm_Load()Adodc1.RefreshEndSub'讀出數(shù)據(jù)按鈕代碼PrivateSubCommand1_Click()DimRecStrAsStringList1.Clear
Adodc1.Recordset.MoveFirstFori=0ToAdodc1.Recordset.RecordCount-1Forj=0ToAdodc1.Recordset.Fields.Count-1RecStr=RecStr&Adodc1.Recordset.Fields(j).Value&vbTabNext
List1.AddItemRecStrRecStr=""Adodc1.Recordset.MoveNextNextEndSubList1Adodc1Command1~Command4圖9-24界面布局'刪除記錄按鈕代碼PrivateSubCommand2_Click()Adodc1.Recordset.MoveFirst'將指針移到第一條記錄
WhileNotAdodc1.Recordset.EOF'依此取得每一條記錄
IfAdodc1.Recordset.Fields("訂單編號").Value="A1000"Then'通過[訂單編號]字段的值比較是否滿足條件
Adodc1.Recordset.DeleteEndIfAdodc1.Recordset.MoveNext'取得下一條記錄,特別注意!。不移動記錄將進入死循環(huán)
WendEndSub'修改記錄按鈕代碼PrivateSubCommand3_Click()Adodc1.Recordset.MoveFirst'將指針移到第一條記錄
WhileNotAdodc1.Recordset.EOF'依此取得每一條記錄
IfAdodc1.Recordset("訂單編號")="A1001"Then'通過姓名字段的值比較是否滿足條件
Adodc1.Recordset("數(shù)量")=10'數(shù)字類型數(shù)據(jù)
Adodc1.Recordset("客戶編號")="K3"'字符串類型數(shù)據(jù)
Adodc1.Recordset("送貨日期")=Now'日期格式常數(shù)#9/9/2009#Adodc1.Recordset.Update'修改后,執(zhí)行更新動作
EndIfAdodc1.Recordset.MoveNextWendEndSub'添加記錄按鈕代碼PrivateSubCommand4_Click()Adodc1.Recordset.AddNewAdodc1.Recordset("訂單編號")="A2008"Adodc1.Recordset("客戶編號")="KK"Adodc1.Recordset("產(chǎn)品編號")="C2000"Adodc1.Recordset("數(shù)量")=2Adodc1.Recordset.UpdateEndSub[例9-15]記錄查詢:在“訂單表”中查找以"A"開頭的所有訂單。[程序代碼]Adodc1.Recordset.MoveFirstAdodc1.Recordset.Find"訂單編號like'A%'",0,adSearchForwardIfAdodc1.Recordset.EOF=FalseThenMsgBoxAdodc1.Recordset("訂單編號")EndIfWhileNotAdodc1.Recordset.EOFAdodc1.Recordset.Find"訂單編號like'A%'",1,adSearchForwardIfAdodc1.Recordset.EOF=FalseThenMsgBoxAdodc1.Recordset("訂單編號")EndIfWend[總結(jié)與提高]Recordset對象的Find方法可以實現(xiàn)記錄的查詢,它將在Recordset中查找滿足指定條件的記錄,如果條件符合,則記錄集位置設(shè)置在找到的記錄上,否則位置將設(shè)置在記錄集的末尾。語法格式:Find(criteria,SkipRows,searchDirection,start)作用:查找符合某一條件的記錄,然后將查找到的第一條記錄設(shè)置為當(dāng)前記錄。參數(shù)說明:(1)criteria:字符串,包含用于搜索的指定列名、比較操作符和值的語句。criteria中的“比較操作符”可以是“>”(大于)、“<”(小于)、“=”(等于)或“l(fā)ike”(模糊查詢),例如:數(shù)量>=10。criteria中的值可以是字符串、數(shù)字或者日期。字符串值以單引號分隔(如“state='WA'”)。日期值以“#”(數(shù)字記號)分隔,如:’下單日期>#7/22/97#’。若“比較操作符”為“l(fā)ike”,則字符串“值”可以包含“*”(某字符可出現(xiàn)一次或多次)或者“_”(某字符只出現(xiàn)一次)。例如: 姓名like’張%’
姓張(其中“%”號等價于“*”號)姓名like’張_’
姓張,但長度為2的姓名like’%張%’
包含張的姓名like’%華’
以華結(jié)尾的(2)下面三個參數(shù)可選:SkipRows:跳過幾條記錄才開始查找,默認值為0,它指定當(dāng)前行或start書簽的位移以開始搜索。searchDirection:查找方向,向前或向后,默認向后查找。Start:用作搜索的開始位置??蛇x,如果省略,表示從當(dāng)前記錄開始查找。Find方法只適合于單條件的簡單查詢。對于使用AND和OR邏輯運算符的多條件組合查詢表達式,可以使用RecordSet對象的Fiter屬性,以篩選滿足指定條件的記錄。例如,選擇所有訂單編號以A開頭、數(shù)量大于10的記錄,可以寫為:
Adodc1.Recordset.Filter="訂單編號like'A%'and數(shù)量>10"9.4使用ADO對象實現(xiàn)數(shù)據(jù)庫操作
ActiveXDataObjects(ADO)是VB6.0最新提供的數(shù)據(jù)訪問接口編程模型。數(shù)據(jù)訪問接口是一個對象模型,代表訪問數(shù)據(jù)的各個方面。在VisualBasic中,可用的數(shù)據(jù)訪問接口有三種:ActiveX數(shù)據(jù)對象(ADO)、遠程數(shù)據(jù)對象(RDO)和數(shù)據(jù)訪問對象(DAO)。這三種接口分別代表了該技術(shù)的不同發(fā)展階段。最新的是ADO,是比RDO和DAO更加簡單,更加靈活的對象模型。對于新建的VB工程,應(yīng)該使用ADO作為數(shù)據(jù)訪問接口。對于現(xiàn)存的工程,VisualBasic繼續(xù)支持DAO和RDO。ADO對象模型如圖9-25所示。其中,Command對象和RecordSet對象依賴于Connection對象而存在。每個對象都具有屬性集合。圖9-25ADO對象模型ADO的目標是訪問、編輯和更新數(shù)據(jù)源,而編程模型體現(xiàn)了為完成該目標所必需的系列動作的順序。ADO提供類和對象,以完成以下活動:連接到數(shù)據(jù)源(Connection)??蛇x擇開始一個事務(wù)??蛇x擇創(chuàng)建對象來表示SQL命令(Command)??蛇x擇在SQL命令中指定列、表和值作為變量參數(shù)(Parameter)。執(zhí)行命令(Command、Connection或Recordset)。如果命令按行返回,則將行存儲在緩存中(Recordset)??蛇x擇創(chuàng)建緩存視圖,以便能對數(shù)據(jù)進行排序、篩選和定位(Recordset)。通過添加、刪除或更改行和列編輯數(shù)據(jù)(Recordset)。在適當(dāng)情況下,使用緩存中的更改內(nèi)容來更新數(shù)據(jù)源(Recordset)。在使用事務(wù)之后,可以接受或拒絕在事務(wù)期間所作的更改。結(jié)束事務(wù)(Connection)。使用ADO對象訪問數(shù)據(jù)庫的過程,與使用ADODC控件訪問數(shù)據(jù)庫一致,一般步驟如下:1.創(chuàng)建連接對象Connection,打開與數(shù)據(jù)庫連接。2.僅執(zhí)行SQL命令,或通過執(zhí)行SQL獲取記錄集對象RecordSet。3.通過RecordSet對象執(zhí)行各種數(shù)據(jù)操作,如:顯示數(shù)據(jù)、編輯數(shù)據(jù)、查詢數(shù)據(jù)等。4.關(guān)閉數(shù)據(jù)庫連接。要在VB6工程中使用ADO對象模型,需要在IDE環(huán)境的菜單欄上選擇“工程→引用”選項,然后添加對“MicrosoftActiveXDataObjects2.0Library”項的引用。9.4.1讀取記錄
[例9-15]使用ADO對象,讀取訂單管理數(shù)據(jù)庫db1.mdb中“訂單表”的數(shù)據(jù),顯示在列表框List1中。[分析]本例主要介紹使用ADO對象來建立與數(shù)據(jù)庫的連接,并且讀取數(shù)據(jù)庫中指定表記錄的一般步驟。要使用ADO對象連接數(shù)據(jù)庫,首先必須創(chuàng)建連接對象,并設(shè)置其連接字符串,最后打開連接。讀取表中記錄時,必須首先創(chuàng)建記錄集對象,通過已經(jīng)建立的連接對象,執(zhí)行SQL命令,最后讀出記錄集中的記錄信息。數(shù)據(jù)讀取完畢,必須關(guān)閉數(shù)據(jù)庫的連接,以釋放系統(tǒng)占用的資源。[建立工程]在窗體上添加一個按鈕Commadn1和一個列表框控件List,調(diào)整布局如圖9-26所示。Command1List1Command1List1圖9-26界面布局[程序代碼]1 PrivateSubCommand1_Click()2 '第1步:建立連接對象3 DimconnAsNewADODB.Connection4 DimrsAsNewADODB.Recordset5 6 '第2步:連接到數(shù)據(jù)庫7 conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&App.Path&"\db1.mdb"8 conn.Open9 10 '第3步:打開記錄集11 rs.Open"Select*from訂單表",conn,adOpenStatic,adLockReadOnly12 13 '第4步:讀取數(shù)據(jù)14 WhileNotrs.EOF15 Fori=0Tors.Fields.Count-116 s=s&rs(i)&vbTab17 Next18 19 List1.AddItems20 s=""21 22 rs.MoveNext23 Wend24 25 '第5步:關(guān)閉數(shù)據(jù)庫連接26 rs.Close27 conn.Close28 EndSub[代碼說明]注意:本例中必須添加對“MicrosoftActiveXDataObjects2.0Library”項的外部引用。行3:創(chuàng)建連接對象,也可以省略ADODB,直接寫成:DimconnAsNewConnection。行4:創(chuàng)建記錄集對象。行7:設(shè)置連接對象的連接字符串屬性,該連接字符串含義已經(jīng)在10.4.1節(jié)進行了說明,App.Path取得當(dāng)前工程所在的位置,一般數(shù)據(jù)庫文件都放置在應(yīng)用程序所在的位置。測試本例時,必須將db1.mdb數(shù)據(jù)庫放在工程目錄下。行8:創(chuàng)建連接對象,并設(shè)置其ConnectionString屬性后,調(diào)用Open方法,打開與數(shù)據(jù)庫的連接。行11:使用已經(jīng)建立的連接對象,執(zhí)行SQL命令,從而打開數(shù)據(jù)庫中的表。記錄集對象中Open方法參數(shù)含義如下:參數(shù)1:表名,或SQL命令文本;參數(shù)2:已經(jīng)與數(shù)據(jù)庫建立連接的對象Connection
參數(shù)3:在ADO對象模型中定義的游標“每條記錄的索引”類型。有四種不同的游標類型(“讀取數(shù)據(jù)方式”),如圖9-27所示,含義見表9-7。圖9-27四種游標類型表9-7四種不同的游標類型常量含義動態(tài)游標[多用戶使用]
2—adOpenDynamic用于查看其他用戶所作的添加、更改和刪除,并用于不依賴書簽的Recordset中各種類型的移動。如果提供者支持,可使用書簽。鍵集游標[多用戶使用]
1—adOpenKeySet其行為類似動態(tài)游標,不同的只是禁止查看其他用戶添加的記錄,并禁止訪問其他用戶刪除的記錄,其他用戶所作的數(shù)據(jù)更改將依然可見。它始終支持書簽,因此允許Recordset中各種類型的移動。靜態(tài)游標[往復(fù)式讀取]
3-adOpenStatic提供記錄集合的靜態(tài)副本以查找數(shù)據(jù)或生成報告。它始終支持書簽,因此允許Recordset中各種類型的移動。其他用戶所作的添加、更改或刪除將不可見。這是打開客戶端(ADOR)Recordset對象時唯一允許使用的游標類型。僅向前游標[只向下讀取]
0-adOpenForwardOnly除僅允許在記錄中向前滾動之外,其行為類似動態(tài)游標。這樣,當(dāng)需要在Recordset中單程移動時就可提高性能參數(shù)4:在ADO對象模型中確定提供者打開Recordset
時應(yīng)該使用的鎖定(并發(fā))類型(“編輯數(shù)據(jù)方式”),如圖9-28所示,含義見表9-8。圖9-28四種鎖定(并發(fā))類型表9-8四種不同的鎖定(并發(fā))類型常量說明1--AdLockReadOnly(默認值)只讀—
不能改變數(shù)據(jù)。2--AdLockPessimistic保守式鎖定(逐個)—
提供者完成確保成功編輯記錄所需的工作,通常通過在編輯時立即鎖定數(shù)據(jù)源的記錄。修改記錄時,鎖定,其他用戶不可操作該記錄,;如果被其他用戶鎖定,程序?qū)⒊鲥e。3--AdLockOptimistic開放式鎖定(逐個)—
提供者使用開放式鎖定,只在調(diào)用Update方法時才鎖定記錄。假定其他人不會同時編輯該條當(dāng)前操作的記錄4--AdLockBatchOptimistic開放式批更新—用于批更新模式(與立即更新模式相對)。同上,假設(shè)同一時間,當(dāng)前操作的一批記錄其他人不會同時操作如果僅僅只讀取數(shù)據(jù),則參數(shù)3和參數(shù)4一般設(shè)置為:3-adOpenStatic和1-AdLockReadOnly,如果是在單機環(huán)境下使用,為了可以讀寫數(shù)據(jù),一般兩者都選擇方式3,以提供更多的功能支持。在網(wǎng)絡(luò)環(huán)境下,需要根據(jù)具體要求而定。行14:EOF,判斷記錄是否移過末行。rs中的屬性和方法,與在Adodc控件介紹中的RecordSet對象屬性和方法完全一致。其實,如果是使用了ADODC打開數(shù)據(jù)庫(表),ADODC最終還是調(diào)用ADO提供的方法來打開數(shù)據(jù)庫(表)。ADODC是利用ADO對象建立起來的一種控件方式。如果要使數(shù)據(jù)庫處理程序能更專業(yè)、更靈活的處理數(shù)據(jù),應(yīng)當(dāng)象本例那樣使用ADO對象。行15~19:讀取記錄中每一個字段值,連接成字符串,添加到List1控件中。該過程與[例9-11]一致。行22:注意,別忘記移動記錄到下一條!行26:關(guān)閉打開的表,釋放占用的系統(tǒng)資源。行27:關(guān)閉數(shù)據(jù)庫。[運行結(jié)果]如圖9-29所示圖9-29運行結(jié)果9.4.2數(shù)據(jù)查詢
[例9-16]按訂單編號或下單日期查詢訂單信息,實現(xiàn)圖9-30所示的執(zhí)行結(jié)果。[分析]本例按條件選擇數(shù)據(jù),并將數(shù)據(jù)顯示在DataGrid控件中。主要介紹使用ADO對象如何執(zhí)行SQL查詢命令語句Select,并動態(tài)得到查詢的的結(jié)果(記錄集)。圖9-30運行界面[建立工程]在窗體上添加一個外部表格控件DataGrid1,添加一個框架控件Frame1,設(shè)置其標題為“查詢條件”;在Frame1中依次添加兩個單選按鈕Option1和Option2,一個文本框Text1和一個組合框Combo1。設(shè)置Combo1的Style屬性為:2-DropDownList,并在其List屬性中預(yù)先輸入四項內(nèi)容:精確匹配;以之開頭;以之結(jié)尾;包含。添加兩個日期選擇外部控件,名稱Name分別修改為Dtp1和Dtp2,調(diào)整布局如圖9-31所示。圖9-31界面布局[程序代碼]1 DimconnAsNewADODB.Connection2 DimrsAsNewRecordset3 4 '初始化控件5 SubInit()6 Combo1.ListIndex=07 Text1.Text=""8 DTP1.Value=Now-30'當(dāng)前日期-30天,即一個月之前的日期9 DTP2.Value=Now'當(dāng)前日期10 Option1.Value=True11 EndSub12 13 '連接數(shù)據(jù)庫,并打開表,設(shè)置表格控件數(shù)據(jù)來源為Rec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)級安全培訓(xùn)考試試題ab卷
- 2024年小學(xué)六年級語文志愿服務(wù)體驗題試題及答案
- 2025年小學(xué)語文教育框架試題及答案
- 藥物變遷與歷史試題及答案
- 2024年汽車保養(yǎng)常用工具介紹試題及答案
- 語文考試一年級復(fù)習(xí)重難點試題及答案
- 跳出舒適區(qū)的計算機基礎(chǔ)試題及答案
- 2024年汽車維修工工具使用方法試題及答案
- 汽車美容培訓(xùn)與考試需求分析及試題與答案
- 二手車評估工作中的服務(wù)質(zhì)量管理試題及答案
- (一模)青島市2025年高三年級第一次適應(yīng)性檢測地理試卷(含標準答案)
- 2025年鐵嶺衛(wèi)生職業(yè)學(xué)院單招職業(yè)技能測試題庫學(xué)生專用
- 2025年公務(wù)員遴選考試公共基礎(chǔ)知識必考題庫170題及答案(九)
- 廣告投放預(yù)算分配情況統(tǒng)計表(按預(yù)算項目)
- 2025年高考預(yù)測猜題 化學(xué) 信息必刷卷01(新高考 通 用)(解析版)
- 壓瘡的六個分期及護理措施
- 滬教版(五四學(xué)制)(2024)六年級數(shù)學(xué)下冊 第六章 圓和扇形 單元測試題(含解析)
- 2025年開封大學(xué)單招職業(yè)技能測試題庫完整
- 30-提前介入在建高鐵的實踐與思考5則范文
- 職業(yè)教育培訓(xùn)需求分析課件
- 2025版礦山安全生產(chǎn)責(zé)任承包協(xié)議范本3篇
評論
0/150
提交評論