Access-VBA數(shù)據(jù)庫編程(ADO)-詳細(xì)匯課件_第1頁
Access-VBA數(shù)據(jù)庫編程(ADO)-詳細(xì)匯課件_第2頁
Access-VBA數(shù)據(jù)庫編程(ADO)-詳細(xì)匯課件_第3頁
Access-VBA數(shù)據(jù)庫編程(ADO)-詳細(xì)匯課件_第4頁
Access-VBA數(shù)據(jù)庫編程(ADO)-詳細(xì)匯課件_第5頁
已閱讀5頁,還剩109頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章VBA數(shù)據(jù)庫編程第7章VBA數(shù)據(jù)庫編程1本章內(nèi)容

記錄集概述

在Access中引用ADO對象

引用記錄字段

瀏覽記錄

編輯數(shù)據(jù)

用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

在VBA程序中使用SQL命令

訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫

綜合實(shí)例—編制“研究生成績管理與統(tǒng)計(jì)”程序本章內(nèi)容記錄集概述27.1記錄集概述

7.1.1ADO的9個對象7.1.2了解記錄集

7.1記錄集概述7.1.1ADO的9個對象37.1.1ADO的9個對象

ADO:ActiveXDataObjectsAccess內(nèi)嵌的VBA是用ADO技術(shù)開發(fā)數(shù)據(jù)庫應(yīng)用的主要工具ADO對象模型有9個對象:Connection、Recordset、Record、Command、Parameter、Field、Property、Stream、Error常用對象:Connection、Command、Recordset7.1.1ADO的9個對象ADO:ActiveXDa47.1.1ADO的9個對象

Connection對象:ADO對象模型中最高級的對象,實(shí)現(xiàn)應(yīng)用程序與數(shù)據(jù)源的連接。Command對象:主要作用是在VBA中通過SQL語句訪問、查詢數(shù)據(jù)庫中的數(shù)據(jù)。Recordset對象:存儲訪問表和查詢對象返回的記錄。使用該對象,可以瀏覽記錄、修改記錄、添加新的記錄或者刪除特定的記錄。Recordset對象的功能最常用、最重要7.1.1ADO的9個對象Connection對象:A57.1.1ADO的9個對象

ADO的3個對象之間互有聯(lián)系:Command對象和Recordset對象依賴于Connection對象的連接;Command對象結(jié)合SQL命令可以取代Recordset對象,但遠(yuǎn)沒有Recordset對象靈活、實(shí)用;Recordset對象它只能實(shí)現(xiàn)數(shù)據(jù)表內(nèi)記錄集操作,無法完成表和數(shù)據(jù)庫的數(shù)據(jù)定義操作;數(shù)據(jù)定義操作一般需通過Command對象用SQL命令完成。本章用DoCmd對象代替Command對象。7.1.1ADO的9個對象ADO的3個對象之間互有聯(lián)系67.1.2了解記錄集

記錄集(Recordset):對表執(zhí)行查詢操作時(shí),返回的一組特定記錄。用記錄集可執(zhí)行的操作:對表中的數(shù)據(jù)進(jìn)行查詢和統(tǒng)計(jì),在表中添加、更新或刪除記錄。記錄集是一個對象,它包括記錄和字段,具有其特定的屬性和方法,利用這些屬性和方法就可以編程處理數(shù)據(jù)庫中的記錄。7.1.2了解記錄集記錄集(Recordset):對表77.2在Access中引用ADO對象

應(yīng)用程序中的ADO引用:聲明Connection對象→創(chuàng)建Recordset對象→編程完成各種數(shù)據(jù)訪問操作7.2.1聲明Connection對象7.2.2聲明與打開Recordset對象7.2.3關(guān)閉Recordset和Connection對象7.2在Access中引用ADO對象應(yīng)用程序中的AD87.2.1聲明Connection對象

(1)聲明一個Connection對象(2)初始化Connection對象(決定Connection對

象與哪個數(shù)據(jù)庫相連接)例如:

Dim

cnGraduate

AsADODB.Connection

Set

cnGraduate=CurrentProject.Connection

與當(dāng)前數(shù)據(jù)庫連接

7.2.1聲明Connection對象(1)聲明一個97.2.2聲明與打開Recordset對象

(1)聲明Recordset對象(2)創(chuàng)建Recordset對象實(shí)例(3)打開Recordset對象例如:

Dim

rsStudents

AsADODB.Recordset

Set

rsStudents=NewADODB.Recordset

rsStudents.Open"研究生",cnGraduate,,,adCmdTable

前面聲明的Connection對象

表名稱

打開的是表對象

參數(shù)占位符

7.2.2聲明與打開Recordset對象(1)聲明107.2.3關(guān)閉Recordset和Connection對象

方法:執(zhí)行Recordset對象和Connection對象的Close方法→將對象設(shè)置為Nothing例如:rsStudents.ClosecnGraduate.CloseSet

rsStudents=NothingSet

cnGraduate=Nothing上述語句不是必須的。應(yīng)用程序終止運(yùn)行時(shí),系統(tǒng)會自動關(guān)閉并清除這兩個對象。7.2.3關(guān)閉Recordset和Connection對117.3引用記錄字段

任何對記錄集的訪問都是針對當(dāng)前記錄進(jìn)行的。打開記錄集時(shí)默認(rèn)的當(dāng)前記錄為第1條記錄。引用記錄的字段:直接在記錄集對象中引用字段名稱,如Code=rsStudents!學(xué)號若記錄集字段名包含空格,或者字段名是一個保留字,則引用時(shí)必須將該字段名用方括號括起來。

使用記錄集對象的Fields(n)屬性。n是記錄中字段從左到右的排列序號,第一個字段的序號為0。如Code=rsStudents.Fields(0)記錄集對象與字段名間的連接符

7.3引用記錄字段任何對記錄集的訪問都是針對當(dāng)前記錄進(jìn)127.3引用記錄字段

[例7-1]建立名為ADO的模塊,編寫如下過程。運(yùn)行該過程后,輸出對話框顯示“導(dǎo)師”表中第一位教師的編號和姓名。7.3引用記錄字段[例7-1]建立名為ADO的模塊,137.3引用記錄字段

記錄集更多的應(yīng)用是在窗體對象上:建立一個空白窗體→設(shè)計(jì)各個控件→編程引用記錄集當(dāng)前記錄的相關(guān)字段或?qū)⒆侄蔚闹低ㄟ^控件顯示注意:如果涉及數(shù)據(jù)訪問的事件過程不止一個,可在代碼窗口的通用段定義Connection對象和Recordset對象,然后在Form_Load事件過程中完成數(shù)據(jù)庫連接和數(shù)據(jù)表的打開。7.3引用記錄字段記錄集更多的應(yīng)用是在窗體對象上:建立147.3引用記錄字段

