學(xué)生晚歸與考勤管理信息系統(tǒng)的開發(fā)_第1頁(yè)
學(xué)生晚歸與考勤管理信息系統(tǒng)的開發(fā)_第2頁(yè)
學(xué)生晚歸與考勤管理信息系統(tǒng)的開發(fā)_第3頁(yè)
學(xué)生晚歸與考勤管理信息系統(tǒng)的開發(fā)_第4頁(yè)
學(xué)生晚歸與考勤管理信息系統(tǒng)的開發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、學(xué)生晚歸與考勤管理信息系統(tǒng)開發(fā)系統(tǒng)分析與設(shè)計(jì)3.1 系統(tǒng)預(yù)期用戶本系統(tǒng)的預(yù)期用戶是任何想了解學(xué)生在校的考勤情況的用戶。3.2 功能說明學(xué)生晚歸與考勤管理系統(tǒng)是目前機(jī)電職業(yè)技術(shù)校園網(wǎng)在線系統(tǒng)之一。本軟件將各個(gè)學(xué)院各個(gè)部門聯(lián)系到一起,便于學(xué)生晚歸、考勤的管理,同時(shí),還可以讓學(xué)生通過查詢自己的晚歸與考勤記錄,了解到自己的紀(jì)律情況。在線圖書銷售系統(tǒng)要實(shí)現(xiàn)的功能模塊主要有:該系統(tǒng)分為晚歸情況管理、考勤情況管理與后臺(tái)管理三大功能模塊。 系統(tǒng)功能模塊的劃分圖1 系統(tǒng)功能架構(gòu)圖(2) 基本處理流程下圖是系統(tǒng)基本處理流程圖。圖2 系統(tǒng)基本處理流程3.3 數(shù)據(jù)庫(kù)設(shè)計(jì)本系統(tǒng)采用SQL Server2005作為后臺(tái)數(shù)

2、據(jù)庫(kù)。根據(jù)以上功能,新建一名為Attendance的數(shù)據(jù)庫(kù),其中共包括9個(gè)數(shù)據(jù)表,分別是部門表(department):專業(yè)信息表(special):班級(jí)信息表(class):學(xué)生信息表(stuInfo):區(qū)/門信息表(region):晚歸情況表(late):考勤情況表(attendance):考勤類型表(attendtype):用戶信息表(admin):各個(gè)數(shù)據(jù)表的關(guān)系(主要是主鍵與外鍵的約束關(guān)系)如下圖所示:數(shù)據(jù)庫(kù)創(chuàng)建腳本參考文件:“學(xué)生晚歸與考勤管理信息系統(tǒng)數(shù)據(jù)庫(kù)建庫(kù)腳步.sql”3.4 數(shù)據(jù)庫(kù)連接1、建議將數(shù)據(jù)庫(kù)拷入的App_Data目錄,然后將數(shù)據(jù)庫(kù)連接字符串寫入到Web.confi

3、g,參考代碼如下:<appSettings><addkey="ConnectionStr"value="Server=.;AttachDbFilename=|DataDirectory|Attendance.mdf;Integrated Security=True" /></appSettings>測(cè)試數(shù)據(jù)庫(kù)連接是否正常using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;u

4、sing System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;publicpartialclassDBConnTest : System.Web.UI.Pageprotectedvoid Page_Load(object sender, EventArgs e) string constr = Conf

5、igurationManager.AppSettings"ConnectionStr"SqlConnection conn = newSqlConnection(constr); conn.Open();/打開數(shù)據(jù)庫(kù)連接 Response.Write("數(shù)據(jù)庫(kù)連接成功!"); conn.Close();/關(guān)閉數(shù)據(jù)庫(kù)連接 Response.Write("數(shù)據(jù)庫(kù)關(guān)閉成功!"); 經(jīng)驗(yàn)證,Attendance.mdf數(shù)據(jù)庫(kù)連接正常2、將常用數(shù)據(jù)庫(kù)操作代碼寫入公共類DB中,其中包含以下各自定義方法,參考代碼如下:using System;us

