Visual-Basic程序設(shè)計(jì)課件第9章 數(shù)據(jù)庫管理_第1頁
Visual-Basic程序設(shè)計(jì)課件第9章 數(shù)據(jù)庫管理_第2頁
Visual-Basic程序設(shè)計(jì)課件第9章 數(shù)據(jù)庫管理_第3頁
Visual-Basic程序設(shè)計(jì)課件第9章 數(shù)據(jù)庫管理_第4頁
Visual-Basic程序設(shè)計(jì)課件第9章 數(shù)據(jù)庫管理_第5頁
已閱讀5頁,還剩137頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章數(shù)據(jù)庫管理.VisualBasic在數(shù)據(jù)庫應(yīng)用程序的開發(fā)方面提供了包含數(shù)據(jù)管理器、數(shù)據(jù)控件和數(shù)據(jù)訪問對(duì)象等功能強(qiáng)大的工具,可協(xié)助編程人員輕松地連接數(shù)據(jù)庫文件,快捷、簡(jiǎn)便地實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問和操作。在VisualBasic6.0的集成開發(fā)環(huán)境中,用戶可以用各種集成的可視化數(shù)據(jù)庫工具以及數(shù)據(jù)環(huán)境設(shè)計(jì)器管理和操作各種數(shù)據(jù)庫(包括像Oracle、SQLServer這樣的大型數(shù)據(jù)庫),并且能夠創(chuàng)建出各種可重用的數(shù)據(jù)訪問查詢,以及在報(bào)表設(shè)計(jì)器中通過拖動(dòng)方式輕松地創(chuàng)建出優(yōu)秀的報(bào)表。9.1數(shù)據(jù)庫管理基本知識(shí)

在實(shí)際應(yīng)用中,我們常常需要借助數(shù)據(jù)庫管理系統(tǒng)(DBMS,DataBaseManagementSystem)管理大量的數(shù)據(jù)。VisualBasic提供強(qiáng)有力的數(shù)據(jù)庫管理功能,可在單機(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ù)庫格式默認(rèn)MSAccess應(yīng)用程序的MDB數(shù)據(jù)庫格式,不僅具有數(shù)據(jù)庫引摯,還能處理其它數(shù)據(jù)庫格式(如dBASE、Foxbase、FoxPro、Paradox等),針對(duì)其中的數(shù)據(jù)進(jìn)行訪問操作。此外,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ù)集合。該集合進(jìn)一步組成表,用大家熟悉的記錄(行)和字段(列)格式表示特定主題的信息。數(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ù)庫前定義。一個(gè)滿足用戶需求的數(shù)據(jù)庫,其結(jié)構(gòu)必須仔細(xì)地設(shè)計(jì)。表含有所有數(shù)據(jù),表中的每個(gè)字段有特定的數(shù)據(jù)類型;記錄存儲(chǔ)特定的人、事件和事物的所有信息(如一個(gè)學(xué)生的學(xué)籍信息)。在表中,所有的記錄含有相同的字段,表由相同類型的記錄集合組成。在表中,特定數(shù)據(jù)值存放在字段(列)和記錄(行)的交叉點(diǎn)。例如,學(xué)生“張萍”的出生年月存放在“張萍”記錄的“出生年月”字段中,可以通過查找記錄來查看該字段是否有相應(yīng)的數(shù)據(jù)值。數(shù)據(jù)庫中的數(shù)據(jù)可根據(jù)不同項(xiàng)目進(jìn)行分類管理。以學(xué)籍表為例,學(xué)生的數(shù)據(jù)按順序分類成學(xué)號(hào)、姓名、性別、出生年月等字段,如表9-1所示。除此之外,還可以對(duì)每個(gè)學(xué)生的成績(jī)數(shù)據(jù)、獎(jiǎng)懲情況、家庭情況等再建立多個(gè)表,形成一個(gè)彼此關(guān)聯(lián)的表群組。所謂的數(shù)據(jù)庫,就是由這些表群組的成員組成。因此,不僅數(shù)據(jù)庫中的數(shù)據(jù)可視需要隨時(shí)更新,數(shù)據(jù)庫中所包含的表成員也可視需要進(jìn)行增減。學(xué)號(hào)姓名性別出生年月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é)簡(jiǎn)單介紹數(shù)據(jù)庫管理中常用到的術(shù)語。1.數(shù)據(jù)庫和表目前使用的大部分?jǐn)?shù)據(jù)庫都是關(guān)系型數(shù)據(jù)庫(RelationalDatabase)。一個(gè)關(guān)系型數(shù)據(jù)庫通過若干個(gè)表(Table)來存儲(chǔ)數(shù)據(jù),并且通過關(guān)系(Relational)將這些表聯(lián)系在一起。表以二維表格形式來表示。表是由行和列組成的數(shù)據(jù)集合,表中一行為一個(gè)記錄(Record),一列為記錄中的一個(gè)字段(Field)。例如,表9-1中所示的學(xué)籍表中,學(xué)號(hào)、姓名、性別、出生年月等都是字段,每個(gè)學(xué)生的字段數(shù)據(jù)構(gòu)成了該學(xué)生的一條記錄??梢詫⒈砜闯墒且环N用戶自定義類型,表中的每一條記錄是一個(gè)這種用戶自定義類型的變量,字段是這種用戶自定義類型的各個(gè)分量。例如,若將表9-1稱為“學(xué)籍表”,該表可以看作是以下用戶自定義類型:

Type學(xué)籍表學(xué)號(hào)AsString姓名AsString性別AsString

出生年月AsDataEndType

其中,“學(xué)號(hào)”、“姓名”、“性別”和“出生年月”是組成用戶自定義類型“學(xué)籍表”的四個(gè)變量,正好與表中的四個(gè)字段對(duì)應(yīng)。表中的所有記錄相當(dāng)于一組被聲明為用戶自定義類型“學(xué)籍表”的變量。2.記錄和字段在表9-1中,每一行數(shù)據(jù)構(gòu)成了學(xué)籍表中的一條記錄,記錄是數(shù)據(jù)庫管理中操作的基本數(shù)據(jù)。每一列數(shù)據(jù)構(gòu)成了學(xué)籍表中的一個(gè)字段,每個(gè)字段都有相應(yīng)的字段名、數(shù)據(jù)類型、數(shù)據(jù)寬度等結(jié)構(gòu)描述信息。3.索引(Index)為了快速查詢數(shù)據(jù),數(shù)據(jù)庫中一般都使用索引。索引是以某個(gè)字段作為關(guān)鍵字進(jìn)行排序,對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行組織。在某些條件下查詢數(shù)據(jù)庫時(shí),使用索引可以顯著提高查詢的速度。4.關(guān)系在數(shù)據(jù)庫中,將表中可用來唯一標(biāo)識(shí)記錄的字段稱為主關(guān)鍵字。主關(guān)鍵字指定的字段中,不能出現(xiàn)相同的值。例如,在表9-1的“學(xué)籍表”中,“學(xué)號(hào)”字段可唯一地標(biāo)識(shí)不同的學(xué)籍記錄,因而可指定為該“學(xué)籍表”的主關(guān)鍵字。主關(guān)鍵字不僅可以是一個(gè)字段,也可以是多個(gè)字段。一般情況下,數(shù)據(jù)庫中表與表之間的關(guān)系是指某個(gè)表的主關(guān)鍵字和另一個(gè)表的主關(guān)鍵字之間的對(duì)應(yīng)關(guān)系。5.查詢(Query)由數(shù)據(jù)庫中按照關(guān)系組合而成的具有實(shí)際使用意義的表,稱為查詢。查詢不是數(shù)據(jù)庫中存儲(chǔ)的表,而是按照各種規(guī)則和要求“查”出來的表。查詢可通過SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)創(chuàng)建。SQL是一種標(biāo)準(zhǔn)的查詢語言,幾乎所有的關(guān)系數(shù)據(jù)庫系統(tǒng)都支持這種語言。各種關(guān)系型數(shù)據(jù)庫中的SQL語言有所不同,但最基本的語句和使用方法是一樣的。存儲(chǔ)在數(shù)據(jù)庫中的查詢,稱為視圖(View)。存儲(chǔ)在客戶/服務(wù)器數(shù)據(jù)庫中的、用SQL語句編寫的程序段,稱為存儲(chǔ)過程(StoredProcedure)。

