Visual Basic程序設(shè)計教程(第3版)第vb15_第1頁
Visual Basic程序設(shè)計教程(第3版)第vb15_第2頁
Visual Basic程序設(shè)計教程(第3版)第vb15_第3頁
Visual Basic程序設(shè)計教程(第3版)第vb15_第4頁
Visual Basic程序設(shè)計教程(第3版)第vb15_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第15章數(shù)據(jù)庫訪問技術(shù)VB提供的數(shù)據(jù)庫訪問方法主要有:使用數(shù)據(jù)(Data)控件ADO數(shù)據(jù)控件訪問數(shù)據(jù)庫通過ODBC方式訪問遠程數(shù)據(jù)庫采用對象變量訪問數(shù)據(jù)庫15.1數(shù)據(jù)庫的概念1.幾個概念(1)數(shù)據(jù)庫所謂數(shù)據(jù)庫(Database),是指一組排列得易于處理或讀取的相關(guān)信息,它是由一個或多個表對象組成的集合。它類似于Excel的工作簿和工作表。(2)數(shù)據(jù)庫管理系統(tǒng)數(shù)據(jù)庫管理系統(tǒng)是指在操作系統(tǒng)支持下為數(shù)據(jù)庫建立、使用和維護而配置的龐大軟件,如MicrosoftSQLServer和MicrosoftAccess等。(3)數(shù)據(jù)庫應(yīng)用程序數(shù)據(jù)庫應(yīng)用程序是指用VB,FoxPro等開發(fā)工具設(shè)計的、實現(xiàn)某種特定功能的應(yīng)用程序。(4)數(shù)據(jù)庫系統(tǒng)數(shù)據(jù)庫系統(tǒng)是由計算機硬件,操作系統(tǒng),數(shù)據(jù)庫管理系統(tǒng),以及在其他對象支持下建立起來的數(shù)據(jù)庫、數(shù)據(jù)庫應(yīng)用程序,用戶和維護人員等組成的一個整體。2.關(guān)系型數(shù)據(jù)庫關(guān)系型數(shù)據(jù)庫由表、記錄、字段組成。表的數(shù)據(jù)組織形式類似于一張二維關(guān)系表,每行稱為一條記錄,每列稱為一個字段。一個數(shù)據(jù)庫由若干張表組成,表與表之間通過關(guān)系來連接。15.2Access數(shù)據(jù)庫Access數(shù)據(jù)庫管理系統(tǒng)是MicrosoftOffice的一個組件,是最常用的本地數(shù)據(jù)庫之一。在VB中可以方便地使用數(shù)據(jù)控件和ADO控件來操作Access數(shù)據(jù)庫。15.2.1創(chuàng)建Access數(shù)據(jù)庫和表1.創(chuàng)建Access數(shù)據(jù)庫執(zhí)行“開始”→“程序”→“MicrosoftAccess”菜單命令,啟動Access。在圖15-1所示的對話框中選擇“空Access數(shù)據(jù)庫”項,單擊“確定”按鈕。在圖15-2所示的對話框中輸入數(shù)據(jù)庫文件名,并選擇保存的位置后,單擊“創(chuàng)建”按鈕。至此,一個空Access數(shù)據(jù)庫創(chuàng)建完畢,并以指定的文件名(stu.mdb)保存在指定的文件夾中。2.創(chuàng)建Access數(shù)據(jù)表新建或打開數(shù)據(jù)庫后,在圖15-3所示的數(shù)據(jù)庫對話框中,用戶可以選擇使用設(shè)計器、使用向?qū)Щ蛲ㄟ^輸入數(shù)據(jù)的方法創(chuàng)建表。雙擊“使用設(shè)計器創(chuàng)建表”項打開圖15-4所示的創(chuàng)建表結(jié)構(gòu)對話框,在此可以依次輸入各字段的名稱和數(shù)據(jù)類型。在“字段屬性”區(qū)中輸入字段的大小、格式等屬性值。雙擊表名稱可以打開如圖15-5所示的表數(shù)據(jù)輸入窗口,依次將各種數(shù)據(jù)輸入到數(shù)據(jù)表中。15.2.2創(chuàng)建查詢?nèi)鐖D15-6所示的學(xué)生成績表中就省略了“姓名”、“性別”、“年齡”等字段。創(chuàng)建查詢的步驟如下。(1)單擊數(shù)據(jù)庫窗口中的“查詢”按鈕,雙擊“在設(shè)計視圖中創(chuàng)建查詢”項,如圖15-7所示。(2)打開查詢設(shè)計器,如圖15-8所示。在“顯示表”對話框中,選擇需要的表后單擊“添加”按鈕將其添加到查詢中。(3)由于在前面將“學(xué)號”字段定義成了主鍵,此時將自動建立一個“一對一”的關(guān)系(用一條連線表示)。將各表中需要的字段依次拖到查詢字段列表區(qū)中,構(gòu)成查詢的字段框架,如圖15-9所示。(4)如果需要向查詢中添加一些計算字段,如“總分”、“平均分”等,可以使用字段生成器。在需要的位置上(如本例的“高等數(shù)學(xué)”之后)單擊鼠標(biāo)右鍵,從快捷菜單中選擇“生成器”命令,打開圖15-10所示的表達式生成器。如果希望在“平均分”字段中設(shè)置保留小數(shù)點的位數(shù),可以在“平均分”字段中單擊鼠標(biāo)右鍵,從彈出的快捷菜單中選擇“屬性”命令,在“格式”欄中輸入“0.0”表示保留1位小數(shù),如圖15-11所示。設(shè)計完成關(guān)閉設(shè)計器窗口時,系統(tǒng)會提示輸入新建查詢的名稱,并將其顯示到數(shù)據(jù)庫窗口中。雙擊查詢名稱可以看到查詢中包含的數(shù)據(jù),如圖15-12所示。15.3使用數(shù)據(jù)控件【例15-1】數(shù)據(jù)控件和數(shù)據(jù)綁定控件的使用方法示例。如圖15-13所示。15.3.1數(shù)據(jù)控件的屬性1.Connect(連接)屬性該屬性用于定義所要連接的數(shù)據(jù)庫類型,如“Access;”表示連接Access97格式的數(shù)據(jù)庫,“Access2000;”表示連接Access2000格式的數(shù)據(jù)庫。2.DatabaseName(數(shù)據(jù)庫名)屬性該屬性決定數(shù)據(jù)控件連接到哪個數(shù)據(jù)庫上。對于多表數(shù)據(jù)庫(如Access等),該屬性為具體的數(shù)據(jù)庫文件名,如:Data1.DatabaseName="d:\students.mdb"。對于單表數(shù)據(jù)庫(如FoxPro等),該屬性為數(shù)據(jù)庫存放的目錄,數(shù)據(jù)庫文件名應(yīng)存放在數(shù)據(jù)控件的RecordSource屬性中。例如,需要訪問FoxPro數(shù)據(jù)庫文件“d:\fox\abcd.dbf”時應(yīng)按如下方法設(shè)置屬性:Data1.DatabaseName="d:\fox"Data1.RecordSource="abcd.dbf"如果在設(shè)計或運行時,改變了數(shù)據(jù)控件的DatabaseName屬性,應(yīng)使用Refresh(刷新)方法重新打開新數(shù)據(jù)庫。3.RecordSource(記錄源)屬性該屬性主要用來設(shè)置數(shù)據(jù)控件打開的數(shù)據(jù)庫表名或查詢名,它可以是一個表名、一個數(shù)據(jù)庫中已存在的查詢或一條SQL語句。如果在運行時通過代碼改變了該屬性值(連接到其他數(shù)據(jù)源),則必須使用Refresh方法使改變生效,并需要重建記錄集(Recordset)。4.BOFAction和EOFAction屬性這兩個屬性用來指定當(dāng)控件的BOF或EOF屬性為True(到達第一條記錄之前或到達最后一條記錄之后),而用戶又單擊了控件上的“”或“”按鈕時,數(shù)據(jù)控件應(yīng)該執(zhí)行什么操作。取值情況分別見表15-1和表15-2。5.ReadOnly屬性該屬性用來指定數(shù)據(jù)是否可以被編輯。如果ReadOnly屬性設(shè)為True,表示數(shù)據(jù)是只讀的。6.Exclusive屬性該屬性指定是否允許其他用戶訪問數(shù)據(jù)庫。當(dāng)其值為True時表示單用戶使用,否則表示共享存取,即允許多用戶訪問數(shù)據(jù)庫。15.3.2數(shù)據(jù)控件的事件數(shù)據(jù)控件與其他VB控件一樣支持許多事件,但除此之外數(shù)據(jù)控件還支持Error,Reposition,Validate等與數(shù)據(jù)庫訪問有關(guān)的事件。1.Error事件該事件主要用來處理不能被任何應(yīng)用程序捕獲的錯誤。其語法格式為:PrivateSubData1_Error(DataErrAsInteger,ResponseAsInteger)……(錯誤處理過程)EndSub其中,DataErr返回一個錯誤號。Response的默認值為1時,表示顯示錯誤信息;該值為0時,表示程序繼續(xù)執(zhí)行。2.Reposition事件當(dāng)用戶單擊數(shù)據(jù)控件上某個箭頭按鈕,或者在代碼中使用了某個Move或Find方法使某條新記錄成為當(dāng)前記錄時,將激發(fā)Reposition事件。3.Validate事件在一條不同的記錄成為當(dāng)前記錄之前,在Update方法之前(用UpdateRecord

方法保存數(shù)據(jù)時除外)及Delete,Unload或Close操作之前會發(fā)生該事件。其語法格式如下:PrivateSubobject_Validate(ActionAsInteger,SaveAsInteger)