6、ing System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;/<summary>/ DB類為一個(gè)專門進(jìn)行數(shù)據(jù)庫(kù)操作的類/ 包括連接數(shù)據(jù)庫(kù),更新數(shù)據(jù)庫(kù),查詢數(shù)據(jù)庫(kù)這些操作

7、/</summary>publicclassDB/<summary>/ DB()為DB類的構(gòu)造方法/</summary>public DB()/<summary>/ 定義返回?cái)?shù)據(jù)庫(kù)連接對(duì)象SqlConnection方法/</summary>/<returns>/ SqlConnection對(duì)象/</returns>publicSqlConnection getCon() String strCon = ConfigurationManager.AppSettings"ConnectionStr&quo

8、t;/從配置文件web.cofig里面讀取數(shù)據(jù)庫(kù)的連接字符串returnnewSqlConnection(strCon);/返回?cái)?shù)據(jù)庫(kù)連接對(duì)象 /<summary>/ 定義更新數(shù)據(jù)庫(kù)的方法/</summary>/<param name="cmdStr">/ 參數(shù)cmdStr為要執(zhí)行更新數(shù)據(jù)庫(kù)的SQL語(yǔ)句,包含增加,修改,刪除這三種SQL語(yǔ)句/</param>/<returns>/ 數(shù)據(jù)庫(kù)更新成功則返回1,更新失敗則返回0/</returns>publicint sqlEx(string cmdStr)

9、SqlConnection con = getCon(); con.Open();/打開數(shù)據(jù)庫(kù)連接SqlCommand cmd = newSqlCommand(cmdStr,con);/創(chuàng)建執(zhí)行SQL語(yǔ)句的命令對(duì)象SqlCommandtry cmd.ExecuteNonQuery();return 1;/成功返回1 catch return 0;/失敗返回0 finally con.Dispose();/釋放資源 /<summary>/ 定義查詢數(shù)據(jù)庫(kù)信息的方法/</summary>/<param name="cmdStr">/ 參數(shù)cm

10、dStr為執(zhí)行查詢時(shí)的書寫的SQL語(yǔ)句/</param>/<returns></returns>publicDataTable reDt(string cmdStr) SqlConnection con = getCon();/連接數(shù)據(jù)庫(kù) con.Open();SqlDataAdapter da = newSqlDataAdapter(cmdStr,con);/創(chuàng)建數(shù)據(jù)適配器對(duì)象DataSet ds = newDataSet();/創(chuàng)建數(shù)據(jù)集對(duì)象 da.Fill(ds);/將保存在數(shù)據(jù)適配器對(duì)象中的數(shù)據(jù)填充到數(shù)據(jù)集對(duì)象中return (ds.Tables0)

11、;/返回?cái)?shù)據(jù)集對(duì)象中有記錄的那個(gè)表 /<summary>/ 定義閱讀數(shù)據(jù)的方法/</summary>/<param name="str">/ 參數(shù)str為執(zhí)行查詢操作時(shí)的SQL語(yǔ)句/</param>/<returns>/ 返回一個(gè)數(shù)據(jù)閱讀對(duì)象/</returns>publicSqlDataReader reDr(string str) SqlConnection con = getCon(); con.Open();SqlCommand cmd = newSqlCommand(str,con);SqlD

12、ataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);/通過調(diào)用Command對(duì)象的ExecuteReader()方法創(chuàng)建DataReader對(duì)象,CommandBehavior.CloseConnection表示?return dr; 功能模塊的實(shí)現(xiàn)用戶注冊(cè)功能的實(shí)現(xiàn):實(shí)現(xiàn)邏輯:用戶注冊(cè)信息寫入到admin表,此注冊(cè)功能是專門針對(duì)本校的學(xué)生開發(fā)注冊(cè)的,如果不是本校的學(xué)生,是沒有注冊(cè)的權(quán)限的,所有注冊(cè)時(shí)要根據(jù)學(xué)生輸入的真實(shí)和學(xué)號(hào)進(jìn)行注冊(cè),如果找不到對(duì)應(yīng)的學(xué)生的名字,就不允許用戶進(jìn)行注冊(cè),如果用戶已經(jīng)注冊(cè)過一次了,就直