SQL語言的主要功能由八個(gè)動(dòng)詞來表達(dá),用戶只需要寫出做什么,就可以得到查詢的結(jié)果。(1)數(shù)據(jù)查詢功能。SQL中用動(dòng)詞Select實(shí)現(xiàn)查詢。查詢是SQL語言的核心,SQL的查詢操作可以從一個(gè)或多個(gè)表中找出滿足條件的元組。用Select可以實(shí)現(xiàn)數(shù)據(jù)庫的選擇、投影和連接等操作。例如,用以下Select語句可從數(shù)據(jù)庫中列出滿足查詢條件的指定字段值:

Select<字段列表>From<表列表>WHERE<查詢條件>

該語句可從<表列表>所指定的表中取出<字段列表>指定的字段,并通過<查詢條件>進(jìn)行篩選,只有滿足條件的記錄才可被選出,從而創(chuàng)建了一個(gè)查詢。(2)數(shù)據(jù)定義功能。SQL的數(shù)據(jù)定義功能包括定義數(shù)據(jù)庫、定義基本表、定義視圖、定義索引等。SQL的數(shù)據(jù)定義可用相應(yīng)的動(dòng)詞實(shí)現(xiàn),如Create等。(3)數(shù)據(jù)更新功能。SQL中用動(dòng)詞Insert、Delete、Update實(shí)現(xiàn)數(shù)據(jù)更新。(4)數(shù)據(jù)控制功能。SQL中用動(dòng)詞Grant、Revote實(shí)現(xiàn)數(shù)據(jù)控制。由于不同的數(shù)據(jù)庫管理系統(tǒng)在實(shí)現(xiàn)SQL語言時(shí)各有差別,并且一般都做了某種的擴(kuò)充。因此,用戶在使用時(shí)應(yīng)參閱系統(tǒng)提供的有關(guān)手冊(cè)。6.Recordset(記錄集)對(duì)象應(yīng)用程序開始運(yùn)行后,VisualBasic根據(jù)數(shù)據(jù)控件的設(shè)置打開所選取的數(shù)據(jù)庫,同時(shí)建立Database對(duì)象和Recordset對(duì)象。該對(duì)象在窗體的Form_Load()事件開始執(zhí)行前已自動(dòng)產(chǎn)生。簡(jiǎn)單地說,Recordset對(duì)象的作用是在程序中代表數(shù)據(jù)庫中的表(Table)。因此,在對(duì)數(shù)據(jù)控件連接的表進(jìn)行“新增”、“修改”、“刪除”、“查詢”操作時(shí),實(shí)際上是以Recordset對(duì)象所屬的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)用程序分為兩部分,一部分位于客戶機(jī),負(fù)責(zé)向用戶提供信息以及和用戶進(jìn)行交互;另一部分位于服務(wù)器,負(fù)責(zé)進(jìn)行具體的計(jì)算和數(shù)據(jù)庫的操作。在客戶/服務(wù)器數(shù)據(jù)庫中,對(duì)數(shù)據(jù)的處理和操作都是通過存儲(chǔ)過程(StoredProcedure)來完成的。存儲(chǔ)過程是用SQL語句編寫的程序段,就像VisualBasic中的函數(shù)或子程序。用戶可以通過編寫存儲(chǔ)過程在服務(wù)器端完成諸如修改數(shù)據(jù)、添加數(shù)據(jù)、刪除數(shù)據(jù)和查詢等工作。在使用中,只要通過位于客戶端的應(yīng)用程序調(diào)用這些存儲(chǔ)過程,就可以在服務(wù)端完成相應(yīng)的操作。由于存儲(chǔ)過程經(jīng)過預(yù)編譯和優(yōu)化,因而具有很高的效率。客戶/服務(wù)器數(shù)據(jù)庫的特點(diǎn)決定了其適用于大型、分布式、多用戶的數(shù)據(jù)庫系統(tǒng)。文件數(shù)據(jù)庫也可以放在服務(wù)器上供多個(gè)用戶使用,由于文件數(shù)據(jù)庫只能提供存取數(shù)據(jù)的功能,數(shù)據(jù)庫文件中被申請(qǐng)的所有數(shù)據(jù)都會(huì)被傳送到客戶機(jī),在客戶機(jī)中進(jìn)行查詢操作,而查詢出來的數(shù)據(jù)量一般只占所傳送數(shù)據(jù)的一小部分,從而增加了網(wǎng)絡(luò)流量,降低了應(yīng)用程序的性能。此外,對(duì)文件數(shù)據(jù)庫進(jìn)行添加、刪除、修改等操作都要在客戶端通過查詢來完成。例如,若需要修改數(shù)據(jù)庫中的某個(gè)數(shù)據(jù),只能將表中的所有數(shù)據(jù)都傳送到客戶端,經(jīng)過修改后再將整個(gè)表送回到服務(wù)器端的數(shù)據(jù)庫中。因此,文件數(shù)據(jù)庫適用于小型的、單機(jī)的數(shù)據(jù)庫系統(tǒng)。進(jìn)行數(shù)據(jù)庫開發(fā)時(shí),應(yīng)先根據(jù)各種數(shù)據(jù)庫的特點(diǎn)和具體情況選擇一種合適的數(shù)據(jù)庫類型。9.1.3VisualBasic數(shù)據(jù)庫應(yīng)用程序的組成

1.用戶界面用戶界面包括用于與用戶交互的所有界面和代碼,如對(duì)數(shù)據(jù)庫記錄進(jìn)行添加、修改、刪除、查詢的VisualBasic代碼,完成查詢和數(shù)據(jù)更新的窗體等。用戶界面不對(duì)數(shù)據(jù)庫進(jìn)行實(shí)際的操作,而是請(qǐng)求數(shù)據(jù)庫服務(wù)的數(shù)據(jù)訪問對(duì)象和方法。2.數(shù)據(jù)庫引擎數(shù)據(jù)庫引擎是一組動(dòng)態(tài)連接庫(DLL),主要任務(wù)是解釋應(yīng)用程序的請(qǐng)求并形成對(duì)數(shù)據(jù)倉庫的物理操作,管理對(duì)數(shù)據(jù)庫的物理操作,維護(hù)數(shù)據(jù)庫的完整性和安全性,處理結(jié)構(gòu)化查詢語言SQL的查詢操作,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的檢索、添加、刪改,管理查詢返回的結(jié)果等。應(yīng)用程序運(yùn)行時(shí),這些功能通過將動(dòng)態(tài)連接庫連接到VisualBasic程序中來實(shí)現(xiàn)。3.數(shù)據(jù)倉庫數(shù)據(jù)倉庫是存放數(shù)據(jù)的地方,由若干個(gè)表文件組成。數(shù)據(jù)倉庫只包含數(shù)據(jù),而對(duì)數(shù)據(jù)的計(jì)算、檢索、排序等操作都由數(shù)據(jù)庫引擎來完成??梢姡瑪?shù)據(jù)庫引擎是VisualBasic應(yīng)用程序與數(shù)據(jù)庫之間的橋梁,應(yīng)用程序通過數(shù)據(jù)庫引擎來完成對(duì)數(shù)據(jù)庫文件的存取操作。9.1.4用戶與數(shù)據(jù)庫引擎的接口

