版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、VB學(xué)生成績(jī)管理系統(tǒng)1. VB操作數(shù)據(jù)庫(kù)簡(jiǎn)介本章節(jié)主要介紹VB中操作數(shù)據(jù)庫(kù)的一般方法,有ADO Data控件的連接、ADODB對(duì)象的使用,當(dāng)然在可視化的開(kāi)發(fā)系統(tǒng)中用控件是的方法是比較簡(jiǎn)單的,但不是很靈活,相比較ADODB對(duì)象的方法比較靈活,但使用相對(duì)麻煩;這里讀者會(huì)問(wèn),那這兩個(gè)又是怎么去訪問(wèn)到數(shù)據(jù)庫(kù)的呢?其實(shí)他們是通過(guò)一些接口去訪問(wèn)不同數(shù)據(jù)庫(kù)的,而這些接口會(huì)屏蔽掉數(shù)據(jù)庫(kù)訪問(wèn)協(xié)議和各個(gè)數(shù)據(jù)庫(kù)之間的差別,這里最常用的有兩種接口,一種就是ODBC、還有一種是OLE DB,下面我們介紹他們的結(jié)構(gòu):(a)數(shù)據(jù)庫(kù)訪問(wèn)接口:(1) ODBC:ODBC其實(shí)是開(kāi)放式數(shù)據(jù)庫(kù)互連(Open Database Con
2、nectivity),是微軟公司推出的一種實(shí)現(xiàn)應(yīng)用程序和關(guān)系數(shù)據(jù)庫(kù)之間通訊的方法標(biāo)準(zhǔn),是一個(gè)接口標(biāo)準(zhǔn)。所以它實(shí)際上是一種標(biāo)準(zhǔn),符合標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)就可以通過(guò)SQL語(yǔ)言編寫(xiě)的命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,但只能針對(duì)關(guān)系數(shù)據(jù)庫(kù)進(jìn)行操作(如SQL Server,Oracle,Access,Excel等),目前所有的關(guān)系數(shù)據(jù)庫(kù)都符合該標(biāo)準(zhǔn)。ODBC本質(zhì)上是一組數(shù)據(jù)庫(kù)訪問(wèn)API(應(yīng)用程序編程接口),由一組函數(shù)調(diào)用組成,核心是SQL語(yǔ)句,他的結(jié)構(gòu)圖如下圖1:圖 1.1在具體操作時(shí),首先必須用ODBC管理器注冊(cè)一個(gè)數(shù)據(jù)源,管理器根據(jù)數(shù)據(jù)源提供的數(shù)據(jù)庫(kù)位置、數(shù)據(jù)庫(kù)類型及ODBC驅(qū)動(dòng)程序等信息,建立起ODBC與具體數(shù)據(jù)庫(kù)的
3、聯(lián)系。這樣,只要應(yīng)用程序?qū)?shù)據(jù)源名提供給ODBC,ODBC就能建立起與相應(yīng)數(shù)據(jù)庫(kù)的連接。(2) OLE DB:OLE DB:數(shù)據(jù)庫(kù)鏈接和嵌入對(duì)象(Object Linking and Embedding DataBase)。OLE DB是微軟提出的基于COM思想且面向?qū)ο蟮囊环N技術(shù)標(biāo)準(zhǔn),目的是提供一種統(tǒng)一的數(shù)據(jù)訪問(wèn)接口訪問(wèn)各種數(shù)據(jù)源,這里所說(shuō)的"數(shù)據(jù)"除了標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)之外,還包括郵件數(shù)據(jù)、Web上的文本或圖形、目錄服務(wù)(Directory Services)、以及主機(jī)系統(tǒng)中的文件和地理數(shù)據(jù)以及自定義業(yè)務(wù)對(duì)象等。OLE DB標(biāo)準(zhǔn)的核心內(nèi)容就是要求對(duì)以上這些各種各
4、樣的數(shù)據(jù)存儲(chǔ)(Data Store)都提供一種相同的訪問(wèn)接口,使得數(shù)據(jù)的使用者(應(yīng)用程序)可以使用同樣的方法訪問(wèn)各種數(shù)據(jù),而不用考慮數(shù)據(jù)的具體存儲(chǔ)地點(diǎn)、格式或類型,他的結(jié)構(gòu)圖如下圖2:圖 1.2(b)VB中數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象:(1) ADO Data控件:ADO Data 控件使用 Microsoft ActiveX 數(shù)據(jù)對(duì)象(ADO) 來(lái)快速建立數(shù)據(jù)綁定的控件和數(shù)據(jù)提供者之間的連接。數(shù)據(jù)綁定控件是任何具有“數(shù)據(jù)源”屬性的控件。數(shù)據(jù)提供者可以是任何符合 OLEDB 規(guī)范的數(shù)據(jù)源,這里可能是對(duì)ADO的一個(gè)封裝,他訪問(wèn)數(shù)據(jù)庫(kù)的接口可以使用ODBC、也可以使用OLEDB,但OLEDB靈活,不用在系統(tǒng)中配
5、置數(shù)據(jù)源,而且效率高,所以現(xiàn)在使用OLEDB更多點(diǎn),下面程序中也是用OLEDB來(lái)介紹的,下面簡(jiǎn)單介紹一下ADODC控件的使用層次圖。ADODC在VB數(shù)據(jù)庫(kù)程序設(shè)計(jì)中起了一個(gè)橋梁的作用,可以方便VB中的一些控件直接和數(shù)據(jù)庫(kù)關(guān)聯(lián),他的使用示意圖如下:圖 1.3(2) ADODB對(duì)象ADO是ActiveX Data Objects的縮寫(xiě),是一項(xiàng)新的數(shù)據(jù)庫(kù)的存取技術(shù),他最主要包含三個(gè)對(duì)象,Connection、Recordset、Command,Connection對(duì)象:連接對(duì)象,負(fù)責(zé)通過(guò)OLEDB或ODBC建立與數(shù)據(jù)庫(kù)之間的連接。Recordset對(duì)象:記錄集對(duì)象,存放從數(shù)據(jù)庫(kù)中得到的記錄,這些可能
6、是執(zhí)行某條SQL語(yǔ)句的結(jié)果。Command對(duì)象:執(zhí)行SQL語(yǔ)句返回Recordset類型的結(jié)果?;镜挠梅ǎ?1) 連接數(shù)據(jù)源(2) 打開(kāi)記錄集對(duì)象(3) 使用記錄集(4) 斷開(kāi)連接具體的應(yīng)用后面在學(xué)生成績(jī)錄入中會(huì)介紹到。2. VB連接SQL Server數(shù)據(jù)庫(kù)a) 用可視ADODC控件連接數(shù)據(jù)庫(kù),如圖將控件選擇到工具欄。(1) 設(shè)置ADODC的ConnectionString屬性。選擇控件選擇控件圖 2.1點(diǎn)擊打開(kāi)屬性頁(yè)圖 2.2 (2)生成連接字符串。點(diǎn)擊數(shù)據(jù)連接屬性頁(yè)圖 2.3 圖 2.4(3)設(shè)置ADODC的RecordSource屬性。命令類型圖 2.5 命令類型:adCmdText
7、 :值1,表示命令為SQL語(yǔ)句。adCmdTable :值2,表示命令為一表名。adCmdStoredProc:值4,表示命令是一存儲(chǔ)過(guò)程名。adCmdUnknown :值8,表示不確定命令類型。(4)此時(shí)數(shù)據(jù)源控件已連接好數(shù)據(jù)庫(kù),可以直接訪問(wèn)它,或者可以充當(dāng)數(shù)據(jù)表格控件的數(shù)據(jù)源使用。b) 用ADODB.CONNECTION對(duì)象連接數(shù)據(jù)庫(kù)(1) 創(chuàng)建ADODB.CONNECTION對(duì)象Private SqlCon As New ADODB.ConnectionSqlCon.Provider = "SQLOLEDB"SqlCon.Open "Server=micro
8、sof-cee903dcr;DataBase=XSCJ;UID=wmx;PWD=1234;"(2) 使用ADODB.CONNECTION對(duì)象Private SqlCmd As New ADODB.Command指定Command對(duì)象所使用的連接SqlCmd.ActiveConnection = SqlConSqlCmd.CommandText = "select * from XS"執(zhí)行命令Set SqlRes=SqlCmd.Execute3. 學(xué)生成績(jī)管理系統(tǒng)本演示系統(tǒng)是一個(gè)用VB實(shí)現(xiàn)的簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng),使用用可視ADODC控件和ADODB對(duì)象來(lái)訪問(wèn)后臺(tái)數(shù)
9、據(jù)庫(kù)服務(wù)器的,包含學(xué)生信息的查詢、學(xué)生休息的錄入修改刪除、學(xué)生成績(jī)的錄入修改,下面就分別說(shuō)明各模塊的具體實(shí)現(xiàn)。4. 系統(tǒng)主界面菜單工具條圖 4.1主要功能:主界面,導(dǎo)航作用,點(diǎn)擊可進(jìn)入操作窗口。創(chuàng)建過(guò)程:(1) 創(chuàng)建菜單: 圖 4.2分別起名為:學(xué)生信息查詢(msStuSearch)、學(xué)生信息修改(msStuInfo)、學(xué)生成績(jī)修改(msStuScore)、退出系統(tǒng)(msQuitSys)(2) 創(chuàng)建工具條:學(xué)生信息查詢、學(xué)生信息修改、學(xué)生成績(jī)修改退出系統(tǒng)圖 4.3創(chuàng)建工具條,創(chuàng)建ImageList控件,導(dǎo)入圖標(biāo),與菜單關(guān)聯(lián);退出系統(tǒng)、學(xué)生信息查詢、學(xué)生信息修改、學(xué)生成績(jī)修改的index分別為3
10、、6,7,8。主要代碼:菜單Click的處理過(guò)程退出系統(tǒng)菜單Private Sub msQuitSys_Click() EndEnd Sub學(xué)生信息修改菜單Private Sub msStuInfo_Click() AddStu.ShowEnd Sub學(xué)生成績(jī)錄入菜單Private Sub msStuScore_Click() AddStuScore.ShowEnd Sub學(xué)生信息查詢菜單Private Sub msStuSearch_Click() StuSearch.ShowEnd Sub工具條Click的處理,分別對(duì)應(yīng)調(diào)用菜單中的處理過(guò)程Private Sub Toolbar1_Butt
11、onClick(ByVal Button As MSComctlLib.Button)學(xué)生信息查詢圖標(biāo)If Button.Index = 6 Then msStuSearch_Click End If 學(xué)生信息修改圖標(biāo) If Button.Index = 7 Then msStuInfo_Click End If 學(xué)生成績(jī)修改圖標(biāo) If Button.Index = 8 Then msStuScore_Click End If 退出系統(tǒng)圖標(biāo) If Button.Index = 3 Then msQuitSys_Click End IfEnd Sub5. 學(xué)生信息查詢目的與要求:了解使用控件怎么
12、去顯示數(shù)據(jù)庫(kù)中的數(shù)據(jù),同時(shí)了解查詢的基本方法。程序界面:學(xué)生選課表ADODC控件DataGrid控件 圖 5.1主要功能:可以滿足簡(jiǎn)單查詢的需要,什么條件也不輸則分頁(yè)顯示所有記錄,可以輸入條件進(jìn)行簡(jiǎn)單的模糊查詢,各條件之間為與的關(guān)系,在查詢的結(jié)果中移動(dòng)記錄指針可以查看這個(gè)學(xué)生的具體選課信息創(chuàng)建過(guò)程:(1) 在窗體上放入兩個(gè)學(xué)生信息查詢的ADODC和學(xué)生選課信息的ADODC、創(chuàng)建兩個(gè)學(xué)生信息顯示的DataGrid和學(xué)生選課信息顯示的DataGrid,并分別起名為StuADO,StuKCADO, StuDG,StuKCDG。放入學(xué)號(hào)Edit、姓名Edit和專業(yè)下拉列表框,為了美觀StuKCADO隱
13、藏在StuKCDG這個(gè)后面。(2) 設(shè)置StuADO的ConnectionString屬性為Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=XSCJ;Data Source=microsof-cee903dcr(3) 設(shè)置StuADO的RecordSource屬性為select * from XS,CXB where XS.XB=CXB.XB(4) 設(shè)置StuDG的DataSource屬性為StuADO。(5) 設(shè)置StuKCADO的Conne
14、ctionString屬性為Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=XSCJ;Data Source=microsof-cee903dcr(6) 設(shè)置StuKCADO的RecordSource屬性為select * from XS,KC,XS_KCwhere XS.XH=XS_KC.XH and KC.KCH=XS_KC.KCH(7) 設(shè)置StuKCDG的DataSource屬性為StuKCADO。實(shí)現(xiàn)過(guò)程:直接打開(kāi)時(shí)由于控件屬性的設(shè)置
15、,所以顯示所有記錄,當(dāng)輸入查詢條件時(shí)點(diǎn)擊查詢按鈕則調(diào)用MakeSqlStr函數(shù)產(chǎn)生查詢字符串,然后重新設(shè)置控件的屬性,打開(kāi)控件顯示查詢結(jié)果集。當(dāng)專業(yè)改變時(shí)調(diào)用StuZY_Click函數(shù)來(lái)分別顯示所選的專業(yè)學(xué)生記錄,當(dāng)查詢結(jié)果學(xué)生信息記錄集中移動(dòng)記錄指針時(shí),可以在下面的選課表中看到學(xué)生選課的信息。 主要代碼:根據(jù)學(xué)號(hào)、姓名的輸入信息和專業(yè)的選擇生成模糊查詢的SQL字符串Dim SqlStr As String 保存查詢字符串的Public Sub MakeSqlStr()產(chǎn)生查詢字符串的SqlStr = ""If Trim(StuXH) <> "&quo
16、t; Then SqlStr = "and XH like '%" + Trim(StuXH.Text) + "%'"End IfIf Trim(StuXM) <> "" Then SqlStr = SqlStr + " and XM like '%" + Trim(StuXM.Text) + "%'"End IfIf Trim(StuZY) <> "所有專業(yè)" Then SqlStr = SqlStr + "
17、 and ZY = '" + Trim(StuZY.Text) + "'"End IfEnd Sub“專業(yè)”列表Click事件處理,顯示選擇當(dāng)前專業(yè),并且符合學(xué)號(hào)、姓名查詢條件的學(xué)生的信息Private Sub StuZY_Click()當(dāng)專業(yè)改變時(shí)從新從數(shù)據(jù)庫(kù)中提取數(shù)據(jù)MakeSqlStrStuADO.RecordSource = "select * from XS,CXB where XS.XB=CXB.XB " _& SqlStr + " and ZY = '" + Trim(StuZY
18、.Text) + "'"StuADO.RefreshEnd Sub“查詢”Click事件處理,用生成的模糊查詢的SQL字符串,來(lái)刷新StuADO,并顯示到關(guān)聯(lián)的DataGrid中Private Sub StuSch_Click()點(diǎn)擊查詢按鈕從數(shù)據(jù)庫(kù)中提取數(shù)據(jù)MakeSqlStrStuADO.RecordSource = "select * from XS,CXB where XS.XB=CXB.XB " _& SqlStrStuADO.RefreshEnd Sub學(xué)生信息顯示的DataGrid的Click事件處理,以當(dāng)前學(xué)生信息的學(xué)號(hào)作
19、為查詢條件,從XS_KC表中查找當(dāng)前學(xué)生的選課記錄,并顯示到學(xué)生課程顯示的StuKCDG中Private Sub StuDG_Click()單擊DataGrid中學(xué)生記錄在下面顯示學(xué)生課程成績(jī)StuKCADO.RecordSource = "select * from XS,KC,XS_KC" _ & " Where XS.XH = XS_KC.XH And KC.KCH = XS_KC.KCH" _ & " and XS.XH='" + StuADO.Recordset("XH") + &
20、quot;'"StuKCADO.RefreshEnd Sub注:為了方便控件顯示學(xué)生性別,這里建立了一個(gè)表CXB(XB bit,XBM varchar(4))存放數(shù)據(jù)1,男;0,女,這樣把要顯示的表與其連接便可以顯示中文的性別,如有類似情況可參照此方法。6. 學(xué)生信息修改目的與要求:了解對(duì)數(shù)據(jù)庫(kù)操作的基本方法(增、刪、改)。程序界面:圖 6.1主要功能:用戶可以點(diǎn)擊下面的表格,用戶資料便反映到上面的控件中去,這時(shí)可以修改控件中的信息,點(diǎn)擊更新實(shí)現(xiàn)修改。如輸入一個(gè)新的學(xué)號(hào)點(diǎn)擊更新實(shí)現(xiàn)記錄的添加當(dāng)選中當(dāng)前記錄點(diǎn)刪除時(shí)則可以刪除此學(xué)生記錄,雙擊照片可以選擇學(xué)生照片,用于更新學(xué)生照片
21、信息。創(chuàng)建過(guò)程:(1)在窗體上放入ADODC、DataGrid并起名為StuADO, StuDG。(2)設(shè)置StuADO的ConnectionString屬性為Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=XSCJ;Data Source=microsof-cee903dcr(3) 置StuADO的RecordSource屬性為select * from XS,CXB where XS.XB=CXB.XB(4) 置StuDG的DataSour
22、ce屬性為StuADO。(5) 在窗體上放入Image控件并起名為StuPic,用來(lái)顯示學(xué)生照片,選擇Image控件的DataSource屬性為StuADO,設(shè)置DataField屬性為ZP,這就完成了Image控件和數(shù)據(jù)庫(kù)的綁定,記錄集移動(dòng)時(shí)Image里面會(huì)顯示當(dāng)前學(xué)生的照片。(6) 并在窗體上放入如圖所需控件。實(shí)現(xiàn)過(guò)程:當(dāng)點(diǎn)擊DataGrid中的記錄時(shí)記錄集游標(biāo)也跟著移動(dòng),在StuADO_MoveComplete事件中取出本條記錄顯示在上面的控件中,我們可以在控件中修改學(xué)生信息,雙擊選擇學(xué)生照片,按更新調(diào)用StuUpd_Click更新到數(shù)據(jù)庫(kù)中,當(dāng)輸入新的學(xué)生記錄時(shí)按更新調(diào)用StuUpd_
23、Click添加到數(shù)據(jù)庫(kù)中,也可以按刪除調(diào)用StuDel_Click函數(shù)刪除此記錄,系統(tǒng)會(huì)調(diào)用CheckXs觸發(fā)器來(lái)保持?jǐn)?shù)據(jù)的參照完整性。主要代碼:General中定義的全局變量Private FileName As StringPrivate SqlCon As New ADODB.ConnectionPrivate SqlRes As New ADODB.RecordsetPrivate SqlCmd As New ADODB.CommandForm 加載時(shí)打開(kāi)數(shù)據(jù)庫(kù)連接Private Sub Form_Load() SqlCon.Provider = "SQLOLEDB"
24、; SqlCon.Open "Server=microsof-cee903dcr;DataBase=XSCJ;UID=wmx;PWD=1234;"End SubForm 卸載時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接Private Sub Form_Unload(Cancel As Integer) SqlCon.CloseEnd Sub學(xué)生信息記錄集記錄指針移動(dòng)完成事件,當(dāng)點(diǎn)擊StuADO控件記錄移動(dòng)圖標(biāo)時(shí)產(chǎn)生,在這個(gè)過(guò)程中取出當(dāng)前記錄中的學(xué)生信息,更新到學(xué)號(hào)、姓名等顯示控件中去,實(shí)現(xiàn)顯示和StuADO控件記錄移動(dòng)連動(dòng)Private Sub StuADO_MoveComplete(ByVal ad
25、Reason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) If Not pRecordset.EOF And Not pRecordset.BOF Then StuXH.Text = pRecordset("XH") StuXM.Text = pRecordset("XM") StuCSSJ.Text = pRecordset("CSSJ
26、") StuZY.Text = pRecordset("ZY") StuZXF.Text = pRecordset("ZXF") StuBZ.Text = CStr(pRecordset("BZ") & "") If pRecordset("XB") = 0 Then StuXBF.Value = True Else StuXBM.Value = True End If End IfEnd Sub“刪除”Click事件處理,從StuADO記錄集中取出當(dāng)前記錄的學(xué)號(hào),然后通過(guò)co
27、mmad對(duì)象執(zhí)行delete語(yǔ)句來(lái)刪除當(dāng)前的學(xué)生記錄,delete語(yǔ)句的調(diào)用會(huì)引起CheckXs觸發(fā)器的動(dòng)作Private Sub StuDel_Click(Index As Integer) Ret = MsgBox("是否要?jiǎng)h除" + StuADO.Recordset("XH") + "號(hào)學(xué)生的記錄!", vbYesNo, "提示") If Ret = vbYes Then SqlCmd.ActiveConnection = SqlCon SqlCmd.CommandText = "delete fr
28、om XS where XH='" + StuADO.Recordset("XH") + "'" SqlCmd.Execute StuADO.RecordSource = "select * from XS,CXB where XS.XB=CXB.XB" StuADO.Refresh End IfEnd Sub“照片”Double Click事件的處理,打開(kāi)對(duì)話框,給用戶選擇照片,并顯示在StuPic控件中,同時(shí)記錄下選擇的文件名和路徑到全局FileName變量中,給后面的更新學(xué)生信息使用Private Su
29、b StuPic_DblClick()'顯示打開(kāi)文件的公用對(duì)話框,選擇需要加入數(shù)據(jù)庫(kù)的圖片CDlg.Filter = "位圖(*.bmp)|*.bmp|圖像(*.jpg)|*.jpg"CDlg.ShowOpenFileName = CDlg.FileNameStuPic.Picture = LoadPicture(FileName) '預(yù)覽圖片End Sub讀取照片數(shù)據(jù)的函數(shù),根據(jù)輸入的照片的文件名,打開(kāi)文件讀入照片數(shù)據(jù)到數(shù)組中,然后通過(guò)AppendChunk函數(shù)把照片數(shù)據(jù)寫(xiě)入到Field對(duì)象中去Private Sub PicSaveToDB(ByRef F
30、ld As ADODB.Field, DiskFile As String)保存到圖片到ADODB.Field對(duì)象中去Const BLOCKSIZE = 4096Dim byteData() As Byte '定義數(shù)據(jù)塊數(shù)組Dim NumBlocks As Long '定義數(shù)據(jù)塊個(gè)數(shù)Dim FileLength As Long '標(biāo)識(shí)文件長(zhǎng)度Dim LeftOver As Long '定義剩余字節(jié)長(zhǎng)度Dim SourceFile As Long '定義自由文件號(hào)Dim i As Long '定義循環(huán)變量SourceFile = FreeFile
31、'提供一個(gè)尚未使用的文件號(hào)Open DiskFile For Binary Access Read As SourceFile '打開(kāi)文件FileLength = LOF(SourceFile) '得到文件長(zhǎng)度If FileLength = 0 Then '判斷文件是否存在 Close SourceFile MsgBox DiskFile & "無(wú) 內(nèi) 容 或 不 存 在 !"Else NumBlocks = FileLength BLOCKSIZE '得到數(shù)據(jù)塊的個(gè)數(shù) LeftOver = FileLength Mod BL
32、OCKSIZE '得到剩余字節(jié)數(shù) Fld.Value = Null ReDim byteData(BLOCKSIZE) '重新定義數(shù)據(jù)塊的大小 For i = 1 To NumBlocks Get SourceFile, , byteData() ' 讀到內(nèi)存塊中 Fld.AppendChunk byteData() '寫(xiě)入FLD Next i ReDim byteData(LeftOver) '重新定義數(shù)據(jù)塊的大小 Get SourceFile, , byteData() '讀到內(nèi)存塊中 Fld.AppendChunk byteData() &
33、#39;寫(xiě)入FLD Close SourceFile '關(guān)閉源文件End IfEnd Sub“更新”Click事件處理,先查詢當(dāng)前學(xué)號(hào)的學(xué)生信息,有當(dāng)前學(xué)生的信息則修改相應(yīng)的記錄字段,調(diào)用PicSaveToDB保存選擇的照片到記錄集中的“ZP”字段,更新記錄集到數(shù)據(jù)庫(kù)中去;沒(méi)有則通過(guò)AddNew新增一條記錄,然后修改相應(yīng)的記錄字段,并更新記錄集到數(shù)據(jù)庫(kù)中去,這里在調(diào)用PicSaveToDB前先要判斷FileName中是否選擇了照片,有才保存到數(shù)據(jù)庫(kù)中去Private Sub StuUpd_Click(Index As Integer)'看是否有此學(xué)生記錄,有就修改,沒(méi)則添加Di
34、m SqlStr As StringDim byteData() As ByteDim ADOFld As ADODB.FieldSqlStr = "select * from XS where XH='" + Trim(StuXH.Text) + "'"SqlRes.Open SqlStr, SqlCon, adOpenDynamic, adLockPessimisticIf Not SqlRes.EOF Then'修改 SqlRes("XM") = StuXM.Text If StuXBM.Value =
35、True Then SqlRes("XB") = 1 Else SqlRes("XB") = 0 End If SqlRes("ZY") = StuZY.Text SqlRes("CSSJ") = CDate(StuCSSJ.Text) SqlRes("ZXF") = CInt(StuZXF.Text) SqlRes("BZ") = StuBZ.Text '保存到圖片到ADODB.Field對(duì)象中去 Set ADOFld = SqlRes("ZP"
36、) If FileName <> "" Then Call PicSaveToDB(ADOFld, FileName) End If SqlRes.UpdateElse'添加 SqlRes.AddNew SqlRes("XH") = StuXH.Text SqlRes("XM") = StuXM.Text If StuXBM.Value = True Then SqlRes("XB") = 1 Else SqlRes("XB") = 0 End If SqlRes("
37、;ZY") = StuZY.Text SqlRes("CSSJ") = CDate(StuCSSJ.Text) If Trim(StuZXF.Text) <> "" Then SqlRes("ZXF") = CInt(StuZXF.Text) End If SqlRes("BZ") = StuBZ.Text 保存到圖片到ADODB.Field對(duì)象中去 Set ADOFld = SqlRes("ZP") If FileName <> "" Th
38、en Call PicSaveToDB(ADOFld, FileName) End If SqlRes.UpdateEnd IfFileName = ""SqlRes.CloseStuADO.RecordSource = "select * from XS,CXB where XS.XB=CXB.XB"StuADO.RefreshEnd Sub為了保證數(shù)據(jù)的參照完整性在刪除學(xué)生時(shí)要檢查成就表中此學(xué)生的記錄,有就刪除。此過(guò)程放在觸發(fā)器中完成的CREATE TRIGGER CheckXs ON dbo.XS FOR DELETE ASdelete from
39、XS_KCwhere XH in( select XH from deleted)7. 學(xué)生成績(jī)的錄入目的與要求:了解VB中調(diào)用SQL Server中存儲(chǔ)過(guò)程的基本方法。Parameter參數(shù)對(duì)象的使用,視圖的更新使用,觸發(fā)器的使用。程序界面:圖 7.1主要功能:用戶可以選擇專業(yè),這是會(huì)列出本專業(yè)所有的學(xué)生學(xué)號(hào),選擇課程,這時(shí)下面的DataGrid中會(huì)顯示相應(yīng)課程的學(xué)生的成績(jī)和學(xué)分,可以在DataGrid中輸入學(xué)生成績(jī),上面修改單個(gè)學(xué)生成績(jī),學(xué)分不允許修改,輸入成績(jī),觸發(fā)器會(huì)自動(dòng)添加相應(yīng)的學(xué)分。創(chuàng)建過(guò)程: (1) 參照上面學(xué)生信息修改窗口界面,姓名和學(xué)分Enable = FALSE。 (2)
40、置StuADO的RecordSource屬性為select * from XS_KC_CJ",XS_KC_CJ為視圖名稱 (3) DataGrid窗口屬性中AllowUpdate = Enable圖7.2,這樣DataGrid修改才允許更新到視圖中去,從而更新到數(shù)據(jù)庫(kù)相應(yīng)的表中。添加四列,分別選擇DataField為XH、XM、CJ、XF,如圖7.3。圖 7.2圖 7.3實(shí)現(xiàn)過(guò)程:在Form_Load事件中編寫(xiě)專業(yè)、課程列表項(xiàng)的添加,各專業(yè)通過(guò)調(diào)用GetStuZY存儲(chǔ)過(guò)程來(lái)得到,同時(shí)檢索試圖中這個(gè)專業(yè)、選擇這門(mén)課程的學(xué)生,顯示在下面的DataGrid中,輸入成績(jī),觸發(fā)器會(huì)自動(dòng)添入學(xué)分
41、,可以選擇學(xué)號(hào),添加一個(gè)學(xué)生的某門(mén)課程的成績(jī)和選課到學(xué)生選課表中去,刪除XS_KC表中刪除此學(xué)生此門(mén)課程的成績(jī)記錄。主要代碼:(1) SQL Server中定義的存儲(chǔ)過(guò)程。創(chuàng)建GetStuZY的存儲(chǔ)過(guò)程,從學(xué)生表中查詢專業(yè)信息CREATE PROCEDURE GetStuZY ASselect DISTINCT ZY from XS 加DISTINCT,以返回不重復(fù)的專業(yè)GO創(chuàng)建顯示學(xué)生成績(jī)ShowScore存儲(chǔ)過(guò)程,查看此學(xué)生的這門(mén)課成績(jī)是否存在,在返回成績(jī)記錄,否則返回學(xué)號(hào)、姓名、專業(yè)、課程名信息CREATE PROCEDURE ShowScore (XH varchar(6),KCM v
42、archar(16) ASdeclare KCH varchar(3),count intbeginselect KCH=KCH from KC where KCM=KCMselect count =count( *) from XS_KC where XH=XH and KCH=KCHif count=0select XH,XM,ZY,KCM = KCM from XS where XH=XHelseselect XS.XH,XS.XM,CJ,XS_KC.XF,XS.ZY,KCM from XS,KC,XS_KC where XS. XH=XH and KC.KCH=KCH and XS.X
43、H=XS_KC.XH and KC.KCH=XS_KC.KCHendGO創(chuàng)建插入學(xué)生成績(jī)的AddStuScore存儲(chǔ)過(guò)程,學(xué)生此門(mén)課程成績(jī)記錄如存在則修改成績(jī),如不存在則添加這條記錄CREATE PROCEDURE AddStuScore (XH varchar(6),KCM varchar(16),CJ int,XF int) ASbegindeclare KCH varchar(3)select KCH=KCH from KC where KCM=KCMselect * from XS_KC where XH=XH and KCH=KCHif RowCount =1update XS_KC
44、 set CJ=CJ,XF=XF where XH=XH and KCH=KCHelseinsert into XS_KC values(XH,KCH,CJ,XF)endGO創(chuàng)建XS_KC_CJ視圖,用來(lái)在DataGrid中顯示學(xué)生、課程、成績(jī)的信息CREATE VIEW dbo.XS_KC_CJASSELECT dbo.XS_KC.XH, dbo.KC.KCM, dbo.XS_KC.CJ, FROM dbo.KC INNER JOIN dbo.XS_KC ON dbo.KC.KCH = dbo.XS_KC.KCH INNER JOINGO創(chuàng)建XS_KC的INSERT,UPDATE觸發(fā)器,當(dāng)添
45、加和修改成績(jī)后,根據(jù)當(dāng)前的成績(jī)自動(dòng)為該學(xué)生該課程增加學(xué)分,當(dāng)成績(jī)小于60分時(shí),學(xué)分為0;當(dāng)大于等于60分時(shí),從該門(mén)課程表中取出當(dāng)前課程的學(xué)分來(lái)更新當(dāng)前學(xué)生在XS_KC表中這門(mén)課程的學(xué)分CREATE TRIGGER CHECKXF ON XS_KC INSERT,UPDATEAS BEGINSET NOCOUNT ON;update XS_KC set XF = 0 where CJ < 60update XS_KC set XF = (select XF from KC where KCH = XS_KC.KCH) where CJ >= 60ENDGO(2) VB中的主要代碼。G
46、eneral中定義的全局變量Private SqlCon As New ADODB.ConnectionPrivate SqlRes As ADODB.RecordsetPrivate SqlCmd As New ADODB.CommandForm加載時(shí)打開(kāi)數(shù)據(jù)庫(kù)連接,并且通過(guò)執(zhí)行select語(yǔ)句從數(shù)據(jù)庫(kù)中提取課程名添加到課程下拉列表中去,執(zhí)行GetStuZy存儲(chǔ)過(guò)程,把返回的專業(yè)添加到專業(yè)下拉列表中去,在DataGrid中顯示當(dāng)前專業(yè),當(dāng)前課程的的學(xué)生、成績(jī)信息,方便修改Private Sub Form_Load() SqlCon.Provider = "SQLOLEDB"
47、; SqlCon.Open "Server=microsof-cee903dcr;DataBase=XSCJ;UID=wmx;PWD=1234;" SqlCmd.ActiveConnection = SqlCon '添加課程 SqlCmd.CommandText = "Select * from KC" SqlCmd.CommandType = adCmdText Set SqlRes = SqlCmd.Execute StuKCM.Text = SqlRes("KCM") While Not SqlRes.EOF StuKC
48、M.AddItem (Trim(SqlRes("KCM") SqlRes.MoveNext Wend '添加專業(yè) SqlCmd.CommandText = "GetStuZy" SqlCmd.CommandType = adCmdStoredProc Set SqlRes = SqlCmd.Execute StuZY.Text = SqlRes("ZY") While Not SqlRes.EOF StuZY.AddItem (SqlRes("ZY") SqlRes.MoveNext Wend StuZY_
49、Click StuXH_Click StuADO.RecordSource = "select XH,XM,KCM,CJ,XH,ZY,XF from XS_KC_CJ where KCM = '" + Trim(StuKCM.Text) + "' and ZY = '" + Trim(StuZY.Text) + "'" StuADO.RefreshEnd SubForm卸載時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接Private Sub Form_Unload(Cancel As Integer) SqlRes.Close Sq
50、lCon.CloseEnd SubStuADO移動(dòng)記錄完成的時(shí)候,在學(xué)號(hào)、姓名、成績(jī)、學(xué)分等顯示控件中顯示當(dāng)前學(xué)生的當(dāng)前課程的成績(jī)信息Private Sub StuADO_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) If Not pRecordset.EOF And Not pRecordset.BOF Then StuXH.Tex
51、t = pRecordset("XH") StuXM.Text = pRecordset("XM") StuCJ.Text = pRecordset("CJ") StuXF.Text = CStr(pRecordset("XF") & "") End IfEnd Sub“刪除”Click事件處理,調(diào)用Command執(zhí)行delete刪除當(dāng)前學(xué)號(hào),當(dāng)前課程名的成績(jī)記錄Private Sub StuDel_Click() Ret = MsgBox("是否要?jiǎng)h除" + Stu
52、XH.Text + "號(hào)學(xué)生的" + Trim(StuKCM.Text) + "課的成績(jī)記錄!", vbYesNo, "提示") If Ret = vbYes Then SqlCmd.ActiveConnection = SqlCon SqlCmd.CommandText = "delete from XS_KC where XH='" + StuXH.Text + "' and KCH in (select KCH from KC where KCM='" + StuK
53、CM.Text + "')" SqlCmd.CommandType = adCmdText SqlCmd.Execute StuADO.RecordSource = "select XH,XM,KCM,CJ,XH,ZY,XF from XS_KC_CJ where KCM = '" + Trim(StuKCM.Text) + "' and ZY = '" + Trim(StuZY.Text) + "'" StuADO.Refresh End IfEnd Sub“課程” 下拉列
54、表Click事件處理,從視圖中查詢當(dāng)前專業(yè)、當(dāng)前課程的學(xué)生成績(jī)信息,同時(shí)調(diào)用ShowScore在姓名、成績(jī)等Edit中來(lái)顯示當(dāng)前學(xué)生的姓名、成績(jī)等信息Private Sub StuKCM_Click() Dim StXH, StKCM '選者當(dāng)前課程的學(xué)生選課信息 StuADO.RecordSource = "select XH,XM,KCM,CJ,XH,ZY,XF from XS_KC_CJ where KCM = '" + Trim(StuKCM.Text) + "' and ZY = '" + Trim(StuZY.
55、Text) + "'" StuADO.Refresh '沒(méi)有學(xué)生選者該門(mén)課程 If StuADO.Recordset.RecordCount = 0 Then 'if no record then exit sub StuXM.Text = "" StuCJ.Text = "" StuXF.Text = "" Exit Sub End If SqlCmd.CommandText = "ShowScore" SqlCmd.CommandType = adCmdStoredP
56、roc Set StXH = SqlCmd.CreateParameter("XH", adVarChar, adParamInput, 6) SqlCmd.Parameters.Append (StXH) Set StKCM = SqlCmd.CreateParameter("KCM", adVarChar, adParamInput, 16) SqlCmd.Parameters.Append (StKCM) SqlCmd("XH") = StuXH.Text SqlCmd("KCM") = StuKCM.Tex
57、t Set SqlRes = SqlCmd.Execute StuXH.Text = SqlRes("XH") If Not SqlRes.EOF Then If SqlRes.Fields.Count = 4 Then StuXM.Text = SqlRes("XM") StuCJ.Text = SqlRes("CJ") StuXF.Text = CStr(SqlRes("XF") & "") End If End If SqlCmd.Parameters.Delete ("
58、XH") SqlCmd.Parameters.Delete ("KCM") End Sub“更新” Click事件處理,通過(guò)調(diào)用AddStuScore,來(lái)添加當(dāng)前課程,當(dāng)前學(xué)生的成績(jī)信息Private Sub StuUpd_Click() Dim StXH, StKCM, StCJ, StXF If Trim(StuCJ.Text) = "" Then MsgBox "輸入完整的信息!", , "提示" Exit Sub End If SqlCmd.CommandText = "AddStuScore&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第1單元 古代亞非文明(高頻非選擇題25題)(原卷版)
- 《波蘭歪屋設(shè)計(jì)》課件
- 《證券市場(chǎng)概述周》課件
- 玩具設(shè)計(jì)美工工作總結(jié)
- 2023-2024年項(xiàng)目管理人員安全培訓(xùn)考試題帶答案(黃金題型)
- 關(guān)于認(rèn)識(shí)實(shí)習(xí)報(bào)告匯編六篇
- 《系統(tǒng)安全評(píng)價(jià)概述》課件
- 《婦產(chǎn)科學(xué)緒論》課件
- 《監(jiān)理工作程序》課件
- 《應(yīng)用開(kāi)發(fā)和管理》課件
- 青島市2022-2023學(xué)年七年級(jí)上學(xué)期期末道德與法治試題
- 高空作業(yè)安全免責(zé)協(xié)議書(shū)范本
- 石油化學(xué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年中國(guó)石油大學(xué)(華東)
- 手術(shù)后如何防止排尿困難
- 特種設(shè)備“日管控、周排查、月調(diào)度”表格
- 重點(diǎn)關(guān)愛(ài)學(xué)生幫扶活動(dòng)記錄表
- 2021年10月自考00850廣告設(shè)計(jì)基礎(chǔ)試題及答案含解析
- 結(jié)構(gòu)化面試表格
- 地?zé)崮苜Y源的潛力及在能源領(lǐng)域中的應(yīng)用前景
- 2023版:美國(guó)眼科學(xué)會(huì)青光眼治療指南(全文)
- 家長(zhǎng)會(huì)課件:小學(xué)寒假家長(zhǎng)會(huì)課件
評(píng)論
0/150
提交評(píng)論