事件處理代碼EndSub其中,Action是一個整數(shù),用來指示引發(fā)這種事件的操作。Save是一個邏輯表達式,用來表示被連接的數(shù)據(jù)是否改變。15.3.3數(shù)據(jù)控件的方法數(shù)據(jù)控件和其他控件一樣也有自己的一些方法,常用的有:Refresh,UpdateRecord,UpdateControls和Close方法。1.Refresh方法該方法主要用來建立或重新顯示與數(shù)據(jù)控件相連接的數(shù)據(jù)庫記錄集。若在程序運行時修改了數(shù)據(jù)控件的DatabaseName,ReadOnly,Exclusive或Connect屬性,就必須使用該方法來刷新記錄集。該方法執(zhí)行后,會將記錄指針指向記錄集中的第一條記錄。2.UpdateRecord方法通過該方法可以將數(shù)據(jù)綁定控件上的當(dāng)前內(nèi)容寫入到數(shù)據(jù)庫中,即可以在修改數(shù)據(jù)后調(diào)用該方法來確認修改。用這種方法在Validate事件期間將被連接的當(dāng)前內(nèi)容保存到數(shù)據(jù)庫中,而不再激發(fā)Validate事件。3.UpdateControls方法通過該方法可以將數(shù)據(jù)從數(shù)據(jù)庫中重新讀入到數(shù)據(jù)綁定控件中,即可以使用該方法放棄對數(shù)據(jù)綁定控件中數(shù)據(jù)的修改。4.Close方法該方法主要用于關(guān)閉數(shù)據(jù)庫或記錄集,并且將該對象設(shè)置為空。注意:在關(guān)閉數(shù)據(jù)庫或記錄集之前,必須使用Update方法更新數(shù)據(jù)庫或記錄集中的數(shù)據(jù),以保證數(shù)據(jù)的正確性。15.3.4記錄集對象在VB中,數(shù)據(jù)庫表是不能直接被訪問的,VB6.0通過MicrosoftJet3.51數(shù)據(jù)庫引擎提供的記錄集(Recordset)對象來檢索和顯示數(shù)據(jù)庫記錄。一個記錄集對象表示一個或多個數(shù)據(jù)庫表中的對象集合的多個對象,或運行一次查詢所得到的記錄結(jié)果。一個記錄集對象相當(dāng)于一個變量,與數(shù)據(jù)庫表相似,記錄集也是由行和列組成的,但不同的是記錄集可以同時包含多個表中的數(shù)據(jù)。VB的Jet數(shù)據(jù)庫引擎提供了大量的記錄集屬性和方法。通過引用數(shù)據(jù)控件的Database和Recordset屬性,可以直接與數(shù)據(jù)控件一起使用這些屬性和方法。1.記錄集對象的屬性記錄集對象的常用屬性有:BOF和EOF屬性、AbsolutePosition屬性、Bookmark屬性及RecordCount屬性。(1)BOF和EOF屬性這兩個屬性分別用來指示記錄指針是否指向了第一條記錄之前或最后一條記錄之后。如果這兩個屬性同時為True,則表示該記錄集中無任何記錄。(2)AbsolutePosition屬性該屬性用于返回當(dāng)前記錄的序號,但不能將其作為記錄編號的代替物,因為當(dāng)執(zhí)行了刪除、添加、查詢等操作后,記錄的位置可能會改變。(3)Bookmark屬性該屬性返回或設(shè)置當(dāng)前記錄集指針的書簽,Bookmark屬性采用的是String類型。在程序中可以使用該屬性重定位記錄集的指針。下列語句使指針移到其他位置后迅速返回原位:mybookmark=Data1.Recordset.BookMark '設(shè)置書簽保存當(dāng)前記錄指針位置Data1.Recordset.MoveFirst '將記錄指針移動到第一條記錄Data1.Recordset.BookMark=mybookmark '使記錄指針返回原位置(4)RecordCount屬性該屬性是只讀屬性,用來獲取記錄集中的記錄數(shù)。在多用戶環(huán)境中,該屬性返回的值可能是一個不準(zhǔn)確的數(shù),這與記錄集對象被刷新的頻率有關(guān)。為了獲得準(zhǔn)確的數(shù)據(jù),在使用該屬性前應(yīng)先調(diào)用MoveLast方法。2.記錄集對象的方法記錄集對象的常用方法有:AddNew,Edit,Delete,Move和Find方法。(1)AddNew和Edit方法使用AddNew方法可為數(shù)據(jù)庫表添加一條記錄。調(diào)用該方法將清除數(shù)據(jù)綁定控件中的所有內(nèi)容,并且將一條空記錄添加到記錄集的末尾。Edit方法使當(dāng)前記錄集進入可以被修改狀態(tài)。新添加或修改后的記錄,只有在執(zhí)行了Update方法或通過數(shù)據(jù)控件移動了當(dāng)前記錄后,才會添加到數(shù)據(jù)庫文件中。(2)Delete方法該方法用來刪除記錄集中的當(dāng)前記錄。記錄刪除后,其內(nèi)容仍顯示在數(shù)據(jù)綁定控件中,應(yīng)使用Move方法移動記錄指針。刪除記錄時應(yīng)先檢查與該記錄相關(guān)的關(guān)系后再刪除,若數(shù)據(jù)庫中存在某種必要的引用,則無法刪除被引用記錄。(3)Move方法該方法用于記錄指針的移動,常用于瀏覽數(shù)據(jù)庫中的數(shù)據(jù),包括以下4種方法。