VisualBasic6.0中提供了生成并訪問數(shù)據(jù)庫的大量部件,包括數(shù)據(jù)控件(DataControl)、數(shù)據(jù)訪問對(duì)象(DAO,DataAccessObjects)和ActiveX數(shù)據(jù)對(duì)象(ADO,ActiveXDataObjects),可以用這些工具作為與數(shù)據(jù)庫引摯的接口。1.數(shù)據(jù)控件(DataControl)用數(shù)據(jù)控件可以不經(jīng)過編程而訪問數(shù)據(jù)庫。根據(jù)需要設(shè)置好數(shù)據(jù)控件的屬性后,即可通過諸如文本框之類的控件與數(shù)據(jù)控件綁定,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)庫中各個(gè)記錄的訪問。但是,數(shù)據(jù)控件的功能有限,若要完成復(fù)雜的功能,還是需要編程來解決。2.數(shù)據(jù)訪問對(duì)象(DAO)數(shù)據(jù)訪問對(duì)象(DAO)是由MicrosoftJet數(shù)據(jù)庫引擎定義的對(duì)象,是通過程序訪問數(shù)據(jù)庫的對(duì)象結(jié)構(gòu)??梢杂脭?shù)據(jù)訪問對(duì)象(如Database、TableDef、Recordset對(duì)象)表示在代碼中用來組織和操作數(shù)據(jù)的對(duì)象。

DAO模型采用與關(guān)系型數(shù)據(jù)庫邏輯結(jié)構(gòu)相同的類的結(jié)構(gòu),對(duì)應(yīng)于數(shù)據(jù)庫的不同部分,存在相應(yīng)的數(shù)據(jù)訪問對(duì)象(如Database、TableDef、Field和Index對(duì)象),因而具有較高的效率。DAO模型向用戶提供創(chuàng)建數(shù)據(jù)庫、定義表和字段、建立和維護(hù)索引、建立表間的關(guān)系、進(jìn)行結(jié)構(gòu)化查詢等工具在內(nèi)的一系列操作的屬性和方法。DAO不僅簡(jiǎn)化了代碼,而且使數(shù)據(jù)庫的底層結(jié)構(gòu)更加透明,編程人員可以用同樣的對(duì)象、屬性和方法來處理各種不同數(shù)據(jù)庫格式,從而具有更多的靈活性。3.ActiveX數(shù)據(jù)對(duì)象(ADO)

ADO是VisualBasic6.0為數(shù)據(jù)訪問提供的全新技術(shù)。ADO是一種建立在最新數(shù)據(jù)訪問接口OLEDB之上的高性能的、統(tǒng)一的數(shù)據(jù)訪問對(duì)象,通過它可以訪問文件數(shù)據(jù)庫、客戶/服務(wù)器數(shù)據(jù)庫甚至非關(guān)系型數(shù)據(jù)庫。ADO提供了更高的性能、更小的系統(tǒng)開銷、更簡(jiǎn)單的模型以及更靈活的操作。因此,ADO已經(jīng)成為VisualBasic中最主要的數(shù)據(jù)訪問對(duì)象。

注意:為了與VisualBasic早期的版本兼容,使得VisualBasic早期版本創(chuàng)建的數(shù)據(jù)庫工程能夠被VisualBasic6.0打開,原有的數(shù)據(jù)訪問對(duì)象還可以在VisualBasic6.0中繼續(xù)使用。9.1.5VisualBasic6.0可以訪問的數(shù)據(jù)庫類型

VisualBasic6.0通過數(shù)據(jù)庫引擎可以識(shí)別以下三類數(shù)據(jù)庫:1.VisualBasic數(shù)據(jù)庫

VisualBasic數(shù)據(jù)庫文件使用與MicrosoftAccess相同的格式,又稱內(nèi)部數(shù)據(jù)庫或本地?cái)?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標(biāo)準(zhǔn)的客戶/服務(wù)器數(shù)據(jù)庫,如MSSQLServer等。利用VisualBasic提供的ODBCDirect模式,可以把命令直接傳遞給服務(wù)器處理,以創(chuàng)建真正的客戶/服務(wù)器數(shù)據(jù)庫管理程序。9.1.6創(chuàng)建Access2003數(shù)據(jù)庫

[例9-1]創(chuàng)建一個(gè)訂單管理的Access2003數(shù)據(jù)庫。

[分析]

要實(shí)現(xiàn)在VB6中操作數(shù)據(jù)庫,必須先規(guī)劃和建立數(shù)據(jù)庫。雖然VB6.0內(nèi)置了一個(gè)微型的數(shù)據(jù)庫設(shè)計(jì)器,一般在實(shí)際中比較少用,這里以常用的桌面小型數(shù)據(jù)庫Access2003為例,建立一個(gè)簡(jiǎn)單的訂單管理數(shù)據(jù)庫db1.mdb,學(xué)習(xí)在MicrosoftAccess2003中創(chuàng)建數(shù)據(jù)庫的操作方法。該數(shù)據(jù)庫將作為本章后續(xù)范例的數(shù)據(jù)庫。

[規(guī)劃表結(jié)構(gòu)]

建立數(shù)據(jù)庫前,對(duì)需要保存的信息進(jìn)行分析,然后對(duì)表結(jié)構(gòu)進(jìn)行規(guī)劃。根據(jù)一般訂單需要保存的數(shù)據(jù),規(guī)劃表結(jié)構(gòu)如表9-2、表9-3和表9-4所示。其中,表示該字段為主關(guān)鍵。表9-2訂單表字段名訂單編號(hào)產(chǎn)品編號(hào)客戶編號(hào)數(shù)量單價(jià)下單日期送貨日期經(jīng)手人類型(長度)文本(20)文本(20)文本(20)整數(shù)數(shù)值

(2位小數(shù))日期日期文本(20)表9-3產(chǎn)品表字段名產(chǎn)品編號(hào)產(chǎn)品名稱單位規(guī)格類型(長度)文本(20)文本(50)文本(10)文本(20)表9-4客戶信息表字段名客戶編號(hào)姓名性別生日聯(lián)系電話公司地址類型(長度)文本(20)文本(50)是/否日期文本(20)文本(100)[建立表結(jié)構(gòu)]