[例7-2]運(yùn)行:分別單擊“導(dǎo)師編號”和“導(dǎo)師姓名”按鈕

窗體設(shè)計(jì)視圖(刪除導(dǎo)航按鈕)

7.3引用記錄字段[例7-2]運(yùn)行:分別單擊“導(dǎo)師編157.3引用記錄字段

例7-2窗體程序代碼

7.3引用記錄字段例7-2窗體程序代碼167.4瀏覽記錄

Recordset記錄集對象提供了4種記錄指針的移動方法MoveFirst記錄指針移到第一條記錄MoveNext記錄指針移到當(dāng)前記錄的下一條記錄MovePrevious記錄指針移到當(dāng)前記錄的上一條記錄MoveLast記錄指針移到最后一條記錄Recordset記錄集的BOF和EOF屬性用于判斷記錄指針是否處于有記錄的正常位置記錄指針將指向最后一條記錄之后,EOF屬性為True記錄指針將指向第一條記錄之前,BOF屬性為TrueBOF和EOF屬性的值均為True,表示記錄集為空

7.4瀏覽記錄Recordset記錄集對象提供了4種記177.4瀏覽記錄

[例7-3]對例7-2進(jìn)行修改

增加如下事件過程代碼:

PrivateSubCommand3_Click()‘單擊“下一個記錄”按鈕rsTeacher.MoveNext

EndSub7.4瀏覽記錄[例7-3]對例7-2進(jìn)行修改增加如187.4瀏覽記錄

上面的過程隱含錯誤:移至最后一條記錄后無法再下移指針,將出現(xiàn)運(yùn)行錯誤信息框。兩種糾正錯誤的方法:如果記錄集的EOF屬性為True,就回到第一條記錄如果記錄集的EOF屬性為True,就回到最后一條記錄

PrivateSubCommand3_Click()‘單擊“下一個記錄”按鈕rsTeacher.MoveNextEndSub7.4瀏覽記錄PrivateSubCommand3197.4瀏覽記錄

PrivateSubCommand3_Click()

rsTeacher.MoveNextIfrsTeacher.EOFThenrsTeacher.MoveFirstEndIfEndSub方法1:若記錄集的EOF屬性為True,則回到首記錄方法2:若記錄集的EOF屬性為True,則回到末記錄PrivateSubCommand3_Click()

rsTeacher.MoveNextIfrsTeacher.EOFThenrsTeacher.MoveLastEndIfEndSub7.4瀏覽記錄PrivateSubCommand3207.4瀏覽記錄

方法2的程序還將運(yùn)行出錯。因?yàn)镽ecordset對象有一個名為LockType的屬性,默認(rèn)值為adLockReadOnly,此時(shí)只能瀏覽記錄數(shù)據(jù),記錄的移動方式也只能是MoveNext和MoveFirst。要實(shí)現(xiàn)記錄指針的4種移動操作,完成記錄的添加、刪改或更新,必須在使用Open方法打開數(shù)據(jù)表之前,將該記錄集對象的LockType屬性設(shè)置成adLockPessimistic或adLockOptimistic,如rsTeacher.LockType=adLockPessimisticrsTeacher.Open"導(dǎo)師",cnGraduate,,,adCmdTable7.4瀏覽記錄方法2的程序還將運(yùn)行出錯。因?yàn)镽ecor217.4瀏覽記錄

Recordset對象的LocyType屬性決定數(shù)據(jù)的鎖定方式:adLockReadOnly:數(shù)據(jù)處于只讀狀態(tài)。adLockPessimistic(保守式鎖定):編輯數(shù)據(jù)時(shí)即鎖定數(shù)據(jù)源記錄,直到數(shù)據(jù)編輯完成才釋放。adLockOptimistic(開放式鎖定):編輯數(shù)據(jù)時(shí)不鎖定,用Update方法提交數(shù)據(jù)時(shí)才鎖定數(shù)據(jù)源記錄。adLockBatchOptimistic(開放式更新):應(yīng)用于批更新模式7.4瀏覽記錄Recordset對象的LocyType227.4瀏覽記錄

如果數(shù)據(jù)表中沒有記錄,即BOF和EOF同時(shí)為True,就不能引用表中的數(shù)據(jù)。將單擊“導(dǎo)師姓名”按鈕的事件過程改寫如下PrivateSubCommand2_Click()IfrsTeacher.BOF=TrueAndrsTeacher.EOF=TrueThenText1.Value=""ElseText1.Value=rsTeacher!姓名EndIfEndSub同理,修改單擊“導(dǎo)師編號”按鈕的事件過程同理,修改“下一個記錄”按鈕的事件過程代碼(空表情況下記錄指針不移動)7.4瀏覽記錄如果數(shù)據(jù)表中沒有記錄,即BOF和EOF同237.5編輯數(shù)據(jù)

7.5.1用ADO記錄集的AddNew方法添加記錄7.5.2用ADO記錄集的Update方法修改記錄

7.5.3用ADO記錄集的Delete方法刪除記錄

7.5編輯數(shù)據(jù)7.5.1用ADO記錄集的AddNe247.5.1用ADO記錄集的AddNew方法添加記錄添加新記錄的步驟:(1)用記錄集的AddNew方法產(chǎn)生一個空記錄(2)為空記錄的各個字段賦值(3)用記錄集的Update方法保存新記錄[例7-4]在例7-3的基礎(chǔ)上進(jìn)行修改

7.5.1用ADO記錄集的AddNew方法添加記錄添加新257.5.1用ADO記錄集的AddNew方法添加記錄添加的程序代碼:PrivateSubCommand4_Click()DimAgeAs

BytersTeacher.MoveFirstAge=rsTeacher!年齡'讀取第一條記錄的年齡字段值

rsTeacher.AddNew

'添加一條新記錄rsTeacher!導(dǎo)師編號="107"rsTeacher!姓名="高原"rsTeacher!年齡=Age

rsTeacher.UpdateEndSub思考:什么情況下單擊“新記錄”按鈕,系統(tǒng)會提示出錯?7.5.1用ADO記錄集的AddNew方法添加記錄添加的267.5.2用ADO記錄集的Update方法修改記錄修改記錄的步驟:(1)將記錄指針移動到需要修改的記錄上(2)對記錄中的相關(guān)字段的值進(jìn)行修改(3)用Update方法保存更改修改后的結(jié)果不得違反數(shù)據(jù)完整性約束