MoveFirst:使記錄集中的第一條記錄成為當(dāng)前記錄。

MoveLast:使記錄集中的最后一條記錄成為當(dāng)前記錄。

MoveNext:下移一條記錄,使下一條記錄成為當(dāng)前記錄。

MovePrevious:上移一條記錄,使上一條記錄成為當(dāng)前記錄。當(dāng)一個記錄集剛被打開時,第一條記錄為當(dāng)前記錄。(4)Find方法該方法用于在Dynaset和快照類型的記錄集中查找符合指定條件的記錄。若找到符合條件的記錄,則將記錄指針指向該記錄,并將記錄集對象的NoMatch屬性設(shè)為True;否則,將指針指向記錄集的末尾,并將記錄集對象的NoMatch屬性設(shè)為False。它包括以下4種方法。

FindFirst:查找符合條件的第一條記錄。

FindLast:查找符合條件的最后一條記錄。

FindNext:查找符合條件的下一條記錄。

FindPrevious:查找符合條件的上一條記錄。例如,語句:Data1.Recordset.FindFirst"姓名like'李'"用于查找姓名中包含“李”的第一條記錄?!纠?5-2】設(shè)計一個學(xué)生成績管理程序,程序啟動后顯示數(shù)據(jù)庫中記錄總數(shù)、當(dāng)前記錄號及當(dāng)前記錄的各項數(shù)據(jù),如圖15-14所示。用戶可以在“學(xué)號”或“姓名”下拉列表框中,選擇或輸入內(nèi)容后按回車鍵,查詢指定學(xué)生的成績,無此記錄時顯示提示信息,如圖15-15所示。單擊“添加”或“修改”按鈕后,顯示“輸入口令”對話框,如圖15-16所示。(1)創(chuàng)建數(shù)據(jù)庫。通過Access建立一個名為“成績管理.mdb”的數(shù)據(jù)庫,保存在D盤根目錄下,在庫中建立一個名為“成績”的表,并向其中添加一些數(shù)據(jù)記錄,表結(jié)構(gòu)見表15-3。(2)設(shè)計程序界面。本程序分為3個窗體,如圖15-17、圖15-18和圖15-19所示。(3)設(shè)置對象的屬性。(4)編寫程序代碼?!俺煽児芾怼贝绑w模塊的代碼如下:PublicpanduanAsInteger'定義全局變量判斷用戶單擊的是“添加”還是“修改”按鈕'在“輸入口令”模塊中還要用到該變量DimreccountAsInteger '用來存放總記錄條數(shù)'單擊學(xué)號組合框時執(zhí)行的程序代碼PrivateSubCombo1_Click()Data1.Recordset.MoveFirst'將記錄指針指向第一條記錄