在Access中創(chuàng)建表結(jié)構(gòu)的基本步驟如下:(1)啟動(dòng)Access2003。(2)在菜單欄上選擇“文件→新建”選項(xiàng),在“新建文件”任務(wù)窗格中選擇“空數(shù)據(jù)庫…”選項(xiàng)(見圖9-1),彈出“文件新建數(shù)據(jù)庫”對(duì)話框,如圖9-2所示。圖9-1“新建文件”任務(wù)窗格(3)選擇保存數(shù)據(jù)庫的位置和文件名,本例保存為C:\db1.mdb,如圖9-2所示。圖9-2“文件新建數(shù)據(jù)庫”對(duì)話框(4)單擊“創(chuàng)建”按鈕,打開表設(shè)計(jì)器,用表設(shè)計(jì)器創(chuàng)建“訂單表”,如圖9-3所示。雙擊打開表設(shè)計(jì)器表設(shè)計(jì)器圖9-3打開表設(shè)計(jì)器(5)設(shè)置“訂單編號(hào)”為主關(guān)鍵字,保存為“訂單表”,如圖9-4所示。建立好的訂單表,雙擊打開進(jìn)行數(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ù)庫的標(biāo)準(zhǔn)語言,被很多類型的數(shù)據(jù)庫所支持。本節(jié)介紹最常用的操作數(shù)據(jù)庫的SQL語句,如數(shù)據(jù)查詢、刪除、添加和更新的實(shí)現(xiàn)等。其中四個(gè)最常用的SQL語句是本章使用ASP.NET數(shù)據(jù)控件的基礎(chǔ),即Select、Insert、delete和Update。更多的細(xì)節(jié)請(qǐng)參閱有關(guān)書籍。9.2.1查詢記錄的Select語句

Select語句的一般格式:Select<字段列表>Form<表名>[Where條件]

功能:Select語句功能非常豐富,可以按任意條件從一個(gè)表或多個(gè)表中查詢滿足條件的數(shù)據(jù),其語法也比較復(fù)雜。[例9-2]查詢“訂單表”中所有的數(shù)據(jù)。命令:Select*From訂單表說明:“*”號(hào)代表表中所有的字段,也可以按例9-3的方式列出每一個(gè)選擇的字段。[例9-3]以“訂單編號(hào)”為查詢條件,在“訂單表”中列出滿足條件的記錄。命令:Select訂單編號(hào),產(chǎn)品編號(hào),客戶編號(hào),數(shù)量,下單日期,送貨日期From訂單表Where訂單編號(hào)="A1000"

說明:Select關(guān)鍵字后面需要列出的字段以逗號(hào)分隔;由于“訂單編號(hào)”字段為字符串類型,具體的值需要用雙引號(hào)作為定界符。如果將該SQL語句保存到字符串變量中,需要將雙引號(hào)改為單引號(hào),如下所示:

DimsqlAsStringsql="Select訂單編號(hào),產(chǎn)品編號(hào),客戶編號(hào),數(shù)量,下單日期,送貨日期From訂單表Where訂單編號(hào)='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ù)字,則值不需要加任何定界符;如果是日期類型,其值必須帶#定界符??梢杂眠壿嬤\(yùn)算符(And、Or和Not)連接多個(gè)條件。以上三個(gè)例子是分別以文本類型、數(shù)值類型和日期類型字段作為條件,使用SQL命令查詢數(shù)據(jù)所用的語法。可以在Access中對(duì)以上SQL語句的正確性進(jìn)行驗(yàn)證,檢查SQL語句是否正確,以及能否按照我們的條件得到所需要的結(jié)果。方法如下:(1)在Access中打開[例9-1]中建立的數(shù)據(jù)庫,選擇“查詢”對(duì)象,如圖9-7所示。2134雙擊添加[訂單表]圖9-7打開數(shù)據(jù)庫,選擇查詢對(duì)象(2)進(jìn)入SQL命令的查詢?cè)O(shè)計(jì)模式,如圖9-8所示。添加的表選擇SQL視圖以便測(cè)試SQL命令圖9-8進(jìn)入SQL命令查詢?cè)O(shè)計(jì)模式(3)輸入SQL命令并執(zhí)行命令,如圖9-9所示。

[例9-5]統(tǒng)計(jì)表的記錄數(shù)。命令:SelectCount(*)as記錄數(shù)From訂單表說明:在SQL語句中,可以使用內(nèi)部函數(shù)對(duì)記錄進(jìn)行統(tǒng)計(jì)。Count函數(shù)作用是得到表中的記錄總數(shù)。

[例9-6]

統(tǒng)計(jì)“訂單表”中訂單編號(hào)="A1000"And客戶編號(hào)="K1"的訂貨總數(shù)量。命令:

SelectSum(數(shù)量)as訂貨量

From訂單表

Where訂單編號(hào)="A1000"and客戶編號(hào)="K1"

說明:本例用到Count()和Sum()函數(shù),以及其他函數(shù),如Max()、Min()等。[例9-7]在“客戶信息表”中查詢姓“張”的客戶信息(姓名以張開頭)。命令:Select*From客戶信息表where姓名Like"李*"

說明:Like關(guān)鍵字用于模糊匹配,“*”代替任意多個(gè)字符;“?”代表任意一個(gè)字符。

Select還有更多、更靈活的使用方式,可以滿足幾乎任何對(duì)表數(shù)據(jù)的查詢要求(讀者可參考其他相關(guān)資料)。1.輸入SQL命令2執(zhí)行SQL命令3執(zhí)行SQL命令結(jié)果4回到設(shè)計(jì)視圖圖9-9輸入并執(zhí)行SQL命令9.2.2添加記錄的Insert語句

Insert語句的一般格式:Insert

Into

表名(字段列表)Values(值列表)

功能:向表中添加一條新記錄。[例9-8]向訂單表添加一條新記錄。命令:

InsertInto訂單表(訂單編號(hào),客戶編號(hào),產(chǎn)品編號(hào),數(shù)量,單價(jià),下訂日期,送貨日期)Values("A2000","K1","C100",12,12.89,#2007-09-07#,#2007-12-30#)

注意:值列表的位置和個(gè)數(shù)類型應(yīng)與字段列表一一對(duì)應(yīng)。文本字段類型和日期字段類型對(duì)應(yīng)的常數(shù)值需要使用定界符。9.2.3刪除記錄的Delete語句

Delete語句的一般格式:Delete*From<表名>[Where條件][例9-9]刪除“訂單表”中訂單編號(hào)為A2000的記錄。命令:Delete*From訂單表Where訂單編號(hào)="A2000"說明:如果沒有Where子句,則刪除整個(gè)[訂單表]數(shù)據(jù)。9.2.4更新記錄的Update語句

Update語句的一般格式:Update<表名>Set<字段名=新字段值,[字段名=新字段值,>[Where條件][例9-10]修改“訂單表”,將訂單編號(hào)為“A1000”的“數(shù)量”改為20。命令:Update訂單表Set數(shù)量=20Where訂單編號(hào)="A1000"

說明:如果沒有Where子句,則所有記錄的“數(shù)量”字段值都將修改為20。9.3使用ADODC控件實(shí)現(xiàn)數(shù)據(jù)庫操作

9.3.1ADODC控件簡(jiǎn)介在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ù)訪問對(duì)象,通過它可以訪問文件數(shù)據(jù)庫、客戶/服務(wù)器數(shù)據(jù)庫甚至非關(guān)系型數(shù)據(jù)庫。ADO提供了更高的性能、更小的系統(tǒng)開銷、更簡(jiǎn)單的模型以及更靈活的操作。因此,ADO已經(jīng)成為VisualBasic中最主要的數(shù)據(jù)訪問對(duì)象。ADODC控件是將部分ADO對(duì)象及方法包裝起來,提供更加簡(jiǎn)捷的方式進(jìn)行數(shù)據(jù)庫的訪問。1.添加ADODC控件要使用ADODC控件連接數(shù)據(jù)庫并選擇數(shù)據(jù),必須添加ADODC控件到設(shè)計(jì)環(huán)境;要將ADODC控件選擇的數(shù)據(jù)顯示出來,可以使用標(biāo)準(zhǔn)控件中的文本框、列表框等數(shù)據(jù)控件,也可以使用外部的表格控件,如DataGrid。圖9-10是在工具箱中添加這兩個(gè)控件,并添加到窗體上的操作步驟。2.使用Adodc控件和DataGrid控件顯示數(shù)據(jù)庫中某個(gè)表數(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ū)動(dòng)程序,不同類型的數(shù)據(jù)庫有對(duì)應(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)建立的存儲(chǔ)過程)。如果CommandType屬性的值等于adCmdUnknown(默認(rèn)值),系統(tǒng)的性能將會(huì)降低。原因是ADO必須調(diào)用提供者,以確定CommandText屬性是SQL語句還是存儲(chǔ)過程或表格名稱。第二步第一步圖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ù)庫對(duì)象,即具體的表。每個(gè)ADODC控件當(dāng)前只能操作一張表數(shù)據(jù),ADODC控件沒有顯示數(shù)據(jù)功能,若要顯示數(shù)據(jù),需要借助數(shù)據(jù)顯示控件,如文本框、列表框、表格控件等,本例選擇DataGrid表格控件。[建立工程]