[例7-5]在模塊ADO中添加過程Update_Age:將“導(dǎo)師”表中第5條記錄的年齡字段值修改為60歲。注意設(shè)置記錄集的LockType類型7.5.2用ADO記錄集的Update方法修改記錄修改記277.5.2用ADO記錄集的Update方法修改記錄SubUpdate_Age()

DimIAsByte

DimcnGraduateAsADODB.Connection

SetcnGraduate=CurrentProject.Connection

DimrsTeacherAsADODB.Recordset

SetrsTeacher=NewADODB.Recordset

rsTeacher.LockType=adLockPessimisticrsTeacher.Open"導(dǎo)師",cnGraduate,,,adCmdTable

'向下跳過4條記錄,將記錄指針指向第5條記錄ForI=1To4rsTeacher.MoveNextNextIrsTeacher!年齡=60:rsTeacher.UpdateEndSub7.5.2用ADO記錄集的Update方法修改記錄Sub287.5.2用ADO記錄集的Update方法修改記錄[例7-6]在例7-4的基礎(chǔ)上進(jìn)行修改添加的程序代碼:

PrivateSubCommand5_Click()rsTeacher.MoveFirst

DoWhileNotrsTeacher.EOF

IfrsTeacher!性別="男"ThenrsTeacher!年齡=rsTeacher!年齡+1rsTeacher.UpdateEndIfrsTeacher.MoveNextLoopEndSub7.5.2用ADO記錄集的Update方法修改記錄[例297.5.3用ADO記錄集的Delete方法刪除記錄刪除記錄要慎重,因?yàn)楸粍h記錄無法恢復(fù)刪除記錄的步驟:(1)移動到需要刪除的記錄上(2)用記錄集對象的Delete方法刪除當(dāng)前記錄(3)將某條記錄指定為當(dāng)前記錄刪除記錄后,Access不能自動使下一條記錄成為當(dāng)前記錄。根據(jù)不同情況,可用MoveNext或MoveLast方法定位記錄指針。

7.5.3用ADO記錄集的Delete方法刪除記錄刪除記307.5.3用ADO記錄集的Delete方法刪除記錄[例7-7]對例7-6添加如下的單擊窗體事件過程:PrivateSubForm_Click()rsTeacher.MoveFirst

DoWhileNotrsTeacher.EOF

rsTeacher.MoveNext

LoopMsgBox"待刪除記錄不存在!"EndSub如果找到“高原”,進(jìn)行相關(guān)操作,然后退出過程轉(zhuǎn)下頁7.5.3用ADO記錄集的Delete方法刪除記錄[例317.5.3用ADO記錄集的Delete方法刪除記錄

IfrsTeacher!姓名="高原"ThenFlag=MsgBox("是否要刪除高原?",vbYesNo,"刪除確認(rèn)")IfFlag=vbYesThen

'確定刪除rsTeacher.DeleteMsgBox"記錄刪除完畢。"rsTeacher.MoveNext'刪除記錄后設(shè)定新的當(dāng)前記錄

IfrsTeacher.EOFThenrsTeacher.MoveLast

ExitSubElseIfFlag=vbNoThen

'不刪除記錄MsgBox"放棄刪除操作!",,"刪除確認(rèn)"

ExitSubEndIfEndIf如果找到“高原”,進(jìn)行相關(guān)操作,然后退出過程7.5.3用ADO記錄集的Delete方法刪除記錄If327.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

[例7-8]在ADO模塊中建立Sex過程:統(tǒng)計(jì)并在輸出對話框中顯示男、女研究生人數(shù)比。要求以人數(shù)多的一方為1、放在右側(cè)、保留小數(shù)兩位。程序分析:先遍歷全部記錄,分別統(tǒng)計(jì)出男、女研究生人數(shù)。如果男生人數(shù)多于女生,則男生人數(shù)為1,女生人數(shù)改為女生人數(shù)除以男生人數(shù);反之亦然。

7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢[例7-8]在ADO模337.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

SubSex()(定義對象、完成與數(shù)據(jù)庫的連接、打開研究生表、定義變量)Student.MoveFirst

DoWhile

NotStudent.EOF'統(tǒng)計(jì)男、女研究生人數(shù)

IfStudent!性別="男"ThenBoy=Boy+1IfStudent!性別="女"ThenGirl=Girl+1Student.MoveNextLoopIfGirl<=BoyThen

'以男生人數(shù)為1MsgBox"女:男="&Format(Girl/Boy,"0.00")&":1"Else

'以女生人數(shù)為1MsgBox"男:女="&Format(Boy/Girl,"0.00")&":1"EndIfEndSub7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢SubSex()347.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

[例7-9]略[例7-10]7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢[例7-9]略357.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

PrivateSubForm_Load()MSFlexGrid1.Rows=1MSFlexGrid1.Cols=8

'以下為MsFlexGrid添加列標(biāo)題MSFlexGrid1.Row=0:MSFlexGrid1.Col=1'選定0行1列MSFlexGrid1.Value="學(xué)號"MSFlexGrid1.Col=2:MSFlexGrid1.Value="姓名"MSFlexGrid1.Col=3:MSFlexGrid1.Value="性別"MSFlexGrid1.Col=4:MSFlexGrid1.Value="入學(xué)日期"MSFlexGrid1.Col=5:MSFlexGrid1.Value="入學(xué)分?jǐn)?shù)"MSFlexGrid1.Col=6:MSFlexGrid1.Value="研究方向"MSFlexGrid1.Col=7:MSFlexGrid1.Value="導(dǎo)師編號"EndSub7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢PrivateSub367.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

PrivateSubCommand1_Click()'單擊"生成"按鈕(定義變量、定義對象、完成與數(shù)據(jù)庫的連接、打開研究生表)Student.MoveFirst

DoWhileNotStudent.EOFForI=2ToStudent!入學(xué)分?jǐn)?shù)-1

IfStudent!入學(xué)分?jǐn)?shù)ModI=0ThenExitFor

'不是質(zhì)數(shù)NextI

IfI=Student!入學(xué)分?jǐn)?shù)Then

'如果入學(xué)分?jǐn)?shù)為質(zhì)數(shù)S=""

ForI=0To6'將當(dāng)前記錄各個字段連成一行

S=S&Student.Fields(I)&Chr(9)

NextIMSFlexGrid1.AddItem“”&vbTab&S'跳過每行左側(cè)的標(biāo)題欄

EndIfStudent.MoveNextLoopEndSub7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢PrivateSub377.7

在VBA程序中使用SQL命令

Access提供了DoCmd對象,該對象的RunSQL方法可以在VBA程序中用SQL命令直接對數(shù)據(jù)源進(jìn)行操作。RunSQL方法的格式為:DoCmd.RunSQL<SQL命令>也可以Dim<字符串變量>AsString<字符串變量>=<SQL命令>DoCmd.RunSQL<字符串變量>