Data1.Recordset.FindFirst"學(xué)號='"&Combo1.Text&"'"'上句指定了查詢條件為“學(xué)號組合框中顯示的內(nèi)容”,查找符合條件的第一條記錄

'注意書寫格式,在引號中套用引號應(yīng)使用單引號

Combo2.Text=Data1.Recordset("姓名")CallxianshiEndSub'在“學(xué)號”組合框中按回車鍵時執(zhí)行的程序代碼PrivateSubCombo1_KeyUp(KeyCodeAsInteger,ShiftAsInteger)IfKeyCode=13Then

Data1.Recordset.MoveFirstData1.Recordset.FindFirst"學(xué)號='"&Combo1.Text&"'"Combo2.Text=Data1.Recordset("姓名")IfData1.Recordset.NoMatchThen '未找到匹配的記錄,則顯示提示信息

MsgBox"查無此人!",48,"注意"ElseCallxianshi '調(diào)用xianshi過程

EndIfEndIfEndSubPrivateSubCombo2_Click()Data1.Recordset.MoveFirstData1.Recordset.FindFirst"姓名='"&Combo2.Text&"'"Combo1.Text=Data1.Recordset("學(xué)號")CallxianshiEndSub'在“姓名”組合框中按回車鍵時執(zhí)行的代碼PrivateSubCombo2_KeyUp(KeyCodeAsInteger,ShiftAsInteger)IfKeyCode=13ThenData1.Recordset.MoveFirstData1.Recordset.FindFirst"姓名='"&Combo2.Text&"'"Combo1.Text=Data1.Recordset("學(xué)號")IfData1.Recordset.NoMatchThen