創(chuàng)建工程,將ADODC控件和DataGrid控件添加到當(dāng)前工具箱,然后添加到窗體,采用默認(rèn)名稱,分別為Adodc1和DataGrid1。設(shè)置Adodc1的Caption屬性為:訂單表,界面布局如圖9-11所示。圖9-11界面布局

圖9-12ADODC屬性[屬性設(shè)置]1.用鼠標(biāo)右擊Adodc1控件,在彈出的快捷菜單中選擇“ADODC屬性”,如圖9-12所示。在屬性頁中選擇“通用”選項(xiàng)卡,選擇“連接資源”為“使用連接字符串”,單擊“生成(U)…”按鈕,如圖9-13所示。圖9-13ADODC控件屬性頁2.在“數(shù)據(jù)鏈接屬性”對(duì)話框(見圖9-14)中選擇Access數(shù)據(jù)庫連接字符串:MicrosoftJet4.0OLEDBProvider,單擊“下一步”按鈕。圖9-14數(shù)據(jù)鏈接屬性3.在“連接”選項(xiàng)卡(見圖9-15)中選擇數(shù)據(jù)庫所在位置;單擊“測(cè)試連接”按鈕,測(cè)試是否連接成功。確定后,將在“屬性頁”的“通用”選項(xiàng)卡中(見圖9-16)看到自動(dòng)生成了連接字符串。選擇數(shù)據(jù)庫實(shí)際所在的位置測(cè)試是否連接成功圖9-15選擇數(shù)據(jù)庫及測(cè)試連接圖9-16生成連接字符串以上過程僅指定了連接不同類型數(shù)據(jù)庫使用的連接字符串,如果要顯示某個(gè)表的數(shù)據(jù),必須指定具體的表。在“屬性頁”對(duì)話框中選擇“記錄源”選項(xiàng)卡,按照?qǐng)D9-17所示進(jìn)行選擇,在當(dāng)前數(shù)據(jù)庫中準(zhǔn)備選擇具體操作的表。最后,將DataGrid1表格控件的DataSource屬性設(shè)置為Adodc1,以便顯示Adodc1中選擇的數(shù)據(jù):[運(yùn)行結(jié)果]完成以上操作后,按F5運(yùn)行程序(不用寫一行代碼),即可以看到圖9-18所示的運(yùn)行結(jié)果。在表格控件中可以直接修改數(shù)據(jù)、刪除數(shù)據(jù)和插入新記錄,數(shù)據(jù)自動(dòng)完成更新操作。1.選擇命令類型為:2-adCmdTable2.選擇表名稱:訂單表圖9-17選擇記錄源圖9-18運(yùn)行結(jié)果[總結(jié)與提高]本例在[屬性設(shè)置]中設(shè)置了ADODC控件的幾個(gè)屬性,其中,圖9-13~9-16所示操作設(shè)置了Adodc的ConnetionString屬性,可以在屬性窗口中看到該屬性值為圖9-17所示操作設(shè)置了CommandType屬性值為RecordSource屬性值為如果按照條件選擇數(shù)據(jù),可以用SQL語句實(shí)現(xiàn)條件選擇。操作方法:在RecordSource屬性中單擊[…]按鈕,彈出圖9-19所示對(duì)話框,按圖選擇和輸入SQL命令,實(shí)現(xiàn)條件選擇。圖9-19修改記錄源9.3.3ADODC控件的高級(jí)應(yīng)用

[相關(guān)知識(shí)]ADODC對(duì)象組織關(guān)系如圖9-20所示。ADODCRecordS[相關(guān)知識(shí)]ADODC對(duì)象組織關(guān)系etFieldsField如圖9-20所示。其中,F(xiàn)ield對(duì)象代表數(shù)據(jù)表格最小的數(shù)據(jù)單位,即表格中的字段(單元格),具有名稱Name(字段名)和值Value(字段值)屬性;數(shù)據(jù)表格中的每一列中所有的字段,組成Fileds字段集合,第1列為Fileds(0),第2列為Fields(1)…

…,如圖9-21所示。表格中的每一行,構(gòu)成一條記錄Record,RecordSet對(duì)象用來讀取每一條記錄的信息。實(shí)際上,RecordSet是指向表記錄的指針,包含當(dāng)前記錄(行)的信息,如果需要取得每一行的數(shù)據(jù),需要依次移動(dòng)記錄指針來獲取。圖9-21RecordSet對(duì)象和Fileds集合對(duì)象示意VisualBasic6.0中,在一個(gè)數(shù)據(jù)庫表中取得任意字段信息(字段名和字段值)的操作步驟:“選擇并連接數(shù)據(jù)庫”→“選擇表”→“移動(dòng)記錄指針”→“讀取字段屬性”例如,打開圖9-21中的“學(xué)生信息表”時(shí),當(dāng)前記錄指針指向第1條記錄,讀取字段值的操作如下:取得第1個(gè)字段的值:Adodc1.recordset.Fields(0).value

取得第2個(gè)字段的值:Adodc1.recordset.Fields(1).value

…取得第N個(gè)字段的值:Adodc1.recordset.Fields(N-1).value由于Value是Fileds默認(rèn)的屬性,且Fileds是RecordSet默認(rèn)的屬性,因此,取得第1個(gè)字段值得方法可以為:Adodc1.recordset.Fields(0)或Adodc1.recordset.(0)。此外,也可以使用字段名的形式讀取字段信息,見表9-5。表9-5存取字段數(shù)據(jù)的其他形式格式格式形式比較1Adodc1.Recordset.Fields(“字段名稱”).value用字段名存取,不必關(guān)心字段位置2Adodc1.Recordset.Fields(“字段名稱”)用字段名存取,省略value[默認(rèn)]3Adodc1.Recordset(“字段名稱”)簡(jiǎn)潔,推薦使用的格式4Adodc1.Recordset![字段名稱]字段名稱必須為常數(shù),不常用例如:

Adodc1.Recordset(“姓名”):取得當(dāng)前記錄的姓名字段值

Xm=“姓名”

Adodc1.Recordset(Xm):取得當(dāng)前記錄的姓名字段值