<SQL命令>是一對由雙引號括起來的SQL命令7.7在VBA程序中使用SQL命令A(yù)ccess提供了387.7

在VBA程序中使用SQL命令

7.7.1定義數(shù)據(jù)7.7.2編輯數(shù)據(jù)7.7.3實(shí)現(xiàn)數(shù)據(jù)完整性約束

7.7.4執(zhí)行查詢操作

7.7在VBA程序中使用SQL命令7.7.1定義397.7.1定義數(shù)據(jù)1.創(chuàng)建數(shù)據(jù)表

CREATETABLE<表名>(字段名數(shù)據(jù)類型[NULL|NOTNULL]|字段名AS計(jì)算表達(dá)式[,...n])[例7-11]在SQL模塊中建立如下過程:

SubCreate_Table()

DoCmd.RunSQL"CREATETABLEStudent(姓名text(6),年齡byte,入學(xué)日期date)"EndSubSubCreate_Table()DimSqlAsString

Sql="CREATETABLEStudent(姓名text(6),年齡byte,入學(xué)日期date)"DoCmd.RunSQLSqlEndSub等價(jià)7.7.1定義數(shù)據(jù)1.創(chuàng)建數(shù)據(jù)表SubCreate407.7.1定義數(shù)據(jù)2.在表中增加字段

[例7-12]為Student表增加一個貨幣型的字段“學(xué)費(fèi)”

3.改變字段的類型[例7-13]修改Student表中“年齡”字段的類型SubAdd_Field()DoCmd.RunSQL"ALTERTABLEStudentADD學(xué)費(fèi)CURRENCY"EndSubSubAlter_Fields_Type()DoCmd.RunSQL"ALTERTABLEStudentALTER年齡SmallInt"EndSub如果字段的新類型與原類型不兼容將造成數(shù)據(jù)丟失

7.7.1定義數(shù)據(jù)2.在表中增加字段SubAdd_417.7.1定義數(shù)據(jù)4.改變字段的寬度

[例7-14]更改Student表中“姓名”字段的寬度

5.刪除一個字段

[例7-15]刪除Student表中的“年齡”字段

SubDelete_Field()DoCmd.RunSQL"ALTERTABLEStudentDROP

年齡"EndSubSubAlter_Fields_Width()DoCmd.RunSQL"ALTERTABLEStudentALTER姓名text(10)"EndSub字段的寬度由大變小,有可能丟失數(shù)據(jù)

7.7.1定義數(shù)據(jù)4.改變字段的寬度SubDele427.7.1定義數(shù)據(jù)6.刪除一個表

[例7-16]刪除Student表

7.修改數(shù)據(jù)表名字

[例7-17]將Student表的名字更改成“學(xué)生”SubRename_Table()

DoCmd.Rename"學(xué)生",acTable,"Student"EndSubSubDelete_Table()DoCmd.RunSQL"DROPTABLEStudent"EndSub7.7.1定義數(shù)據(jù)6.刪除一個表SubRename437.7.2編輯數(shù)據(jù)1.向表中追加記錄[例7-18]在Student表中添加一條記錄SubInsert_Table()DoCmd.RunSQL"INSERTINTOStudentVALUES('李大明',35,'2003-1-15')"EndSubVALUES后的數(shù)據(jù)與表中字段的順序要一一對應(yīng)

說明:(1)日期型常量可以放在一對單引號或一對#中。(2)如果數(shù)據(jù)是通過輸入對話框等途徑獲得,需在SQL命令中使用變量,然后用&運(yùn)算符將變量連接到SQL命令中。對于字符串變量或日期型變量,要在這些變量的兩側(cè)加上一對單引號。7.7.2編輯數(shù)據(jù)1.向表中追加記錄SubInser447.7.2編輯數(shù)據(jù)[例7-19]通過變量為Student表添加一條記錄

SubInsert_Table_VBA()

DimS_nameAsString

DimAgeAsByte,S_dateAsDateS_name=InputBox("輸入學(xué)生姓名:")S_date=InputBox("入學(xué)日期:")Age=21DoCmd.RunSQL"INSERTINTOStudentVALUES('"&S_name&"',"&Age&",'"&S_date&"')"EndSub注意單引號和雙引號出現(xiàn)的位置

7.7.2編輯數(shù)據(jù)[例7-19]通過變量為Stude457.7.2編輯數(shù)據(jù)2.修改表中記錄[例7-20]將“導(dǎo)師”表中“李向明”的年齡改成40

[例7-21]將“導(dǎo)師”表中所有男導(dǎo)師的年齡增加1歲SubUpdate_Table_1()DoCmd.RunSQL"UPDATE導(dǎo)師SET年齡=40WHERE姓名='李向明'"EndSub如果本例用ADO技術(shù)編程,代碼會怎樣?SubUpdate_Table_2()DoCmd.RunSQL"UPDATE導(dǎo)師SET年齡=年齡+1WHERE性別='男'"EndSub7.7.2編輯數(shù)據(jù)2.修改表中記錄SubUpdat467.7.2編輯數(shù)據(jù)3.刪除特定記錄

[例7-22]將“導(dǎo)師”表中年齡在50歲以下的記錄全部刪除

SubDelete_Record()DoCmd.RunSQL"DELETEFROM導(dǎo)師WHERE年齡<50"EndSub思考:(1)如果要求將“導(dǎo)師”表中低于年齡平均值的導(dǎo)師記錄刪除,例7-22應(yīng)怎樣修改?(2)如果要刪除小于X歲的所有記錄,X的值通過鍵盤在程序運(yùn)行時(shí)輸入,程序又該怎樣修改?7.7.2編輯數(shù)據(jù)3.刪除特定記錄SubDelet477.7.3實(shí)現(xiàn)數(shù)據(jù)完整性約束

1.設(shè)置主鍵[例7-23]為“導(dǎo)師”表和“研究生”表設(shè)置主鍵(如果這兩個表已有主鍵和外鍵,請先予以刪除)[例7-24]在創(chuàng)建新表Teacher的同時(shí)設(shè)定code為主鍵

SubCreate_Primary()DoCmd.RunSQL"AlterTable導(dǎo)師AddPrimaryKey(導(dǎo)師編號)"DoCmd.RunSQL"AlterTable研究生AddPrimaryKey(學(xué)號)"EndSubSubCreate_Table_Primary()DoCmd.RunSQL"CREATETABLETeacher(codetext(3)PRIMARYKEY,nametext(6),birthdaydate,salarycurrency)"EndSub7.7.3實(shí)現(xiàn)數(shù)據(jù)完整性約束1.設(shè)置主鍵SubCr487.7.3實(shí)現(xiàn)數(shù)據(jù)完整性約束