MsgBox"查無此人!",48,"注意"ElseCallxianshi '調(diào)用xianshi過程

EndIfEndIfEndSubPrivateSubCommand1_Click() '單擊“添加”按鈕時執(zhí)行的代碼

panduan=1Form2.Show1 '顯示輸入口令對話框EndSubPrivateSubCommand2_Click() '單擊“修改”按鈕時執(zhí)行的代碼

panduan=2Form2.Show1EndSubSubgengxin() '重新計算“總分”和“平均分”字段的值的自定義過程

Data1.Recordset.MoveFirstDoWhileData1.Recordset.EOF=FalseData1.Recordset.Edit '進入編輯狀態(tài)

Data1.Recordset("總分")=Data1.Recordset("數(shù)學(xué)")+_Data1.Recordset("英語")+Data1.Recordset("計算機")Data1.Recordset.Update '將緩沖區(qū)中的數(shù)據(jù)寫入數(shù)據(jù)庫

Data1.Recordset.EditData1.Recordset("平均分")=Format(Data1.Recordset("總分")/3,"0.0")Data1.Recordset.Update

Data1.Recordset.MoveNextLoopEndSubSubxianshi() '刷新文本框中顯示信息的自定義過程

Text1=Data1.Recordset("數(shù)學(xué)")Text2=Data1.Recordset("英語")Text3=Data1.Recordset("計算機")Text4=Data1.Recordset("總分")Text5=Format(Data1.Recordset("平均分"),"0.0")'保留1位小數(shù)

Label8.Caption="記錄號:"&Data1.Recordset.AbsolutePosition+1&"/"&reccountEndSubPrivateSubCommand3_Click() '單擊“刪除”按鈕時執(zhí)行的代碼

a=MsgBox("當(dāng)前記錄將被刪除,確定嗎?",4+48,"警告")Ifa=vbNoThenExitSubData1.Recordset.DeleteData1.RefreshCombo1.ClearCombo2.ClearCallchushihuaEndSubPrivateSubCommand4_Click()'單擊“更新”按鈕時執(zhí)行的代碼

a=MsgBox("當(dāng)前記錄將被修改,確定嗎?",4+48,"警告")Ifa=vbNoThenExitSubData1.Recordset.EditWithData1.Recordset("學(xué)號")=Combo1.Text.Recordset("姓名")=Combo2.Text.Recordset("數(shù)學(xué)")=Text1.Recordset("英語")=Text2.Recordset("計算機")=Text3.Recordset("總分")=Val(Text1)+Val(Text2)+Val(Text3).Recordset("平均分")=Format(.Recordset("總分")/3,"0.0")'使用Format函數(shù),保留1位小數(shù)

EndWith

Combo1.ClearCombo2.ClearData1.RefreshCallchushihua

CallxianshiEndSubPrivateSubCommand5_Click() '單擊“退出”按鈕時執(zhí)行的代碼

'如果在“修改”狀態(tài)下單擊“退出”按鈕,則返回初始界面;否則結(jié)束程序

IfCommand1.Visible=FalseThenCommand1.Visible=TrueCommand2.Visible=TrueCommand3.Visible=FalseCommand4.Visible=FalseElseEndEndIfEndSubPrivateSubForm_Initialize() '窗體初始化時執(zhí)行的代碼

Data1.RefreshCallgengxin

CallchushihuaEndSubSubchushihua() '數(shù)據(jù)初始化自定義過程

Data1.Recordset.MoveFirstDoWhileData1.Recordset.EOF=FalseCombo1.AddItemData1.Recordset("學(xué)號") '將學(xué)號字段的內(nèi)容添加至組合框列表