Adodc1.Recordset![姓名]:取得當(dāng)前記錄的姓名字段值,但不能寫成:Adodc1.Recordset![Xm],使用該格式時(shí),[]內(nèi)必須是常數(shù)。如果要取得第2~N條記錄中的字段信息,ADODC提供移動(dòng)記錄指針的方法,參見表9-6。表9-6Recordset對(duì)象主要方法和屬性方法或?qū)傩悦Q描述Adodc1.Recordset.MoveFirst向前移動(dòng)到第一條記錄Adodc1.Recordset.MoveLast向后移動(dòng)到第最后一條記錄Adodc1.Recordset.MoveNext向后移動(dòng)到下一條記錄Adodc1.Recordset.MovePrevious向前移動(dòng)到上一條記錄Adodc1.Recordset.BOF向前移動(dòng)時(shí),是否移過第一條記錄Adodc1.Recordset.EOF向后移動(dòng)時(shí),是否移過了最后一條記錄Adodc1.Recordset.RecordCount記錄數(shù)Adodc1.Recordset.Fields.Count字段數(shù)ADODC控件中,記錄的移動(dòng)(記錄導(dǎo)航按鈕)實(shí)際上是調(diào)用其RecordSet對(duì)象的移動(dòng)記錄方法來實(shí)現(xiàn),各導(dǎo)航按鈕對(duì)應(yīng)的方法如圖9-22所示。圖9-22記錄移動(dòng)方法其中,Adodc1.Recordset.AddNew為添加新記錄。[例9-12]讀取數(shù)據(jù):在例9-11建立的數(shù)據(jù)庫中,將“訂單表”中的的記錄讀取到列表框中顯示,結(jié)果如圖9-23所示。圖9-23運(yùn)行界面[建立工程]創(chuàng)建工程,在窗體上添加一個(gè)ADODC控件、一個(gè)List控件和一個(gè)按鈕,名稱默認(rèn),分別為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ù)控件時(shí),必須調(diào)用其Refresh方法,連接數(shù)據(jù)庫,并執(zhí)行記錄源讀取。行6:定義變量RecStr,準(zhǔn)備保存讀取的記錄。行9:將記錄指針移到第一條記錄,以便可以重復(fù)讀取記錄。

行10:根據(jù)數(shù)據(jù)表中的記錄數(shù)RecordCount,準(zhǔn)備循環(huán)讀取記錄行11:Adodc1.Recordset.Fields.Count,每一條記錄具有的字段數(shù)。行12:Adodc1.Recordset.Fields(j).Value,第j個(gè)字段的值。vbTab為系統(tǒng)常數(shù),相當(dāng)于四個(gè)長度的空格,便于對(duì)齊數(shù)據(jù)。行16:要讀取下一條記錄,必須將記錄指針移動(dòng)到下一條。注意:本例運(yùn)行前,必須將Adodc1控件連接上數(shù)據(jù)庫,并設(shè)置其記錄源。

[運(yùn)行結(jié)果]

按F5運(yùn)行程序,單擊Command1按鈕,將看到圖9-23所示結(jié)果。[例9-13]刪除指定記錄:刪除[訂單表]中訂單編號(hào)為A1000的記錄

[建立工程]

在例9-12的基礎(chǔ)上,在界面上添加一個(gè)按鈕控件,名稱為Command2,編寫以下代碼,實(shí)現(xiàn)將滿足條件的記錄刪除。

[程序代碼]1 PrivateSubCommand2_Click()2 Adodc1.Recordset.MoveFirst'將指針移到第一條記錄

3 WhileNotAdodc1.Recordset.EOF'依此取得每一條記錄

4 IfAdodc1.Recordset("訂單編號(hào)")="A1000"Then'通過[訂單編號(hào)]字段的值比較是否滿足條件

5 Adodc1.Recordset.Delete6 EndIf7 Adodc1.Recordset.MoveNext'取得下一條記錄,特別注意!。不移動(dòng)記錄將進(jìn)入死循環(huán)

8 Wend9 EndSub[代碼說明]行2:將記錄指針移動(dòng)到第一條記錄,準(zhǔn)備從第一條記錄到最后一條記錄中查找滿足條件的記錄。行3:EOF屬性表示,在移動(dòng)記錄過程中,是否已經(jīng)超過了最后一條記錄,如果值為True是,則已經(jīng)處于最后一條記錄了,不能再往前移動(dòng)了,而BOF屬性表示向后移動(dòng)記錄時(shí),是否已經(jīng)超過了第一條記錄,如果值為True,則不能再往后移動(dòng)了,否則將出錯(cuò)。行4:判斷字段值是否滿足要?jiǎng)h除的條件。這是Adodc1.Recordset.Fields("訂單編號(hào)").Value的簡(jiǎn)潔寫法。行5:執(zhí)行記錄刪除。行7:繼續(xù)移動(dòng)記錄,直到全部記錄查找完畢。[例9-13]修改記錄:將“訂單表”中訂單編號(hào)為A1001的記錄,數(shù)量修改為20,客戶編號(hào)修改為K3,送貨日期修改為今天日期。[建立工程]在例9-12的基礎(chǔ)上,在界面上添加一個(gè)按鈕控件,名稱為Command3,編寫以下的代碼,可以修改滿足條件的記錄。[程序代碼]PrivateSubCommand3_Click()Adodc1.Recordset.MoveFirst'將指針移到第一條記錄

WhileNotAdodc1.Recordset.EOF'依次取得每一條記錄

IfAdodc1.Recordset("訂單編號(hào)")="A1001"Then'比較是否滿足條件

Adodc1.Recordset("數(shù)量")=10'數(shù)字類型數(shù)據(jù)

Adodc1.Recordset("客戶編號(hào)")="K3"'字符串類型數(shù)據(jù)

Adodc1.Recordset("送貨日期")=Now'日期類型格式'如果是常數(shù),則使用如:#9/9/2009#Adodc1.Recordset.Update'修改后,執(zhí)行更新動(dòng)作