2.設(shè)置外鍵[例7-25]將研究生表中的“導(dǎo)師編號”設(shè)為外鍵,對應(yīng)的參照表是“導(dǎo)師”表(建立“導(dǎo)師”表和“研究生”表間的關(guān)系)[例7-26]在創(chuàng)建新表Student1的同時(shí)指定其外鍵和參照表SubCreate_Foreign()DoCmd.RunSQL"AlterTable研究生AddForeignKey(導(dǎo)師編號)References導(dǎo)師)"EndSubSubCreate_Table_Foreign()DoCmd.RunSQL"CreateTableStudent1(codetext(4)PrimaryKey,nametext(6),sexbit,t_codetext(3),ForeignKey(t_code)ReferencesTeacher(code))"EndSubbit表示“是/否”型變量

7.7.3實(shí)現(xiàn)數(shù)據(jù)完整性約束2.設(shè)置外鍵SubCr497.7.4執(zhí)行查詢操作VBA程序中用SQL命令完成的數(shù)據(jù)查詢操作,無法直接將查詢結(jié)果所返回的記錄集按數(shù)據(jù)表形式顯示,解決方法:

方法1:將查詢形成的記錄集生成一個新表保存到數(shù)據(jù)庫中;然后用ADO記錄集對象打開這個表進(jìn)行各種操作;完成后刪除這個表。方法2:將返回的記錄集看成是保存在內(nèi)存中的一個臨時(shí)表,用ADO記錄集對象直接打開該臨時(shí)表進(jìn)行各種操作。7.7.4執(zhí)行查詢操作VBA程序中用507.7.4執(zhí)行查詢操作[例7-27]

SubQuery1()DoCmd.RunSQL"Select姓名,職稱,年齡IntotempFrom導(dǎo)師Where職稱in('教授','副教授')"(定義對象、連接數(shù)據(jù)庫、設(shè)置記錄集LockType屬性、打開temp表)

DoWhileNotrsTeacher.EOF

Debug.PrintrsTeacher!姓名,rsTeacher!職稱,rsTeacher!年齡rsTeacher.MoveNext

LooprsTeacher.Close'關(guān)閉記錄集對象,終止對temp的引用DoCmd.RunSQL"DropTabletemp"'刪除數(shù)據(jù)表tempEndSub刪除temp表之前必須先關(guān)閉對表的引用

職稱='教授'Or職稱='副教授'

7.7.4執(zhí)行查詢操作[例7-27]SubQuery517.7.4執(zhí)行查詢操作[例7-28]

Sub

Query2()DimSQLAsStringSQL="SELECTt.姓名as導(dǎo)師姓名,s.姓名as學(xué)生姓名FROM導(dǎo)師t,研究生sWHEREt.導(dǎo)師編號=s.導(dǎo)師編號andt.性別='男'"(定義對象、連接數(shù)據(jù)庫、設(shè)置記錄集LockType屬性、打開temp表)rsTeacher.OpenSQL,cnGraduate'打開查詢記錄集DoWhileNotrsTeacher.EOFDebug.Print

rsTeacher!導(dǎo)師姓名,rsTeacher!學(xué)生姓名rsTeacher.MoveNextLoopEndSubt、s分別作為“導(dǎo)師”表和“研究生”表的別名

[例7-29]不使用SQL命令實(shí)現(xiàn)上題的功能。略7.7.4執(zhí)行查詢操作[例7-28]SubQuery527.8訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫連接另一個數(shù)據(jù)庫:使用Connection對象的Open方法。語法格式為:<Connection對象>.Open"Provider=<提供者>;DataSource=<數(shù)據(jù)庫名>;UserID=[用戶標(biāo)識];Password=[密碼];"其中:提供者為Microsoft.Jet.OLEDB.4.0數(shù)據(jù)庫名包括數(shù)據(jù)庫所在的路徑及.mdb文件的名字用戶標(biāo)識是用戶的名字,缺省為admin密碼省略則表示沒有密碼7.8訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫連接另一個數(shù)據(jù)庫:使用537.8訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫[例7-30]在SQL模塊中編寫過程Double_Database(Department表保存在C:\Manage.mdb數(shù)據(jù)庫中)SubDouble_Database()(定義對象、連接數(shù)據(jù)庫、設(shè)置記錄集LockType屬性、打開"導(dǎo)師"表)

'建立與另一個數(shù)據(jù)庫Department的連接

DimDeptAsADODB.Connection

SetDept=NewADODB.ConnectionDept.Open"Provider=Microsoft.Jet.OLEDB.4.0;Data

Source=C:\Manage.mdb;UserID=;Password=;"轉(zhuǎn)下頁7.8訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫[例7-30]在SQ547.8訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫'訪問Departmrnt表DimUnitAsADODB.Recordset

SetUnit=NewADODB.RecordsetUnit.LockType=adLockOptimisticUnit.Open"Department",Dept,,,adCmdTable

'輸入導(dǎo)師姓名DimTeacherAsStringTeacher=InputBox("輸入導(dǎo)師姓名","導(dǎo)師名字")

'遍歷當(dāng)前表(導(dǎo)師表),尋找該導(dǎo)師rsTeacher.MoveFirst

DoWhileNotrsTeacher.EOFIfrsTeacher!姓名=TeacherThenExitDoEndIfrsTeacher.MoveNextLoop轉(zhuǎn)下頁接上頁找到,則提前退出循環(huán)7.8訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫'訪問De557.8訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫

'正常退出上面的循環(huán),表示沒找到該導(dǎo)師

IfrsTeacher.EOFThenMsgBox"未找到"&Teacher&"!"ExitSubEndIfUnit.MoveFirst

DoWhileNotUnit.EOF

IfUnit!系編號=rsTeacher!系編號ThenMsgBoxrsTeacher!姓名&""&Unit!系名ExitSubEndIfUnit.MoveNextLoopEndSub接上頁沒找到,則提前退出過程7.8訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫'正常退出上567.9綜合實(shí)例—編制“研究生成績管理與統(tǒng)計(jì)”程序

7.9綜合實(shí)例—編制“研究生成績管理與統(tǒng)計(jì)”程序57第7章VBA數(shù)據(jù)庫編程第7章VBA數(shù)據(jù)庫編程58本章內(nèi)容

記錄集概述

在Access中引用ADO對象

引用記錄字段

瀏覽記錄

編輯數(shù)據(jù)

用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

在VBA程序中使用SQL命令

訪問當(dāng)前數(shù)據(jù)庫以外的數(shù)據(jù)庫

綜合實(shí)例—編制“研究生成績管理與統(tǒng)計(jì)”程序本章內(nèi)容記錄集概述597.1記錄集概述