Combo2.AddItemData1.Recordset("姓名") '將姓名字段的內(nèi)容添加至組合框列表

Data1.Recordset.MoveNextLoop

reccount=Data1.Recordset.RecordCountData1.Recordset.MoveFirstCombo1.Text=Data1.Recordset("學(xué)號")Combo2.Text=Data1.Recordset("姓名")CallxianshiEndSub“輸入口令”窗體模塊的代碼:DimcishuAsInteger'用來存放輸入口令的次數(shù)PrivateSubCommand1_Click()'單擊“確定”按鈕時執(zhí)行的代碼

IfText1=""Then'指定密碼為一個空字符串

UnloadMeIfForm1.panduan=1Then '用戶單擊了主窗體上的“添加”按鈕

UnloadForm1Form3.Show1ElseForm1.Text1.Locked=FalseForm1.Text2.Locked=FalseForm1.Text3.Locked=FalseForm1.Command1.Visible=FalseForm1.Command2.Visible=FalseForm1.Command3.Visible=TrueForm1.Command4.Visible=True

EndIfElseIfcishu<2Then '連續(xù)3次密碼輸入錯誤將退出本模塊

MsgBox"無效口令,請重新輸入!",48,"錯誤"Text1=""Text1.SetFocuscishu=cishu+1Else

MsgBox"你無權(quán)使用本功能!",48,"警告"UnloadMeEndIfEndIfEndSubPrivateSubCommand2_Click()'單擊“取消”按鈕時執(zhí)行的代碼

UnloadMeEndSub“添加記錄”窗體模塊的代碼:PrivateSubCommand1_Click()'單擊“更新”按鈕時執(zhí)行的代碼

IfText1=""OrText2=""OrText3=""OrText4=""OrText5=""Then

MsgBox"請輸入完整的數(shù)據(jù)!",48'若有空白項則顯示提示信息,退出過程

Text1.SetFocusExitSubEndIfWithData1.Recordset.AddNew

.Recordset("學(xué)號")=Text1.Recordset("姓名")=Text2.Recordset("班級")=Text3.Recordset("數(shù)學(xué)")=Text4.Recordset("英語")=Text5.Recordset("計算機")=Text6.Recordset("總分")=Val(Text4)+Val(Text5)+Val(Text6).Recordset("平均分")=Format(.Recordset("總分")/3,"0.0").Recordset.UpdateEndWith

Text1="":Text2="":Text3="":Text4=""Text5="":Text6="":Text1.SetFocus '清除6個文本框中的內(nèi)容,使Text1得到焦點EndSubPrivateSubCommand2_Click()'單擊“取消”按鈕時執(zhí)行的代碼

UnloadMeForm1.ShowCallForm1.chushihuaEndSub15.4使用ADO控件15.4.1ADO數(shù)據(jù)控件的屬性、方法和事件1.ADO數(shù)據(jù)控件與數(shù)據(jù)庫相關(guān)的屬性(1)ConnectionString屬性該屬性的參數(shù)說明見表15-4。(2)UserName屬性當(dāng)數(shù)據(jù)庫受密碼保護時,需要指定該屬性。與Provider屬性類似,這個屬性可以在ConnectionString屬性中指定。如果同時提供了一個ConnectionString屬性及一個UserName屬性,則ConnectionString屬性中的值將覆蓋UserName屬性的值。(3)Password屬性Password屬性在訪問一個受保護的數(shù)據(jù)庫時是必需的。與Provider屬性和UserName屬性類似,如果在ConnectionString屬性中指定了密碼,則將覆蓋在這個屬性中指定的值。(4)RecordSource屬性該屬性通常包含一個數(shù)據(jù)庫表名、一個查詢或一個存儲過程調(diào)用,用于決定從數(shù)據(jù)庫中檢索什么信息。(5)Mode屬性該屬性決定想用記錄集進行什么操作。例如,只是想要創(chuàng)建一個瀏覽界面,可以將該屬性設(shè)為只讀來獲得性能的改善。(6)CommandType屬性該屬性用于指定RecordSource屬性的取值類型是一個表的名稱、一個查詢、一個存儲過程,還是一個未知的類型,見表15-5。(7)BOFAction和EOFAction屬性這兩個屬性用來指定當(dāng)記錄指針指向文件開始和末尾時的行為。提供的選擇包括:停留在開始或末尾、移動到第一條或最后一條記錄、在末尾添加一條新記錄。ADO控件的屬性一般可以通過控件的屬性頁進行設(shè)置?!纠?5-3】使用ADO控件設(shè)計一個簡單的數(shù)據(jù)庫瀏覽程序。程序啟動后界面如圖15-20所示,用戶可以通過單擊窗體下方ADO控件的移動箭頭改變文本框中顯示的記錄信息。(1)設(shè)計程序界面。(2)設(shè)計對象屬性。鼠標(biāo)指向窗體中的ADO控件,單擊右鍵,在彈出的快捷菜單中選擇“ADODC屬性”命令,將打開如圖15-21所示的ADO控件“屬性頁”對話框。在“通用”選項卡中選擇“使用連接字符串”項后,單擊“生成”按鈕,打開如圖15-22所示的“數(shù)據(jù)鏈接屬性”對話框,在其中可以設(shè)置ADO控件的ConnectionString屬性。在“數(shù)據(jù)鏈接屬性”對話框的“高級”選項卡中可以設(shè)置訪問權(quán)限。在“數(shù)據(jù)鏈接屬性”對話框的“所有”選項卡中可以查看、編輯生成的連接字符串的所有內(nèi)容,如圖15-23所示。最后單擊“確定”按鈕完成ConnectionString屬性的設(shè)置。在ADO控件“屬性頁”對話框的“記錄源”選項卡中,設(shè)置CommandType為2(表類型),設(shè)置控件的RecordSource屬性為“成績”表,如圖15-24所示。在ADO控件“屬性頁”對話框的“身份驗證”選項卡中可以設(shè)置控件的UserName屬性和Password屬性,如圖15-25所示。(3)編寫程序代碼。PrivateSubText1_Change()a=Adodc1.Recordset.AbsolutePosition'當(dāng)前記錄號