EndIfAdodc1.Recordset.MoveNextWendEndSub[代碼說明]本例通過Adodc控件的Recordset對(duì)象的方法實(shí)現(xiàn)記錄的修改,基本思路:找到需要修改的記錄,將字段內(nèi)容設(shè)置為新的值,然后執(zhí)行更新操作。其他說明見代碼中的注釋。[例9-14]添加新記錄:添加新記錄到訂單表。[建立工程]在例9-12的基礎(chǔ)上,在界面上添加一個(gè)按鈕控件,名稱為Command4,編寫以下的代碼,在當(dāng)前表中插入新記錄。[程序代碼]PrivateSubCommand4_Click()Adodc1.Recordset.AddNewAdodc1.Recordset("訂單編號(hào)")="A2008"Adodc1.Recordset("客戶編號(hào)")="KK"Adodc1.Recordset("產(chǎn)品編號(hào)")="C2000"Adodc1.Recordset("數(shù)量")=2Adodc1.Recordset.UpdateEndSub[代碼說明]在表中添加新記錄,必須通過.Recordset對(duì)象的方法AddNew先插入一空行,然后依次填充每個(gè)字段值,最后保存記錄。[總結(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("訂單編號(hào)").Value="A1000"Then'通過[訂單編號(hào)]字段的值比較是否滿足條件

Adodc1.Recordset.DeleteEndIfAdodc1.Recordset.MoveNext'取得下一條記錄,特別注意!。不移動(dòng)記錄將進(jìn)入死循環(huán)

WendEndSub'修改記錄按鈕代碼PrivateSubCommand3_Click()Adodc1.Recordset.MoveFirst'將指針移到第一條記錄

WhileNotAdodc1.Recordset.EOF'依此取得每一條記錄

IfAdodc1.Recordset("訂單編號(hào)")="A1001"Then'通過姓名字段的值比較是否滿足條件

Adodc1.Recordset("數(shù)量")=10'數(shù)字類型數(shù)據(jù)

Adodc1.Recordset("客戶編號(hào)")="K3"'字符串類型數(shù)據(jù)

Adodc1.Recordset("送貨日期")=Now'日期格式常數(shù)#9/9/2009#Adodc1.Recordset.Update'修改后,執(zhí)行更新動(dòng)作

EndIfAdodc1.Recordset.MoveNextWendEndSub'添加記錄按鈕代碼PrivateSubCommand4_Click()Adodc1.Recordset.AddNewAdodc1.Recordset("訂單編號(hào)")="A2008"Adodc1.Recordset("客戶編號(hào)")="KK"Adodc1.Recordset("產(chǎn)品編號(hào)")="C2000"Adodc1.Recordset("數(shù)量")=2Adodc1.Recordset.UpdateEndSub[例9-15]記錄查詢:在“訂單表”中查找以"A"開頭的所有訂單。[程序代碼]Adodc1.Recordset.MoveFirstAdodc1.Recordset.Find"訂單編號(hào)like'A%'",0,adSearchForwardIfAdodc1.Recordset.EOF=FalseThenMsgBoxAdodc1.Recordset("訂單編號(hào)")EndIfWhileNotAdodc1.Recordset.EOFAdodc1.Recordset.Find"訂單編號(hào)like'A%'",1,adSearchForwardIfAdodc1.Recordset.EOF=FalseThenMsgBoxAdodc1.Recordset("訂單編號(hào)")EndIfWend[總結(jié)與提高]Recordset對(duì)象的Find方法可以實(shí)現(xiàn)記錄的查詢,它將在Recordset中查找滿足指定條件的記錄,如果條件符合,則記錄集位置設(shè)置在找到的記錄上,否則位置將設(shè)置在記錄集的末尾。語法格式:Find(criteria,SkipRows,searchDirection,start)作用:查找符合某一條件的記錄,然后將查找到的第一條記錄設(shè)置為當(dāng)前記錄。參數(shù)說明:(1)criteria:字符串,包含用于搜索的指定列名、比較操作符和值的語句。criteria中的“比較操作符”可以是“>”(大于)、“<”(小于)、“=”(等于)或“l(fā)ike”(模糊查詢),例如:數(shù)量>=10。criteria中的值可以是字符串、數(shù)字或者日期。字符串值以單引號(hào)分隔(如“state='WA'”)。日期值以“#”(數(shù)字記號(hào))分隔,如:’下單日期>#7/22/97#’。若“比較操作符”為“l(fā)ike”,則字符串“值”可以包含“*”(某字符可出現(xiàn)一次或多次)或者“_”(某字符只出現(xiàn)一次)。例如: 姓名like’張%’

姓張(其中“%”號(hào)等價(jià)于“*”號(hào))姓名like’張_’

姓張,但長度為2的姓名like’%張%’

包含張的姓名like’%華’

以華結(jié)尾的(2)下面三個(gè)參數(shù)可選:SkipRows:跳過幾條記錄才開始查找,默認(rèn)值為0,它指定當(dāng)前行或start書簽的位移以開始搜索。searchDirection:查找方向,向前或向后,默認(rèn)向后查找。Start:用作搜索的開始位置??蛇x,如果省略,表示從當(dāng)前記錄開始查找。Find方法只適合于單條件的簡(jiǎn)單查詢。對(duì)于使用AND和OR邏輯運(yùn)算符的多條件組合查詢表達(dá)式,可以使用RecordSet對(duì)象的Fiter屬性,以篩選滿足指定條件的記錄。例如,選擇所有訂單編號(hào)以A開頭、數(shù)量大于10的記錄,可以寫為:

Adodc1.Recordset.Filter="訂單編號(hào)like'A%'and數(shù)量>10"9.4使用ADO對(duì)象實(shí)現(xiàn)數(shù)據(jù)庫操作

ActiveXDataObjects(ADO)是VB6.0最新提供的數(shù)據(jù)訪問接口編程模型。數(shù)據(jù)訪問接口是一個(gè)對(duì)象模型,代表訪問數(shù)據(jù)的各個(gè)方面。在VisualBasic中,可用的數(shù)據(jù)訪問接口有三種:ActiveX數(shù)據(jù)對(duì)象(ADO)、遠(yuǎn)程數(shù)據(jù)對(duì)象(RDO)和數(shù)據(jù)訪問對(duì)象(DAO)。這三種接口分別代表了該技術(shù)的不同發(fā)展階段。最新的是ADO,是比RDO和DAO更加簡(jiǎn)單,更加靈活的對(duì)象模型。對(duì)于新建的VB工程,應(yīng)該使用ADO作為數(shù)據(jù)訪問接口。對(duì)于現(xiàn)存的工程,VisualBasic繼續(xù)支持DAO和RDO。ADO對(duì)象模型如圖9-25所示。其中,Command對(duì)象和RecordSet對(duì)象依賴于Connection對(duì)象而存在。每個(gè)對(duì)象都具有屬性集合。圖9-25ADO對(duì)象模型ADO的目標(biāo)是訪問、編輯和更新數(shù)據(jù)源,而編程模型體現(xiàn)了為完成該目標(biāo)所必需的系列動(dòng)作的順序。ADO提供類和對(duì)象,以完成以下活動(dòng):連接到數(shù)據(jù)源(Connection)。可選擇開始一個(gè)事務(wù)。可選擇創(chuàng)建對(duì)象來表示SQL命令(Command)??蛇x擇在SQL命令中指定列、表和值作為變量參數(shù)(Parameter)。執(zhí)行命令(Command、Connection或Recordset)。如果命令按行返回,則將行存儲(chǔ)在緩存中(Recordset)。可選擇創(chuàng)建緩存視圖,以便能對(duì)數(shù)據(jù)進(jìn)行排序、篩選和定位(Recordset)。通過添加、刪除或更改行和列編輯數(shù)據(jù)(Recordset)。在適當(dāng)情況下,使用緩存中的更改內(nèi)容來更新數(shù)據(jù)源(Recordset)。在使用事務(wù)之后,可以接受或拒絕在事務(wù)期間所作的更改。結(jié)束事務(wù)(Connection)。使用ADO對(duì)象訪問數(shù)據(jù)庫的過程,與使用ADODC控件訪問數(shù)據(jù)庫一致,一般步驟如下:1.創(chuàng)建連接對(duì)象Connection,打開與數(shù)據(jù)庫連接。2.僅執(zhí)行SQL命令,或通過執(zhí)行SQL獲取記錄集對(duì)象RecordSet。3.通過RecordSet對(duì)象執(zhí)行各種數(shù)據(jù)操作,如:顯示數(shù)據(jù)、編輯數(shù)據(jù)、查詢數(shù)據(jù)等。4.關(guān)閉數(shù)據(jù)庫連接。要在VB6工程中使用ADO對(duì)象模型,需要在IDE環(huán)境的菜單欄上選擇“工程→引用”選項(xiàng),然后添加對(duì)“MicrosoftActiveXDataObjects2.0Library”項(xiàng)的引用。9.4.1讀取記錄

[例9-15]使用ADO對(duì)象,讀取訂單管理數(shù)據(jù)庫db1.mdb中“訂單表”的數(shù)據(jù),顯示在列表框List1中。[分析]本例主要介紹使用ADO對(duì)象來建立與數(shù)據(jù)庫的連接,并且讀取數(shù)據(jù)庫中指定表記錄的一般步驟。要使用ADO對(duì)象連接數(shù)據(jù)庫,首先必須創(chuàng)建連接對(duì)象,并設(shè)置其連接字符串,最后打開連接。讀取表中記錄時(shí),必須首先創(chuàng)建記錄集對(duì)象,通過已經(jīng)建立的連接對(duì)象,執(zhí)行SQL命令,最后讀出記錄集中的記錄信息。數(shù)據(jù)讀取完畢,必須關(guān)閉數(shù)據(jù)庫的連接,以釋放系統(tǒng)占用的資源。[建立工程]在窗體上添加一個(gè)按鈕Commadn1和一個(gè)列表框控件List,調(diào)整布局如圖9-26所示。Command1List1Command1List1圖9-26界面布局[程序代碼]1 PrivateSubCommand1_Click()2 '第1步:建立連接對(duì)象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[代碼說明]注意:本例中必須添加對(duì)“MicrosoftActiveXDataObjects2.0Library”項(xiàng)的外部引用。行3:創(chuàng)建連接對(duì)象,也可以省略ADODB,直接寫成:DimconnAsNewConnection。行4:創(chuàng)建記錄集對(duì)象。行7:設(shè)置連接對(duì)象的連接字符串屬性,該連接字符串含義已經(jīng)在10.4.1節(jié)進(jìn)行了說明,App.Path取得當(dāng)前工程所在的位置,一般數(shù)據(jù)庫文件都放置在應(yīng)用程序所在的位置。測(cè)試本例時(shí),必須將db1.mdb數(shù)據(jù)庫放在工程目錄下。行8:創(chuàng)建連接對(duì)象,并設(shè)置其ConnectionString屬性后,調(diào)用Open方法,打開與數(shù)據(jù)庫的連接。行11:使用已經(jīng)建立的連接對(duì)象,執(zhí)行SQL命令,從而打開數(shù)據(jù)庫中的表。記錄集對(duì)象中Open方法參數(shù)含義如下:參數(shù)1:表名,或SQL命令文本;參數(shù)2:已經(jīng)與數(shù)據(jù)庫建立連接的對(duì)象Connection

參數(shù)3:在ADO對(duì)象模型中定義的游標(biāo)“每條記錄的索引”類型。有四種不同的游標(biāo)類型(“讀取數(shù)據(jù)方式”),如圖9-27所示,含義見表9-7。圖9-27四種游標(biāo)類型表9-7四種不同的游標(biāo)類型常量含義動(dòng)態(tài)游標(biāo)[多用戶使用]

2—adOpenDynamic用于查看其他用戶所作的添加、更改和刪除,并用于不依賴書簽的Recordset中各種類型的移動(dòng)。如果提供者支持,可使用書簽。鍵集游標(biāo)[多用戶使用]

1—adOpenKeySet其行為類似動(dòng)態(tài)游標(biāo),不同的只是禁止查看其他用戶添加的記錄,并禁止訪問其他用戶刪除的記錄,其他用戶所作的數(shù)據(jù)更改將依然可見。它始終支持書簽,因此允許Recordset中各種類型的移動(dòng)。靜態(tài)游標(biāo)[往復(fù)式讀取]

3-adOpenStatic提供記錄集合的靜態(tài)副本以查找數(shù)據(jù)或生成報(bào)告。它始終支持書簽,因此允許Recordset中各種類型的移動(dòng)。其他用戶所作的添加、更改或刪除將不可見。這是打開客戶端(ADOR)Recordset對(duì)象時(shí)唯一允許使用的游標(biāo)類型。僅向前游標(biāo)[只向下讀取]

0-adOpenForwardOnly除僅允許在記錄中向前滾動(dòng)之外,其行為類似動(dòng)態(tài)游標(biāo)。這樣,當(dāng)需要在Recordset中單程移動(dòng)時(shí)就可提高性能參數(shù)4:在ADO對(duì)象模型中確定提供者打開Recordset

時(shí)應(yīng)該使用的鎖定(并發(fā))類型(“編輯數(shù)據(jù)方式”),如圖9-28所示,含義見表9-8。圖9-28四種鎖定(并發(fā))類型表9-8四種不同的鎖定(并發(fā))類型常量說明1--AdLockReadOnly(默認(rèn)值)只讀—

不能改變數(shù)據(jù)。2--AdLockPessimistic保守式鎖定(逐個(gè))—

提供者完成確保成功編輯記錄所需的工作,通常通過在編輯時(shí)立即鎖定數(shù)據(jù)源的記錄。修改記錄時(shí),鎖定,其他用戶不可操作該記錄,;如果被其他用戶鎖定,程序?qū)⒊鲥e(cuò)。3--AdLockOptimistic開放式鎖定(逐個(gè))—

提供者使用開放式鎖定,只在調(diào)用Update方法時(shí)才鎖定記錄。假定其他人不會(huì)同時(shí)編輯該條當(dāng)前操作的記錄4--AdLockBatchOptimistic開放式批更新—用于批更新模式(與立即更新模式相對(duì))。同上,假設(shè)同一時(shí)間,當(dāng)前操作的一批記錄其他人不會(huì)同時(shí)操作如果僅僅只讀取數(shù)據(jù),則參數(shù)3和參數(shù)4一般設(shè)置為:3-adOpenStatic和1-AdLockReadOnly,如果是在單機(jī)環(huán)境下使用,為了可以讀寫數(shù)據(jù),一般兩者都選擇方式3,以提供更多的功能支持。在網(wǎng)絡(luò)環(huán)境下,需要根據(jù)具體要求而定。行14:EOF,判斷記錄是否移過末行。rs中的屬性和方法,與在Adodc控件介紹中的RecordSet對(duì)象屬性和方法完全一致。其實(shí),如果是使用了ADODC打開數(shù)據(jù)庫(表),ADODC最終還是調(diào)用ADO提供的方法來打開數(shù)據(jù)庫(表)。ADODC是利用ADO對(duì)象建立起來的一種控件方式。如果要使數(shù)據(jù)庫處理程序能更專業(yè)、更靈活的處理數(shù)據(jù),應(yīng)當(dāng)象本例那樣使用ADO對(duì)象。行15~19:讀取記錄中每一個(gè)字段值,連接成字符串,添加到List1控件中。該過程與[例9-11]一致。行22:注意,別忘記移動(dòng)記錄到下一條!行26:關(guān)閉打開的表,釋放占用的系統(tǒng)資源。行27:關(guān)閉數(shù)據(jù)庫。[運(yùn)行結(jié)果]如圖9-29所示圖9-29運(yùn)行結(jié)果9.4.2數(shù)據(jù)查詢

[例9-16]按訂單編號(hào)或下單日期查詢訂單信息,實(shí)現(xiàn)圖9-30所示的執(zhí)行結(jié)果。[分析]本例按條件選擇數(shù)據(jù),并將數(shù)據(jù)顯示在DataGrid控件中。主要介紹使用ADO對(duì)象如何執(zhí)行SQL查詢命令語句Select,并動(dòng)態(tài)得到查詢的的結(jié)果(記錄集)。圖9-30運(yùn)行界面[建立工程]在窗體上添加一個(gè)外部表格控件DataGrid1,添加一個(gè)框架控件Frame1,設(shè)置其標(biāo)題為“查詢條件”;在Frame1中依次添加兩個(gè)單選按鈕Option1和Option2,一個(gè)文本框Text1和一個(gè)組合框Combo1。設(shè)置Combo1的Style屬性為:2-DropDownList,并在其List屬性中預(yù)先輸入四項(xiàng)內(nèi)容:精確匹配;以之開頭;以之結(jié)尾;包含。添加兩個(gè)日期選擇外部控件,名稱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天,即一個(gè)月之前的日期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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論