7.1.1ADO的9個對象7.1.2了解記錄集

7.1記錄集概述7.1.1ADO的9個對象607.1.1ADO的9個對象

ADO:ActiveXDataObjectsAccess內(nèi)嵌的VBA是用ADO技術(shù)開發(fā)數(shù)據(jù)庫應(yīng)用的主要工具ADO對象模型有9個對象:Connection、Recordset、Record、Command、Parameter、Field、Property、Stream、Error常用對象:Connection、Command、Recordset7.1.1ADO的9個對象ADO:ActiveXDa617.1.1ADO的9個對象

Connection對象:ADO對象模型中最高級的對象,實(shí)現(xiàn)應(yīng)用程序與數(shù)據(jù)源的連接。Command對象:主要作用是在VBA中通過SQL語句訪問、查詢數(shù)據(jù)庫中的數(shù)據(jù)。Recordset對象:存儲訪問表和查詢對象返回的記錄。使用該對象,可以瀏覽記錄、修改記錄、添加新的記錄或者刪除特定的記錄。Recordset對象的功能最常用、最重要7.1.1ADO的9個對象Connection對象:A627.1.1ADO的9個對象

ADO的3個對象之間互有聯(lián)系:Command對象和Recordset對象依賴于Connection對象的連接;Command對象結(jié)合SQL命令可以取代Recordset對象,但遠(yuǎn)沒有Recordset對象靈活、實(shí)用;Recordset對象它只能實(shí)現(xiàn)數(shù)據(jù)表內(nèi)記錄集操作,無法完成表和數(shù)據(jù)庫的數(shù)據(jù)定義操作;數(shù)據(jù)定義操作一般需通過Command對象用SQL命令完成。本章用DoCmd對象代替Command對象。7.1.1ADO的9個對象ADO的3個對象之間互有聯(lián)系637.1.2了解記錄集

記錄集(Recordset):對表執(zhí)行查詢操作時(shí),返回的一組特定記錄。用記錄集可執(zhí)行的操作:對表中的數(shù)據(jù)進(jìn)行查詢和統(tǒng)計(jì),在表中添加、更新或刪除記錄。記錄集是一個對象,它包括記錄和字段,具有其特定的屬性和方法,利用這些屬性和方法就可以編程處理數(shù)據(jù)庫中的記錄。7.1.2了解記錄集記錄集(Recordset):對表647.2在Access中引用ADO對象

應(yīng)用程序中的ADO引用:聲明Connection對象→創(chuàng)建Recordset對象→編程完成各種數(shù)據(jù)訪問操作7.2.1聲明Connection對象7.2.2聲明與打開Recordset對象7.2.3關(guān)閉Recordset和Connection對象7.2在Access中引用ADO對象應(yīng)用程序中的AD657.2.1聲明Connection對象

(1)聲明一個Connection對象(2)初始化Connection對象(決定Connection對

象與哪個數(shù)據(jù)庫相連接)例如:

Dim

cnGraduate

AsADODB.Connection

Set

cnGraduate=CurrentProject.Connection

與當(dāng)前數(shù)據(jù)庫連接

7.2.1聲明Connection對象(1)聲明一個667.2.2聲明與打開Recordset對象

(1)聲明Recordset對象(2)創(chuàng)建Recordset對象實(shí)例(3)打開Recordset對象例如:

Dim

rsStudents

AsADODB.Recordset

Set

rsStudents=NewADODB.Recordset

rsStudents.Open"研究生",cnGraduate,,,adCmdTable

前面聲明的Connection對象

表名稱

打開的是表對象

參數(shù)占位符

7.2.2聲明與打開Recordset對象(1)聲明677.2.3關(guān)閉Recordset和Connection對象

方法:執(zhí)行Recordset對象和Connection對象的Close方法→將對象設(shè)置為Nothing例如:rsStudents.ClosecnGraduate.CloseSet

rsStudents=NothingSet

cnGraduate=Nothing上述語句不是必須的。應(yīng)用程序終止運(yùn)行時(shí),系統(tǒng)會自動關(guān)閉并清除這兩個對象。7.2.3關(guān)閉Recordset和Connection對687.3引用記錄字段

任何對記錄集的訪問都是針對當(dāng)前記錄進(jìn)行的。打開記錄集時(shí)默認(rèn)的當(dāng)前記錄為第1條記錄。引用記錄的字段:直接在記錄集對象中引用字段名稱,如Code=rsStudents!學(xué)號若記錄集字段名包含空格,或者字段名是一個保留字,則引用時(shí)必須將該字段名用方括號括起來。

使用記錄集對象的Fields(n)屬性。n是記錄中字段從左到右的排列序號,第一個字段的序號為0。如Code=rsStudents.Fields(0)記錄集對象與字段名間的連接符

7.3引用記錄字段任何對記錄集的訪問都是針對當(dāng)前記錄進(jìn)697.3引用記錄字段

[例7-1]建立名為ADO的模塊,編寫如下過程。運(yùn)行該過程后,輸出對話框顯示“導(dǎo)師”表中第一位教師的編號和姓名。7.3引用記錄字段[例7-1]建立名為ADO的模塊,707.3引用記錄字段

記錄集更多的應(yīng)用是在窗體對象上:建立一個空白窗體→設(shè)計(jì)各個控件→編程引用記錄集當(dāng)前記錄的相關(guān)字段或?qū)⒆侄蔚闹低ㄟ^控件顯示注意:如果涉及數(shù)據(jù)訪問的事件過程不止一個,可在代碼窗口的通用段定義Connection對象和Recordset對象,然后在Form_Load事件過程中完成數(shù)據(jù)庫連接和數(shù)據(jù)表的打開。7.3引用記錄字段記錄集更多的應(yīng)用是在窗體對象上:建立717.3引用記錄字段

[例7-2]運(yùn)行:分別單擊“導(dǎo)師編號”和“導(dǎo)師姓名”按鈕

窗體設(shè)計(jì)視圖(刪除導(dǎo)航按鈕)

7.3引用記錄字段[例7-2]運(yùn)行:分別單擊“導(dǎo)師編727.3引用記錄字段

例7-2窗體程序代碼

7.3引用記錄字段例7-2窗體程序代碼737.4瀏覽記錄

Recordset記錄集對象提供了4種記錄指針的移動方法MoveFirst記錄指針移到第一條記錄MoveNext記錄指針移到當(dāng)前記錄的下一條記錄MovePrevious記錄指針移到當(dāng)前記錄的上一條記錄MoveLast記錄指針移到最后一條記錄Recordset記錄集的BOF和EOF屬性用于判斷記錄指針是否處于有記錄的正常位置記錄指針將指向最后一條記錄之后,EOF屬性為True記錄指針將指向第一條記錄之前,BOF屬性為TrueBOF和EOF屬性的值均為True,表示記錄集為空