b=Adodc1.Recordset.RecordCount'數(shù)據(jù)源中記錄的總數(shù)

Adodc1.Caption="當(dāng)前記錄號:"&a&"/"&bEndSub2.ADO記錄集對象的方法(1)UpdateControls方法、UpdateRecord方法、AddNew方法、Delete方法和Move方法這一組方法與前面介紹過的數(shù)據(jù)控件對應(yīng)方法基本一致,此處不再贅述。(2)CancelUpdate方法取消添加、修改記錄的操作,恢復(fù)到更改以前的狀態(tài)。(3)UpdateBatch方法保存添加的記錄或修改以后的內(nèi)容。3.ADO數(shù)據(jù)控件的事件處理方法(1)WillMove和MoveComplete方法WillMove方法在掛起操作更改記錄集中的當(dāng)前位置前調(diào)用,MoveComplete方法則在記錄集的當(dāng)前位置更改完成時調(diào)用。(2)WillChangeField和FieldChangeComplete方法WillChangeField方法在掛起操作對記錄集中的一個或多個Field對象值進行更改前調(diào)用,F(xiàn)ieldChangeComplete方法在一個或多個Field對象值已經(jīng)更改后調(diào)用。(3)WillChangeRecordset和RecordsetChangeComplete方法WillChangeRecordset方法在掛起的操作更改記錄集前調(diào)用,RecordsetChangeComplete方法在記錄集更改后調(diào)用。15.4.2高級數(shù)據(jù)綁定控件1.DataGrid控件DataGrid(數(shù)據(jù)網(wǎng)格)控件是一種類似于電子表格的數(shù)據(jù)綁定ActiveX控件(MicrosoftDataGridControl6.0),需要配合ADO控件一起使用。DataGrid控件的大多數(shù)屬性都可以通過其屬性頁進行設(shè)置,方法是:鼠標(biāo)指向添加到窗體上的DataGrid控件,單擊右鍵,在彈出的快捷菜單中選擇“屬性”命令,如圖15-26所示,此時將打開如圖15-27所示的DataGrid控件的“屬性頁”對話框?!纠?5-4】利用DataGrid控件設(shè)計一個具有數(shù)據(jù)庫瀏覽、修改、添加、刪除記錄等功能的程序。使用前面已經(jīng)建立的“成績管理.mdb”數(shù)據(jù)庫,要求:不顯示“班級”字段,“總分”及“平均分”字段的內(nèi)容不允許編輯,且數(shù)據(jù)能夠自動計算。調(diào)整網(wǎng)格各列的寬度,使之能夠在屏幕寬度內(nèi)顯示所有列的內(nèi)容。(1)設(shè)計程序界面。(2)設(shè)置對象屬性。在圖15-26所示的快捷菜單中執(zhí)行“檢索字段”命令,出現(xiàn)“檢索字段”對話框。而后在圖15-26所示的快捷菜單中執(zhí)行“編輯”命令。然后鼠標(biāo)指向“班級”列單擊鼠標(biāo)右鍵,在彈出的快捷菜單中執(zhí)行“刪除”命令,如圖15-28所示,使網(wǎng)格中不顯示該字段。在DataGrid控件的“屬性頁”對話框的“通用”選項卡中,選中“允許添加”和“允許刪除”復(fù)選框。在“鍵盤”選項卡中選擇“Tab鍵動作”為1,選中“允許箭頭”復(fù)選框,如圖15-29所示。在“布局”選項卡中分別選擇“總分”和“平均分”列,并選中“鎖定”復(fù)選框,如圖15-30所示。在“格式”選項卡中,選擇平均分列,并設(shè)置數(shù)據(jù)格式,如圖15-31所示。(3)編寫程序代碼如下。PrivateSubForm_Resize() '窗體大小變化時執(zhí)行的代碼