13、接告訴用戶已經(jīng)注冊(cè)過了,無需再次注冊(cè)了,并自動(dòng)為用戶跳轉(zhuǎn)到登錄頁(yè)面,如果用戶是第一次注冊(cè),就把用戶的注冊(cè)信息寫入到admin表中,注冊(cè)成功后也跳轉(zhuǎn)到登錄頁(yè)面讓用戶進(jìn)行登錄。用戶注冊(cè)頁(yè)面Register.aspx如下圖所示:學(xué)生進(jìn)入此頁(yè)面進(jìn)行注冊(cè),正確填寫了學(xué)生和學(xué)生學(xué)號(hào)以與驗(yàn)證碼了以后,點(diǎn)擊提交按鈕完成注冊(cè),而在后臺(tái),要進(jìn)行數(shù)據(jù)的合法性判斷,首先進(jìn)行的是驗(yàn)證碼的正確性判斷,把用戶輸入的驗(yàn)證碼和保存的Session對(duì)象中的驗(yàn)證碼取出來作比較,如果驗(yàn)證碼輸入正確才繼續(xù)執(zhí)行檢查該注冊(cè)用戶是否是本校的學(xué)生,以與該用戶是否已經(jīng)被注冊(cè)了,后臺(tái)的處理代碼如下所示:Register.aspx.csusing

14、System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;publicpartialclassstudent_