7.4瀏覽記錄Recordset記錄集對象提供了4種記747.4瀏覽記錄

[例7-3]對例7-2進(jìn)行修改

增加如下事件過程代碼:

PrivateSubCommand3_Click()‘單擊“下一個記錄”按鈕rsTeacher.MoveNext

EndSub7.4瀏覽記錄[例7-3]對例7-2進(jìn)行修改增加如757.4瀏覽記錄

上面的過程隱含錯誤:移至最后一條記錄后無法再下移指針,將出現(xiàn)運(yùn)行錯誤信息框。兩種糾正錯誤的方法:如果記錄集的EOF屬性為True,就回到第一條記錄如果記錄集的EOF屬性為True,就回到最后一條記錄

PrivateSubCommand3_Click()‘單擊“下一個記錄”按鈕rsTeacher.MoveNextEndSub7.4瀏覽記錄PrivateSubCommand3767.4瀏覽記錄

PrivateSubCommand3_Click()

rsTeacher.MoveNextIfrsTeacher.EOFThenrsTeacher.MoveFirstEndIfEndSub方法1:若記錄集的EOF屬性為True,則回到首記錄方法2:若記錄集的EOF屬性為True,則回到末記錄PrivateSubCommand3_Click()

rsTeacher.MoveNextIfrsTeacher.EOFThenrsTeacher.MoveLastEndIfEndSub7.4瀏覽記錄PrivateSubCommand3777.4瀏覽記錄

方法2的程序還將運(yùn)行出錯。因?yàn)镽ecordset對象有一個名為LockType的屬性,默認(rèn)值為adLockReadOnly,此時(shí)只能瀏覽記錄數(shù)據(jù),記錄的移動方式也只能是MoveNext和MoveFirst。要實(shí)現(xiàn)記錄指針的4種移動操作,完成記錄的添加、刪改或更新,必須在使用Open方法打開數(shù)據(jù)表之前,將該記錄集對象的LockType屬性設(shè)置成adLockPessimistic或adLockOptimistic,如rsTeacher.LockType=adLockPessimisticrsTeacher.Open"導(dǎo)師",cnGraduate,,,adCmdTable7.4瀏覽記錄方法2的程序還將運(yùn)行出錯。因?yàn)镽ecor787.4瀏覽記錄

Recordset對象的LocyType屬性決定數(shù)據(jù)的鎖定方式:adLockReadOnly:數(shù)據(jù)處于只讀狀態(tài)。adLockPessimistic(保守式鎖定):編輯數(shù)據(jù)時(shí)即鎖定數(shù)據(jù)源記錄,直到數(shù)據(jù)編輯完成才釋放。adLockOptimistic(開放式鎖定):編輯數(shù)據(jù)時(shí)不鎖定,用Update方法提交數(shù)據(jù)時(shí)才鎖定數(shù)據(jù)源記錄。adLockBatchOptimistic(開放式更新):應(yīng)用于批更新模式7.4瀏覽記錄Recordset對象的LocyType797.4瀏覽記錄

如果數(shù)據(jù)表中沒有記錄,即BOF和EOF同時(shí)為True,就不能引用表中的數(shù)據(jù)。將單擊“導(dǎo)師姓名”按鈕的事件過程改寫如下PrivateSubCommand2_Click()IfrsTeacher.BOF=TrueAndrsTeacher.EOF=TrueThenText1.Value=""ElseText1.Value=rsTeacher!姓名EndIfEndSub同理,修改單擊“導(dǎo)師編號”按鈕的事件過程同理,修改“下一個記錄”按鈕的事件過程代碼(空表情況下記錄指針不移動)7.4瀏覽記錄如果數(shù)據(jù)表中沒有記錄,即BOF和EOF同807.5編輯數(shù)據(jù)

7.5.1用ADO記錄集的AddNew方法添加記錄7.5.2用ADO記錄集的Update方法修改記錄

7.5.3用ADO記錄集的Delete方法刪除記錄

7.5編輯數(shù)據(jù)7.5.1用ADO記錄集的AddNe817.5.1用ADO記錄集的AddNew方法添加記錄添加新記錄的步驟:(1)用記錄集的AddNew方法產(chǎn)生一個空記錄(2)為空記錄的各個字段賦值(3)用記錄集的Update方法保存新記錄[例7-4]在例7-3的基礎(chǔ)上進(jìn)行修改

7.5.1用ADO記錄集的AddNew方法添加記錄添加新827.5.1用ADO記錄集的AddNew方法添加記錄添加的程序代碼:PrivateSubCommand4_Click()DimAgeAs

BytersTeacher.MoveFirstAge=rsTeacher!年齡'讀取第一條記錄的年齡字段值

rsTeacher.AddNew

'添加一條新記錄rsTeacher!導(dǎo)師編號="107"rsTeacher!姓名="高原"rsTeacher!年齡=Age

rsTeacher.UpdateEndSub思考:什么情況下單擊“新記錄”按鈕,系統(tǒng)會提示出錯?7.5.1用ADO記錄集的AddNew方法添加記錄添加的837.5.2用ADO記錄集的Update方法修改記錄修改記錄的步驟:(1)將記錄指針移動到需要修改的記錄上(2)對記錄中的相關(guān)字段的值進(jìn)行修改(3)用Update方法保存更改修改后的結(jié)果不得違反數(shù)據(jù)完整性約束

[例7-5]在模塊ADO中添加過程Update_Age:將“導(dǎo)師”表中第5條記錄的年齡字段值修改為60歲。注意設(shè)置記錄集的LockType類型7.5.2用ADO記錄集的Update方法修改記錄修改記847.5.2用ADO記錄集的Update方法修改記錄SubUpdate_Age()

DimIAsByte

DimcnGraduateAsADODB.Connection

SetcnGraduate=CurrentProject.Connection

DimrsTeacherAsADODB.Recordset

SetrsTeacher=NewADODB.Recordset

rsTeacher.LockType=adLockPessimisticrsTeacher.Open"導(dǎo)師",cnGraduate,,,adCmdTable

'向下跳過4條記錄,將記錄指針指向第5條記錄ForI=1To4rsTeacher.MoveNextNextIrsTeacher!年齡=60:rsTeacher.UpdateEndSub7.5.2用ADO記錄集的Update方法修改記錄Sub857.5.2用ADO記錄集的Update方法修改記錄[例7-6]在例7-4的基礎(chǔ)上進(jìn)行修改添加的程序代碼:

PrivateSubCommand5_Click()rsTeacher.MoveFirst

DoWhileNotrsTeacher.EOF

IfrsTeacher!性別="男"ThenrsTeacher!年齡=rsTeacher!年齡+1rsTeacher.UpdateEndIfrsTeacher.MoveNextLoopEndSub7.5.2用ADO記錄集的Update方法修改記錄[例867.5.3用ADO記錄集的Delete方法刪除記錄刪除記錄要慎重,因?yàn)楸粍h記錄無法恢復(fù)刪除記錄的步驟:(1)移動到需要刪除的記錄上(2)用記錄集對象的Delete方法刪除當(dāng)前記錄(3)將某條記錄指定為當(dāng)前記錄刪除記錄后,Access不能自動使下一條記錄成為當(dāng)前記錄。根據(jù)不同情況,可用MoveNext或MoveLast方法定位記錄指針。

7.5.3用ADO記錄集的Delete方法刪除記錄刪除記877.5.3用ADO記錄集的Delete方法刪除記錄[例7-7]對例7-6添加如下的單擊窗體事件過程:PrivateSubForm_Click()rsTeacher.MoveFirst

DoWhileNotrsTeacher.EOF

rsTeacher.MoveNext

LoopMsgBox"待刪除記錄不存在!"EndSub如果找到“高原”,進(jìn)行相關(guān)操作,然后退出過程轉(zhuǎn)下頁7.5.3用ADO記錄集的Delete方法刪除記錄[例887.5.3用ADO記錄集的Delete方法刪除記錄

IfrsTeacher!姓名="高原"ThenFlag=MsgBox("是否要刪除高原?",vbYesNo,"刪除確認(rèn)")IfFlag=vbYesThen

'確定刪除rsTeacher.DeleteMsgBox"記錄刪除完畢。"rsTeacher.MoveNext'刪除記錄后設(shè)定新的當(dāng)前記錄

IfrsTeacher.EOFThenrsTeacher.MoveLast

ExitSubElseIfFlag=vbNoThen

'不刪除記錄MsgBox"放棄刪除操作!",,"刪除確認(rèn)"

ExitSubEndIfEndIf如果找到“高原”,進(jìn)行相關(guān)操作,然后退出過程7.5.3用ADO記錄集的Delete方法刪除記錄If897.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

[例7-8]在ADO模塊中建立Sex過程:統(tǒng)計(jì)并在輸出對話框中顯示男、女研究生人數(shù)比。要求以人數(shù)多的一方為1、放在右側(cè)、保留小數(shù)兩位。程序分析:先遍歷全部記錄,分別統(tǒng)計(jì)出男、女研究生人數(shù)。如果男生人數(shù)多于女生,則男生人數(shù)為1,女生人數(shù)改為女生人數(shù)除以男生人數(shù);反之亦然。

7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢[例7-8]在ADO模907.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

SubSex()(定義對象、完成與數(shù)據(jù)庫的連接、打開研究生表、定義變量)Student.MoveFirst

DoWhile

NotStudent.EOF'統(tǒng)計(jì)男、女研究生人數(shù)

IfStudent!性別="男"ThenBoy=Boy+1IfStudent!性別="女"ThenGirl=Girl+1Student.MoveNextLoopIfGirl<=BoyThen

'以男生人數(shù)為1MsgBox"女:男="&Format(Girl/Boy,"0.00")&":1"Else

'以女生人數(shù)為1MsgBox"男:女="&Format(Boy/Girl,"0.00")&":1"EndIfEndSub7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢SubSex()917.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

[例7-9]略[例7-10]7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢[例7-9]略927.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

PrivateSubForm_Load()MSFlexGrid1.Rows=1MSFlexGrid1.Cols=8

'以下為MsFlexGrid添加列標(biāo)題MSFlexGrid1.Row=0:MSFlexGrid1.Col=1'選定0行1列MSFlexGrid1.Value="學(xué)號"MSFlexGrid1.Col=2:MSFlexGrid1.Value="姓名"MSFlexGrid1.Col=3:MSFlexGrid1.Value="性別"MSFlexGrid1.Col=4:MSFlexGrid1.Value="入學(xué)日期"MSFlexGrid1.Col=5:MSFlexGrid1.Value="入學(xué)分?jǐn)?shù)"MSFlexGrid1.Col=6:MSFlexGrid1.Value="研究方向"MSFlexGrid1.Col=7:MSFlexGrid1.Value="導(dǎo)師編號"EndSub7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢PrivateSub937.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢

PrivateSubCommand1_Click()'單擊"生成"按鈕(定義變量、定義對象、完成與數(shù)據(jù)庫的連接、打開研究生表)Student.MoveFirst

DoWhileNotStudent.EOFForI=2ToStudent!入學(xué)分?jǐn)?shù)-1

IfStudent!入學(xué)分?jǐn)?shù)ModI=0ThenExitFor

'不是質(zhì)數(shù)NextI

IfI=Student!入學(xué)分?jǐn)?shù)Then

'如果入學(xué)分?jǐn)?shù)為質(zhì)數(shù)S=""

ForI=0To6'將當(dāng)前記錄各個字段連成一行

S=S&Student.Fields(I)&Chr(9)

NextIMSFlexGrid1.AddItem“”&vbTab&S'跳過每行左側(cè)的標(biāo)題欄

EndIfStudent.MoveNextLoopEndSub7.6用ADO技術(shù)實(shí)現(xiàn)復(fù)雜查詢PrivateSub947.7

在VBA程序中使用SQL命令

Access提供了DoCmd對象,該對象的RunSQL方法可以在VBA程序中用SQL命令直接對數(shù)據(jù)源進(jìn)行操作。RunSQL方法的格式為:DoCmd.RunSQL<SQL命令>也可以Dim<字符串變量>AsString<字符串變量>=<SQL命令>DoCmd.RunSQL<字符串變量>

<SQL命令>是一對由雙引號括起來的SQL命令7.7在VBA程序中使用SQL命令A(yù)ccess提供了957.7

在VBA程序中使用SQL命令

7.7.1定義數(shù)據(jù)7.7.2編輯數(shù)據(jù)7.7.3實(shí)現(xiàn)數(shù)據(jù)完整性約束

7.7.4執(zhí)行查詢操作

7.7在VBA程序中使用SQL命令7.7.1定義967.7.1定義數(shù)據(jù)1.創(chuàng)建數(shù)據(jù)表

CREATETABLE<表名>(字段名數(shù)據(jù)類型[NULL|NOTNULL]|字段名AS計(jì)算表達(dá)式[,...n])[例7-11]在SQL模塊中建立如下過程:

SubCreate_Table()

DoCmd.RunSQL"CRE

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論