DataGrid1.Align=1 '使數(shù)據(jù)網(wǎng)格頂端對齊到窗體

DataGrid1.Height=Form1.ScaleHeight'使數(shù)據(jù)網(wǎng)格的寬度自適應(yīng)于窗體

Form1.Caption="DataGrid控件應(yīng)用示例"EndSub'網(wǎng)格中數(shù)據(jù)被編輯后執(zhí)行的程序代碼PrivateSubDataGrid1_AfterColEdit(ByValColIndexAsInteger)'若被編輯的是2,3,4列(計算機、英語或數(shù)學(xué)),則重新計算5,6列(總分、平均分)的值

IfColIndex=2OrColIndex=3OrColIndex=4ThenDataGrid1.Columns(5)=Val(DataGrid1.Columns(2))+Val(DataGrid1.Columns(3))+_Val(DataGrid1.Columns(4))DataGrid1.Columns(6)=DataGrid1.Columns(5)/3EndIfEndSubPrivateSubDataGrid1_BeforeDelete(CancelAsInteger)'執(zhí)行刪除記錄操作前執(zhí)行的代碼

'記錄被刪除前顯示警告信息,用戶選擇“否”,則取消刪除操作

a=MsgBox("記錄將被刪除,確定嗎?",48+4,"警告")Ifa=vbNoThenCancel=TrueEndSub若光標(biāo)已指向了最后一條記錄,用戶又按了下移光標(biāo)鍵或者直接單擊圖15-32所示的最后空行中的某一單元格,則在結(jié)尾處自動添加一條記錄,并進入編輯狀態(tài)。輸入具體數(shù)據(jù)后按回車鍵或?qū)⒐鈽?biāo)移至他處,數(shù)據(jù)將被寫入數(shù)據(jù)庫中。如圖15-33所示,在某條記錄的最左端單擊可以選中整條記錄(注意此時鼠標(biāo)的外觀),按Delete鍵可以刪除選中的記錄。2.DataList控件和DataCombo控件DataList和DataCombo控件是類似于ListBox和ComboBox控件的ActiveX數(shù)據(jù)綁定控件(MicrosoftDataListControl6.0),這兩個控件常用于如下兩個方面。(1)在關(guān)系型數(shù)據(jù)庫中,可用這兩個控件將數(shù)據(jù)從一個表輸入到另一個表中。(2)通過下拉列表中選擇或輸入條件,可縮小搜索范圍。DataList和DataCombo控件的主要屬性,參見表15-6?!纠?5-5】利用DataCombo控件設(shè)計一個能夠按班級進行成績查詢的程序。用戶從DataCombo控件中選擇某一班級名稱,或直接輸入班級名稱并按回車鍵后,在下面的DataGrid控件中顯示相應(yīng)的內(nèi)容,如圖15-34所示。(1)建立數(shù)據(jù)庫。利用Access或VisData建立一個名為“學(xué)生成績.mdb”的數(shù)據(jù)庫。在數(shù)據(jù)庫中建立兩張數(shù)據(jù)表“成績”和“班級”,其結(jié)構(gòu)分別見表15-7和表15-8。(2)設(shè)計程序界面。在窗體上添加兩個ADO控件,一個DataCombo控件,一個DataGrid控件和一個標(biāo)簽,如圖15-35所示。(3)設(shè)置對象屬性。(4)編寫程序代碼。PrivateSubDataCombo1_Click(AreaAsInteger)'在DataCombo中發(fā)生單擊事件時執(zhí)行的代碼

IfArea=2Then'用戶單擊選項區(qū),而非箭頭或文本輸入?yún)^(qū)

Callchaxun

DataGrid1.SetFocus'數(shù)據(jù)網(wǎng)格得到焦點使用戶可以用方向鍵查詢記錄

EndIfEndSub'用戶在DataCombo中按回車鍵時執(zhí)行的代碼PrivateSubDataCombo1_KeyPress(KeyAsciiAsInteger)IfKeyAscii=13ThenCallchaxun

EndIfEndSubSubchaxun()

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論