15、Register : System.Web.UI.PageDB db = newDB();protectedvoid Page_Load(object sender, EventArgs e) this.ImageButton1.ImageUrl = "image.aspx"/image.aspx是一個(gè)顯示驗(yàn)證碼的Web頁(yè)面 protectedvoid btn_submit_Click(object sender, EventArgs e) string code = txtCheckCode.Text.Trim();if (code != (string)Session&

16、quot;image") Response.Write("<Script>alert('驗(yàn)證碼輸入錯(cuò)誤,請(qǐng)檢查后重新輸入!')</Script>");/ Response.Redirect("Register.aspx");如果使用這種跳轉(zhuǎn)方式,那么上面的javascript是無法運(yùn)行的,因?yàn)檫€沒有來得與運(yùn)行就頁(yè)面就已經(jīng)跳轉(zhuǎn)了 Response.Write("<script>window.location.href='Register.aspx'</script

17、>"); else string stu_Name = txtUserName.Text.Trim();string stu_Id = txtstuID.Text.Trim();string sql2 = "select stu_name from stuInfo where stu_name='"+stu_Name+"'"/使用這條SQL語(yǔ)句檢查要注冊(cè)的人是否是本校的學(xué)生,如果是,才允許其注冊(cè),如果不是,就不允許其注冊(cè)SqlDataReader dr = db.reDr(sql2);if (dr.Read() dr.Cl

18、ose();/關(guān)閉SqlDataReaderstring sq = "select * from admin where login_name='" + stu_Name + "'"/如果已經(jīng)證實(shí)是本校的學(xué)生,就再判斷該學(xué)生是否已經(jīng)注冊(cè)過了 dr=db.reDr(sq);/再次使用SqlDataReaderif (dr.Read() Response.Write("<Script>alert('你已經(jīng)注冊(cè)過了,不需要再次注冊(cè)了!直接為您跳轉(zhuǎn)到登錄頁(yè)面進(jìn)行登錄')</Script>"

19、;); Response.Write("<script>window.location.href='logion.aspx'</script>"); else int power = 3;/如果已經(jīng)證實(shí)要注冊(cè)的人是本校的學(xué)生,就直接給該學(xué)生賦予使用權(quán)限string sql = "insert into admin(login_name,login_pwd,admin_power) values('" + stu_Name + "','" + stu_Id + "

20、',"+power+")"/Response.Write(sql);/Response.End();try int flag = db.sqlEx(sql);if (flag > 0) Response.Write("<Script>alert('注冊(cè)成功了!馬上為您跳轉(zhuǎn)到登錄頁(yè)面進(jìn)行登錄')</Script>"); Response.Write("<script>window.location.href='login.aspx'</script&

21、gt;"); else Response.Write("<Script>alert('注冊(cè)失??!')</Script>"); catch (System.Exception ee) Response.Write("<script>alert('"+ee.Message.ToString()+"');</script>"); else Response.Write("<Script>alert('你不是本校的學(xué)生,沒有

22、注冊(cè)的權(quán)限!')</Script>"); txtUserName.Text = "" txtstuID.Text = "" protectedvoid btn_reset_Click(object sender, EventArgs e) txtstuID.Text = "" txtUserName.Text = "" 用戶登錄功能的實(shí)現(xiàn)實(shí)現(xiàn)邏輯:用戶進(jìn)入登錄頁(yè)面后,輸入相關(guān)的用戶名和密碼進(jìn)行登錄,如果用戶名和密碼都正確了,表示該用戶是合法用戶,就允許其進(jìn)入系統(tǒng)的主頁(yè)進(jìn)行相關(guān)的系統(tǒng)操作

23、,如果用戶名和密碼的驗(yàn)證不通過,就不允許其進(jìn)入系統(tǒng),用戶輸入用戶名和密碼后,在后臺(tái)的處理過程中首先會(huì)從數(shù)據(jù)庫(kù)Attendance.mdf的admin表取出相應(yīng)的用戶名和用戶輸入的用戶名進(jìn)行匹配,如果用戶名匹配成功了,就把數(shù)據(jù)表中存儲(chǔ)的密碼和用戶輸入的密碼進(jìn)行比對(duì),如果密碼也驗(yàn)證通過了,才允許用戶進(jìn)入系統(tǒng)首頁(yè),用戶名和密碼中任意一項(xiàng)匹配如果不通過,都不允許其登錄。登錄該系統(tǒng)時(shí),有三種不同身份的使用者,分別為管理員,記錄員和學(xué)生,不同的身份就對(duì)應(yīng)著不同的使用權(quán)限。使用權(quán)限的限制根據(jù)不同身份的登錄者生成不同的動(dòng)態(tài)導(dǎo)航,以此到達(dá)限定使用者的權(quán)限的目的。登錄頁(yè)面的設(shè)計(jì)如下:如果登錄的身份是管理員,則顯示

24、如下的導(dǎo)航:如果登錄的身份是記錄員,則顯示如下的導(dǎo)航:如果登錄的身份是學(xué)生,則顯示如下的導(dǎo)航:對(duì)于管理員而言,其擁有的使用權(quán)限是最多的,但沒有晚歸登記和考勤登記的權(quán)限,登記權(quán)限只有記錄員才有,而對(duì)于學(xué)生而言,只有查看相關(guān)記錄的權(quán)限,別的權(quán)限都沒有,因此通過這種根據(jù)不同登錄者的身份生成不同的導(dǎo)航就可以限定了登錄者的使用權(quán)限了。這里難就難在了如果根據(jù)登錄者的身份動(dòng)態(tài)生成不同的導(dǎo)航信息。相關(guān)代碼如下:用戶登錄的后臺(tái)代碼:login.aspx.csusing System;using System.Data;using System.Configuration;using System.Collect

25、ions;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;publicpartialclasslogin : System.Web.UI.PageDB db = newDB();protectedvoid Page_Load(object sender,

26、 EventArgs e) ImageButton1.ImageUrl = "image.aspx"/讓頁(yè)面加載時(shí)就顯示驗(yàn)證碼圖片 protectedvoid btnRegister_Click(object sender, EventArgs e) Response.Redirect("Register.aspx");/點(diǎn)擊注冊(cè)按鈕后,直接跳轉(zhuǎn)到注冊(cè)頁(yè)面,這里需要注意一個(gè)小問題,由于文本框已經(jīng)使用了驗(yàn)證控件,因此要想讓按鈕的觸發(fā)事件不觸發(fā)驗(yàn)證控件時(shí),把按鈕的CausesValidation屬性設(shè)置為false即可 protectedvoid btnLo

27、gin_Click(object sender, EventArgs e) string code = txtCheckCode.Text.Trim();/獲取輸入的驗(yàn)證碼string username = txtUserName.Text.Trim();/獲取輸入的用戶名string password = txtPassword.Text.Trim();/獲取輸入的密碼if (code != (string)Session"image")/先進(jìn)行驗(yàn)證碼的判斷,驗(yàn)證碼輸入正確后在執(zhí)行其他的操作 Response.Write("<script>alert

28、('驗(yàn)證碼輸入有誤!')</script>"); Response.Write("<script>window.location.href='login.aspx'</script>"); else string sql = "select login_name,login_pwd,admin_power from admin where login_name='"+username+"'"SqlDataReader dr = db.reDr

29、(sql);if (dr.Read() if (string)dr"login_pwd" = password) Response.Write("<script>alert('用戶名和密碼正確!登錄成功!')</script>"); Response.Write("<script>window.location.href='Index.aspx'</script>"); Session"Power" = dr"admin_po

30、wer"/使用Session存儲(chǔ)用戶的使用權(quán)限 Session"username" = username;/存儲(chǔ)用戶名 else Response.Write("<script>alert('密碼錯(cuò)誤!')</script>"); Response.Write("<script>window.location.href='login.aspx'</script>"); else Response.Write("<script>

31、;alert('該用戶不存在,請(qǐng)先去注冊(cè)一個(gè)后再進(jìn)行登錄操作,即將為你跳轉(zhuǎn)到注冊(cè)頁(yè)面!')</script>"); Response.Write("<script>window.location.href='Register.aspx'</script>"); 在用戶進(jìn)行登錄的時(shí)候,使用Session對(duì)象存儲(chǔ)用戶名,并且根據(jù)用戶名從數(shù)據(jù)庫(kù)中取出該用戶的使用權(quán)限,也使用Session對(duì)象保存用戶的使用權(quán)限,登錄成功后,在系統(tǒng)的主頁(yè)的后臺(tái)處理代碼中取出保存在Session對(duì)象中的用戶名的相關(guān)的用戶權(quán)限

32、,然后根據(jù)用戶權(quán)限來動(dòng)態(tài)生成導(dǎo)航,相關(guān)的代碼如下:系統(tǒng)主頁(yè)的后臺(tái)處理代碼:index.aspx.csusing System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControl

33、s;publicpartialclassIndex : System.Web.UI.Pageprotectedvoid Page_Load(object sender, EventArgs e) if (Session"username" != null)/這里使用Session對(duì)象對(duì)用戶是否已經(jīng)進(jìn)行登錄進(jìn)行判斷,如果Session中的容不為空,則表示用戶已經(jīng)登錄 string userStr = (string)Session"username"/取出保存在Session對(duì)象中的用戶名int power = int.Parse(Session"

34、;Power".ToString();/取出保存在Session對(duì)象中的用戶使用權(quán)限標(biāo)識(shí)string nav = ""if (power = 1)/根據(jù)登錄者的身份動(dòng)態(tài)變化導(dǎo)航的顯示,以此限定不同身份的登錄者的使用權(quán)限 nav = "<td><a href='latecheck.aspx'target='show_Content'>晚歸查詢</a>|</td>" nav += "<td><a href='latecount.asp

35、x' target='show_Content'>晚歸匯總</a>|</td>" nav += "<td><a href='attendcheck.aspx' target='show_Content'>考勤查詢</a>|</td>" nav += "<td><a href='attendcount.aspx' target='show_Content'>考勤匯總&l

36、t;/a>|</td>" nav += "<td><a href='updatedept.aspx' target='show_Content'>系/班級(jí)/專業(yè)維護(hù)</a>|</td>" nav += "<td><a href='updateregion.aspx' target='show_Content'>區(qū)/門維護(hù)</a>|</td>" nav += "

37、<td><a href='updateadmin.aspx' target='show_Content'>用戶管理</a>|</td>" nav += "<td><a href='exit.aspx'>注銷用戶</a></td>" elseif (power = 2) nav = "<td><a href='latecheck.aspx'target='show_Cont

38、ent'>晚歸查詢</a>|</td>" nav += "<td><a href='latecount.aspx' target='show_Content'>晚歸匯總</a>|</td>" nav += "<td><a href='latewrite.aspx' target='show_Content'>晚歸登記</a>|</td>" nav +

39、= "<td><a href='attendcheck.aspx' target='show_Content'>考勤查詢</a>|</td>" nav += "<td><a href='attendcount.aspx' target='show_Content'>考勤匯總</a>|</td>" nav += "<td><a href='attendwrite.

40、aspx' target='show_Content'>考勤登記</a>|</td>" nav += "<td><a href='exit.aspx'>注銷用戶</a></td>" elseif (power = 3) nav = "<td><a href='latecheck.aspx'target='show_Content'>晚歸查詢</a>|</td>

41、" nav += "<td><a href='latecount.aspx' target='show_Content'>晚歸匯總</a>|</td>" nav += "<td><a href='attendcheck.aspx' target='show_Content'>考勤查詢</a>|</td>" nav += "<td><a href='at

42、tendcount.aspx' target='show_Content'>考勤匯總</a>|</td>" nav += "<td><a href='exit.aspx'>注銷用戶</a></td>" lblNav.Text = "<table><tr>"+nav+"</tr></table>" lblNav.Text += "歡迎<font c

43、olor='red'>" + userStr + "</font>登錄" else /如果用戶沒有進(jìn)行登錄,則直接跳轉(zhuǎn)到登錄頁(yè)面 Response.Write("<script>alert('你還沒有進(jìn)行系統(tǒng)的登錄,請(qǐng)先登錄后再使用本系統(tǒng)!')</script>"); Response.Write("<script>window.location.href='login.aspx'</script>"); /Re

44、sponse.Write("<iframe name='show_Content' frameborder='1' width='800px' height='600px' scroll='no'></iframe>");向網(wǎng)頁(yè)中輸出一個(gè)框架 lblContent.Text = "<iframe name='show_Content' frameborder='1' width='800px' height=

45、'600px' scroll='no' src='Welcome.aspx'></iframe>"/讓框架在指定的Lable中顯示 到此,用戶注冊(cè)和登錄的功能模塊就全部實(shí)現(xiàn)了接下來將進(jìn)入系統(tǒng)開發(fā)中的最核心的功能模塊部分的開發(fā):晚歸情況管理和考勤情況管理,這兩個(gè)部分是系統(tǒng)功能中最核心的兩個(gè)部分,也是最難實(shí)現(xiàn)的兩個(gè)部分,這兩個(gè)部分難就難在了查詢的部分,如何根據(jù)用戶的選擇查詢操作動(dòng)態(tài)拼湊出SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,從而查詢出用戶想要的記錄。晚歸情況管理功能模塊的實(shí)現(xiàn)晚歸情況管理功能模塊主要有三部分,分別為晚歸登記,晚歸查詢

46、,晚歸匯總。如下圖所示:晚歸情況管理晚歸登記晚歸查詢晚歸匯總實(shí)現(xiàn)晚歸登記功能latewrite.aspx頁(yè)面設(shè)計(jì)如下:在數(shù)據(jù)庫(kù)的設(shè)計(jì)中,存儲(chǔ)晚歸情況的表為late表,late表的設(shè)計(jì)如下圖所示:從表中可以看到,late表存儲(chǔ)的信息為學(xué)生的學(xué)號(hào)(stu_id)、區(qū)/門編號(hào)(region_id)以與晚歸時(shí)間(late_time)和晚歸事由(late_intro)。記錄員在進(jìn)行晚歸情況記錄時(shí),首先要選擇的系部,專業(yè),班級(jí),區(qū)/門,這些相關(guān)的學(xué)生的信息,然后寫上晚歸時(shí)間和晚歸事由后,點(diǎn)擊記錄按鈕,完成晚歸情況的登記。這里需要注意的地方是,記錄員選擇的系部名稱,專業(yè)名稱,班級(jí)名稱以與學(xué)生名稱這些信息是早

47、就已經(jīng)隨著數(shù)據(jù)庫(kù)的創(chuàng)建插入到相關(guān)的表中存放了,因此沒有必要再次把這些重復(fù)的信息寫入到數(shù)據(jù)庫(kù)中,而且從存儲(chǔ)晚歸情況記錄的late表中也可以看出,late表并沒有定義有可以存儲(chǔ)系部,專業(yè),班級(jí)、區(qū)/門和的字段,但可以看到,late表中存放有學(xué)生的學(xué)號(hào)(stu_id),區(qū)門的編號(hào)(region_id),當(dāng)初進(jìn)行數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí),就已經(jīng)定義了late表中的stu_id(外鍵)字段和stuInfo表的stu_id(主鍵)字段之間的約束關(guān)系,因此可以通過late表的stu_id找到stuInfo表中對(duì)應(yīng)著的stu_id所表示的學(xué)生,而stuInfo表的設(shè)計(jì)如下圖所示:從學(xué)生信息表(stuInfo)的定義中可以

48、看出,學(xué)生信息表中存放有系部的編號(hào)(dept_id)、專業(yè)編號(hào)(spc_id)以與(class_id),這三個(gè)字段都作為外鍵與相應(yīng)的department表的dept_id(主鍵)、spcieal表的spc_id(主鍵)以與class表的class_id(主鍵)建立起主鍵外鍵的約束關(guān)系,因此通過stuInfo表就可以找到與該晚歸學(xué)生相關(guān)的系部,專業(yè)以與所在的班級(jí),這樣有關(guān)該晚歸學(xué)生的全部信息就可以通過多表聯(lián)合查詢從stuInfo表(得到學(xué)生),class表(得到班級(jí)),spceial表(得到專業(yè))和department表(得到系部)得到。這就是建立起主鍵外鍵約束的好處,可以把表和表通過某種關(guān)系關(guān)

49、聯(lián)起來,使之成為有一定依賴關(guān)系的表,從而保持了數(shù)據(jù)的完整性。晚歸情況記錄表(late)中的region_id記錄了學(xué)生晚歸的區(qū)/門編號(hào),通過該編號(hào)就可以找到存放在region表中對(duì)應(yīng)的區(qū)/門信息。做這個(gè)功能模塊時(shí),容易產(chǎn)生一個(gè)誤區(qū),會(huì)很自然地認(rèn)為記錄員選擇的系部,專業(yè),班級(jí),區(qū)/門以與填寫的晚歸時(shí)間和晚歸事由這些有關(guān)晚歸的信息全部都要寫入到數(shù)據(jù)庫(kù)里面,如果這樣想,那么這個(gè)功能模塊就沒有辦法做了,而且會(huì)越做越復(fù)雜,會(huì)產(chǎn)生很多重復(fù)的數(shù)據(jù),可能有的人會(huì)想到再創(chuàng)建一個(gè)表,專門用來存放這些信息,其實(shí)是完全沒有必要這樣做的。使用一個(gè)late表存放晚歸情況記錄即已經(jīng)可以了。其它的系部,班級(jí),專業(yè)等相關(guān)信息在

50、別的表已經(jīng)存放有了,因此沒有必要再次把這些信息寫入到數(shù)據(jù)庫(kù)中存放,造成數(shù)據(jù)的冗余以與存儲(chǔ)空間的浪費(fèi)。latewrite.aspx.cs相關(guān)的代碼如下:using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using

51、System.Web.UI.HtmlControls;using System.Data.SqlClient;publicpartialclasslatewrite : System.Web.UI.PageDB db = newDB();protectedvoid Page_Load(object sender, EventArgs e) if (!IsPostBack) string sql = "select dept_id,dept_name from department"SqlDataReader dr = db.reDr(sql);/獲取數(shù)據(jù)源,數(shù)據(jù)源來源于de

52、partment表 dp_dept.DataSource = dr;/綁定數(shù)據(jù)源到dp_selectDept中 dp_dept.DataValueField = "dept_id"/給DropDownList1的下拉列表的項(xiàng)賦值 dp_dept.DataTextField = "dept_name"/顯示給用戶看的文本 dp_dept.DataBind();/顯示數(shù)據(jù) dp_dept.Items.Insert(0, newListItem("=請(qǐng)選擇系部=", "");/在第0個(gè)位置插入一個(gè)下拉項(xiàng),顯示的DataT

53、extField為"=請(qǐng)選擇系部=",下拉項(xiàng)的DataValueField為空 dp_spc.Items.Insert(0, newListItem("=請(qǐng)選擇專業(yè)=", ""); dp_class.Items.Insert(0, newListItem("=請(qǐng)選擇班級(jí)=", ""); dp_name.Items.Insert(0,newListItem("=請(qǐng)選擇="); sql = "select region_id,region_name from regio

54、n" dr = db.reDr(sql); dp_region.DataSource = dr; dp_region.DataValueField = "region_id" dp_region.DataTextField = "region_name" dp_region.DataBind(); dp_region.Items.Insert(0, newListItem("=請(qǐng)選擇區(qū)/門=", ""); protectedvoid dp_dept_SelectedIndexChanged(object

55、sender, EventArgs e) string dept_id = dp_dept.SelectedValue;/獲取中選定的項(xiàng)的value,SelectedValue的意思很明顯,意思為選中的值/注意:這里的判斷不要寫成if(dept_id!=null)這樣寫會(huì)出錯(cuò)的if (dept_id != "")/這里要進(jìn)行判斷,如果選中的是第一項(xiàng),即顯示文本為“=請(qǐng)選擇系部=”這一項(xiàng)時(shí),dept_id是沒有值的,即為空 string sql = "select spc_id,spc_name from special where dept_id=" +

56、 dept_id;/查詢出與dept_id相等的記錄,這里的dept_id為整型,所以不用加單引號(hào)引起來SqlDataReader dr = db.reDr(sql);/獲取數(shù)據(jù)源,數(shù)據(jù)源來源于special表 dp_spc.DataSource = dr;/綁定數(shù)據(jù)源 dp_spc.DataTextField = "spc_name"/顯示專業(yè)名稱給用戶看 dp_spc.DataValueField = "spc_id"/把專業(yè)的id值賦值給下拉列表的項(xiàng) dp_spc.DataBind();/顯示數(shù)據(jù) dp_spc.Items.Insert(0, ne

57、wListItem("=請(qǐng)選擇專業(yè)=", ""); else /如果dp_dept選中的是第一項(xiàng)“=請(qǐng)選擇系部=”,此時(shí)的DataValueField是為空的,所以要相應(yīng)的把dp_spc,dp_class,dp_name中的項(xiàng)清空掉 dp_spc.Items.Clear();/清空 DropDownList2下拉列表的項(xiàng) dp_spc.Items.Insert(0, newListItem("=請(qǐng)選擇專業(yè)=", ""); dp_class.Items.Clear();/清空 DropDownList3下拉列表的項(xiàng) dp_class.Items.Insert(0, newListItem("=請(qǐng)選擇班級(jí)=", ""); dp_name.Items.Clear();/清空下拉列表的項(xiàng) dp_name.Items.Insert(0, newListItem("=請(qǐng)選擇=", ""); protectedvoid dp_spc_SelectedIndexChanged(ob

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論