版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 HYPERLINK / 學(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ù)庫設(shè)計(jì)本系統(tǒng)采納S
2、QL Server2005作為后臺(tái)數(shù)據(jù)庫。依照以上功能,新建一名為Attendance的數(shù)據(jù)庫,其中共包括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ù)庫創(chuàng)建腳本參考文件:“學(xué)生晚歸與考勤治理信息系統(tǒng)數(shù)據(jù)庫建庫腳步.sql” 3.4 數(shù)據(jù)庫連接1、建議將數(shù)據(jù)庫拷入網(wǎng)站內(nèi)的App_Data目錄內(nèi),
3、然后將數(shù)據(jù)庫連接字符串寫入到Web.config,參考代碼如下:測試數(shù)據(jù)庫連接是否正常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 System.Web.UI.HtmlControls;using
4、 System.Data.SqlClient;public partial class DBConnTest : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) string constr = ConfigurationManager.AppSettingsConnectionStr; SqlConnection conn = new SqlConnection(constr); conn.Open();/打開數(shù)據(jù)庫連接 Response.Write(數(shù)據(jù)庫連接成功!); conn.Close();
5、/關(guān)閉數(shù)據(jù)庫連接 Response.Write(數(shù)據(jù)庫關(guān)閉成功!); 經(jīng)驗(yàn)證,Attendance.mdf數(shù)據(jù)庫連接正常2、將常用數(shù)據(jù)庫操作代碼寫入公共類DB中,其中包含以下各自定義方法,參考代碼如下:using System;using 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
6、 System.Web.UI.HtmlControls;using System.Data.SqlClient;/ / DB類為一個(gè)專門進(jìn)行數(shù)據(jù)庫操作的類/ 包括連接數(shù)據(jù)庫,更新數(shù)據(jù)庫,查詢數(shù)據(jù)庫這些操作/ public class DB / / DB()為DB類的構(gòu)造方法 / public DB() / / 定義返回?cái)?shù)據(jù)庫連接對(duì)象SqlConnection方法 / / / SqlConnection對(duì)象 / public SqlConnection getCon() String strCon = ConfigurationManager.AppSettingsConnectionStr;/
7、從配置文件web.cofig里面讀取數(shù)據(jù)庫的連接字符串 return new SqlConnection(strCon);/返回?cái)?shù)據(jù)庫連接對(duì)象 / / 定義更新數(shù)據(jù)庫的方法 / / / 參數(shù)cmdStr為要執(zhí)行更新數(shù)據(jù)庫的SQL語句,包含增加,修改,刪除這三種SQL語句 / / / 數(shù)據(jù)庫更新成功則返回1,更新失敗則返回0 / public int sqlEx(string cmdStr) SqlConnection con = getCon(); con.Open();/打開數(shù)據(jù)庫連接 SqlCommand cmd = new SqlCommand(cmdStr,con);/創(chuàng)建執(zhí)行SQL語
8、句的命令對(duì)象SqlCommand try cmd.ExecuteNonQuery(); return 1;/成功返回1 catch return 0;/失敗返回0 finally con.Dispose();/釋放資源 / / 定義查詢數(shù)據(jù)庫信息的方法 / / / 參數(shù)cmdStr為執(zhí)行查詢時(shí)的書寫的SQL語句 / / public DataTable reDt(string cmdStr) SqlConnection con = getCon();/連接數(shù)據(jù)庫 con.Open(); SqlDataAdapter da = new SqlDataAdapter(cmdStr,con);/創(chuàng)建
9、數(shù)據(jù)適配器對(duì)象 DataSet ds = new DataSet();/創(chuàng)建數(shù)據(jù)集對(duì)象 da.Fill(ds);/將保存在數(shù)據(jù)適配器對(duì)象中的數(shù)據(jù)填充到數(shù)據(jù)集對(duì)象中 return (ds.Tables0);/返回?cái)?shù)據(jù)集對(duì)象中有記錄的那個(gè)表 / / 定義閱讀數(shù)據(jù)的方法 / / / 參數(shù)str為執(zhí)行查詢操作時(shí)的SQL語句 / / / 返回一個(gè)數(shù)據(jù)閱讀對(duì)象 / public SqlDataReader reDr(string str) SqlConnection con = getCon(); con.Open(); SqlCommand cmd = new SqlCommand(str,con);
10、SqlDataReader 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í)要依照學(xué)生輸入的真實(shí)姓名和學(xué)號(hào)進(jìn)行注冊(cè),假如找不到對(duì)應(yīng)的學(xué)生的名字,就不同意用戶進(jìn)行注冊(cè),假如用戶差不多注
11、冊(cè)過一次了,就直接告訴用戶差不多注冊(cè)過了,無需再次注冊(cè)了,并自動(dòng)為用戶跳轉(zhuǎn)到登錄頁面,假如用戶是第一次注冊(cè),就把用戶的注冊(cè)信息寫入到admin表中,注冊(cè)成功后也跳轉(zhuǎn)到登錄頁面讓用戶進(jìn)行登錄。用戶注冊(cè)頁面Register.aspx如下圖所示:學(xué)生進(jìn)入此頁面進(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)證碼輸入正確才接著執(zhí)行檢查該注冊(cè)用戶是否是本校的學(xué)生,以及該用戶是否差不多被注冊(cè)了,后臺(tái)的處理代碼如下所示:Register
12、.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.HtmlControls;using System.Data.SqlClient;public parti
13、al class student_Register : System.Web.UI.Page DB db = new DB(); protected void Page_Load(object sender, EventArgs e) this.ImageButton1.ImageUrl = image.aspx;/image.aspx是一個(gè)顯示驗(yàn)證碼的Web頁面 protected void btn_submit_Click(object sender, EventArgs e) string code = txtCheckCode.Text.Trim(); if (code != (str
14、ing)Sessionimage) Response.Write(alert(驗(yàn)證碼輸入錯(cuò)誤,請(qǐng)檢查后重新輸入!); / Response.Redirect(Register.aspx);假如使用這種跳轉(zhuǎn)方式,那么上面的javascript是無法運(yùn)行的,因?yàn)檫€沒有來得及運(yùn)行就頁面就差不多跳轉(zhuǎn)了 Response.Write(window.location.href=Register.aspx); else string stu_Name = txtUserName.Text.Trim(); string stu_Id = txtstuID.Text.Trim(); string sql2 =
15、select stu_name from stuInfo where stu_name=+stu_Name+;/使用這條SQL語句檢查要注冊(cè)的人是否是本校的學(xué)生,假如是,才同意其注冊(cè),假如不是,就不同意其注冊(cè) SqlDataReader dr = db.reDr(sql2); if (dr.Read() dr.Close();/關(guān)閉SqlDataReader string sq = select * from admin where login_name= + stu_Name + ;/假如差不多證實(shí)是本校的學(xué)生,就再推斷該學(xué)生是否差不多注冊(cè)過了 dr=db.reDr(sq);/再次使用Sql
16、DataReader if (dr.Read() Response.Write(alert(你差不多注冊(cè)過了,不需要再次注冊(cè)了!直接為您跳轉(zhuǎn)到登錄頁面進(jìn)行登錄); Response.Write(window.location.href=logion.aspx); else int power = 3;/假如差不多證實(shí)要注冊(cè)的人是本校的學(xué)生,就直接給該學(xué)生給予使用權(quán)限 string sql = insert into admin(login_name,login_pwd,admin_power) values( + stu_Name + , + stu_Id + ,+power+); /Resp
17、onse.Write(sql); /Response.End(); try int flag = db.sqlEx(sql); if (flag 0) Response.Write(alert(注冊(cè)成功了!立即為您跳轉(zhuǎn)到登錄頁面進(jìn)行登錄); Response.Write(window.location.href=login.aspx); else Response.Write(alert(注冊(cè)失敗!); catch (System.Exception ee) Response.Write(alert(+ee.Message.ToString()+);); else Response.Write
18、(alert(你不是本校的學(xué)生,沒有注冊(cè)的權(quán)限!); txtUserName.Text = ; txtstuID.Text = ; protected void btn_reset_Click(object sender, EventArgs e) txtstuID.Text = ; txtUserName.Text = ; 用戶登錄功能的實(shí)現(xiàn)實(shí)現(xiàn)邏輯:用戶進(jìn)入登錄頁面后,輸入相關(guān)的用戶名和密碼進(jìn)行登錄,假如用戶名和密碼都正確了,表示該用戶是合法用戶,就同意其進(jìn)入系統(tǒng)的主頁進(jìn)行相關(guān)的系統(tǒng)操作,假如用戶名和密碼的驗(yàn)證不通過,就不同意其進(jìn)入系統(tǒng),用戶輸入用戶名和密碼后,在后臺(tái)的處理過程中首先會(huì)從數(shù)
19、據(jù)庫Attendance.mdf的admin表取出相應(yīng)的用戶名和用戶輸入的用戶名進(jìn)行匹配,假如用戶名匹配成功了,就把數(shù)據(jù)表中存儲(chǔ)的密碼和用戶輸入的密碼進(jìn)行比對(duì),假如密碼也驗(yàn)證通過了,才同意用戶進(jìn)入系統(tǒng)首頁,用戶名和密碼中任意一項(xiàng)匹配假如不通過,都不同意其登錄。登錄該系統(tǒng)時(shí),有三種不同身份的使用者,分不為治理員,記錄員和學(xué)生,不同的身份就對(duì)應(yīng)著不同的使用權(quán)限。使用權(quán)限的限制依照不同身份的登錄者生成不同的動(dòng)態(tài)導(dǎo)航,以此到達(dá)限定使用者的權(quán)限的目的。登錄頁面的設(shè)計(jì)如下:假如登錄的身份是治理員,則顯示如下的導(dǎo)航:假如登錄的身份是記錄員,則顯示如下的導(dǎo)航:假如登錄的身份是學(xué)生,則顯示如下的導(dǎo)航:關(guān)于治理員
20、而言,其擁有的使用權(quán)限是最多的,但沒有晚歸登記和考勤登記的權(quán)限,登記權(quán)限只有記錄員才有,而關(guān)于學(xué)生而言,只有查看相關(guān)記錄的權(quán)限,不的權(quán)限都沒有,因此通過這種依照不同登錄者的身份生成不同的導(dǎo)航就能夠限定了登錄者的使用權(quán)限了。那個(gè)地點(diǎn)難就難在了假如依照登錄者的身份動(dòng)態(tài)生成不同的導(dǎo)航信息。相關(guān)代碼如下:用戶登錄的后臺(tái)代碼:login.aspx.csusing System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;us
21、ing System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;public partial class login : System.Web.UI.Page DB db = new DB(); protected void Page_Load(object sender, EventArgs e) ImageButton1.ImageUrl = image
22、.aspx;/讓頁面加載時(shí)就顯示驗(yàn)證碼圖片 protected void btnRegister_Click(object sender, EventArgs e) Response.Redirect(Register.aspx);/點(diǎn)擊注冊(cè)按鈕后,直接跳轉(zhuǎn)到注冊(cè)頁面,那個(gè)地點(diǎn)需要注意一個(gè)小問題,由于文本框差不多使用了驗(yàn)證控件,因此要想讓按鈕的觸發(fā)事件不觸發(fā)驗(yàn)證控件時(shí),把按鈕的CausesValidation屬性設(shè)置為false即可 protected void btnLogin_Click(object sender, EventArgs e) string code = txtCheckC
23、ode.Text.Trim();/獵取輸入的驗(yàn)證碼 string username = txtUserName.Text.Trim();/獵取輸入的用戶名 string password = txtPassword.Text.Trim();/獵取輸入的密碼 if (code != (string)Sessionimage)/先進(jìn)行驗(yàn)證碼的推斷,驗(yàn)證碼輸入正確后在執(zhí)行其他的操作 Response.Write(alert(驗(yàn)證碼輸入有誤!); Response.Write(window.location.href=login.aspx); else string sql = select logi
24、n_name,login_pwd,admin_power from admin where login_name=+username+; SqlDataReader dr = db.reDr(sql); if (dr.Read() if (string)drlogin_pwd = password) Response.Write(alert(用戶名和密碼正確!登錄成功!); Response.Write(window.location.href=Index.aspx); SessionPower = dradmin_power;/使用Session存儲(chǔ)用戶的使用權(quán)限 Sessionuserna
25、me = username;/存儲(chǔ)用戶名 else Response.Write(alert(密碼錯(cuò)誤!); Response.Write(window.location.href=login.aspx); else Response.Write(alert(該用戶不存在,請(qǐng)先去注冊(cè)一個(gè)帳戶后再進(jìn)行登錄操作,立即為你跳轉(zhuǎn)到注冊(cè)頁面!); Response.Write(window.location.href=Register.aspx); 在用戶進(jìn)行登錄的時(shí)候,使用Session對(duì)象存儲(chǔ)用戶名,同時(shí)依照用戶名從數(shù)據(jù)庫中取出該用戶的使用權(quán)限,也使用Session對(duì)象保存用戶的使用權(quán)限,登錄成功后
26、,在系統(tǒng)的主頁的后臺(tái)處理代碼中取出保存在Session對(duì)象中的用戶名的相關(guān)的用戶權(quán)限,然后依照用戶權(quán)限來動(dòng)態(tài)生成導(dǎo)航,相關(guān)的代碼如下:系統(tǒng)主頁的后臺(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.WebControl
27、s.WebParts;using System.Web.UI.HtmlControls;public partial class Index : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) if (Sessionusername != null)/那個(gè)地點(diǎn)使用Session對(duì)象對(duì)用戶是否差不多進(jìn)行登錄進(jìn)行推斷,假如Session中的內(nèi)容不為空,則表示用戶差不多登錄 string userStr = (string)Sessionusername;/取出保存在Session對(duì)象中的用戶名 int
28、power = int.Parse(SessionPower.ToString();/取出保存在Session對(duì)象中的用戶使用權(quán)限標(biāo)識(shí) string nav = ; if (power = 1)/依照登錄者的身份動(dòng)態(tài)變化導(dǎo)航的顯示,以此限定不同身份的登錄者的使用權(quán)限 nav = 晚歸查詢|; nav += 晚歸匯總|; nav += 考勤查詢|; nav += 考勤匯總|; nav += 系/班級(jí)/專業(yè)維護(hù)|; nav += 區(qū)/門維護(hù)|; nav += 用戶治理|; nav += 注銷用戶; else if (power = 2) nav = 晚歸查詢|; nav += 晚歸匯總|; nav
29、 += 晚歸登記|; nav += 考勤查詢|; nav += 考勤匯總|; nav += 考勤登記|; nav += 注銷用戶; else if (power = 3) nav = 晚歸查詢|; nav += 晚歸匯總|; nav += 考勤查詢|; nav += 考勤匯總|; nav += 注銷用戶; lblNav.Text = +nav+; lblNav.Text += 歡迎 + userStr + 登錄; else /假如用戶沒有進(jìn)行登錄,則直接跳轉(zhuǎn)到登錄頁面 Response.Write(alert(你還沒有進(jìn)行系統(tǒng)的登錄,請(qǐng)先登錄后再使用本系統(tǒng)!); Response.Write(
30、window.location.href=login.aspx); /Response.Write();向網(wǎng)頁中輸出一個(gè)框架 lblContent.Text = ;/讓框架在指定的Lable中顯示 到此,用戶注冊(cè)和登錄的功能模塊就全部實(shí)現(xiàn)了接下來將進(jìn)入系統(tǒng)開發(fā)中的最核心的功能模塊部分的開發(fā):晚歸情況治理和考勤情況治理,這兩個(gè)部分是系統(tǒng)功能中最核心的兩個(gè)部分,也是最難實(shí)現(xiàn)的兩個(gè)部分,這兩個(gè)部分難就難在了查詢的部分,如何依照用戶的選擇查詢操作動(dòng)態(tài)拼湊出SQL語句對(duì)數(shù)據(jù)庫進(jìn)行操作,從而查詢出用戶想要的記錄。晚歸情況治理功能模塊的實(shí)現(xiàn)晚歸情況治理功能模塊要緊有三部分,分不為晚歸登記,晚歸查詢,晚歸匯總
31、。如下圖所示:晚歸情況治理晚歸情況治理晚歸登記晚歸查詢晚歸匯總實(shí)現(xiàn)晚歸登記功能latewrite.aspx頁面設(shè)計(jì)如下:在數(shù)據(jù)庫的設(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)擊【記錄】按鈕,完成晚歸情況的登記。那個(gè)地點(diǎn)需要注意的地點(diǎn)是,記錄員選擇的系部名稱,專業(yè)名稱,班級(jí)名稱以及學(xué)生名
32、稱這些信息是早就差不多隨著數(shù)據(jù)庫的創(chuàng)建插入到相關(guān)的表中存放了,因此沒有必要再次把這些重復(fù)的信息寫入到數(shù)據(jù)庫中,而且從存儲(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ù)庫設(shè)計(jì)時(shí),就差不多定義了late表中的stu_id(外鍵)字段和stuInfo表的stu_id(主鍵)字段之間的約束關(guān)系,因此能夠通過late表的stu_id找到stuInfo表中對(duì)應(yīng)著的stu_id所表示的學(xué)生,而stuInfo表的設(shè)計(jì)如下圖所示:從學(xué)生信息表(stu
33、Info)的定義中能夠看出,學(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表(得到系部)得到。這確實(shí)是建立起主鍵外鍵約束的好處
34、,能夠把表和表通過某種關(guān)系關(guān)聯(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ù)庫里面,假如如此想,那么那個(gè)功能模塊就沒有方法做了,而且會(huì)越做越復(fù)雜,會(huì)產(chǎn)生專門多重復(fù)的數(shù)據(jù),可能有的人會(huì)想到再創(chuàng)建一個(gè)表,專門用來存放這些信息,事實(shí)上是完全沒有必要如此做的。使用一個(gè)late表存放晚歸情況記錄即差不多
35、能夠了。其它的系部,班級(jí),專業(yè)等相關(guān)信息在不的表差不多存放有了,因此沒有必要再次把這些信息寫入到數(shù)據(jù)庫中存放,造成數(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.WebCo
36、ntrols.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;public partial class latewrite : System.Web.UI.Page DB db = new DB(); protected void Page_Load(object sender, EventArgs e) if (!IsPostBack) string sql = select dept_id,dept_name from department; SqlDataReader dr = db.reDr(s
37、ql);/獵取數(shù)據(jù)源,數(shù)據(jù)源來源于department表 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, new ListItem(=請(qǐng)選擇系部=, );/在第0個(gè)位置插入一個(gè)下拉項(xiàng),顯示的DataTextField為=請(qǐng)選擇系部=,下拉項(xiàng)的DataV
38、alueField為空 dp_spc.Items.Insert(0, new ListItem(=請(qǐng)選擇專業(yè)=, ); dp_class.Items.Insert(0, new ListItem(=請(qǐng)選擇班級(jí)=, ); dp_name.Items.Insert(0,new ListItem(=請(qǐng)選擇姓名=); sql = select region_id,region_name from region; dr = db.reDr(sql); dp_region.DataSource = dr; dp_region.DataValueField = region_id; dp_region.Da
39、taTextField = region_name; dp_region.DataBind(); dp_region.Items.Insert(0, new ListItem(=請(qǐng)選擇區(qū)/門=, ); protected void dp_dept_SelectedIndexChanged(object sender, EventArgs e) string dept_id = dp_dept.SelectedValue;/獵取中選定的項(xiàng)的value,SelectedValue的意思專門明顯,意思為選中的值 /注意:那個(gè)地點(diǎn)的推斷不要寫成if(dept_id!=null)如此寫會(huì)出錯(cuò)的 if (
40、dept_id != )/那個(gè)地點(diǎn)要進(jìn)行推斷,假如選中的是第一項(xiàng),即顯示文本為“=請(qǐng)選擇系部=”這一項(xiàng)時(shí),dept_id是沒有值的,即為空 string sql = select spc_id,spc_name from special where dept_id= + dept_id;/查詢出與dept_id相等的記錄,那個(gè)地點(diǎn)的dept_id為整型,因此不用加單引號(hào)引起來 SqlDataReader dr = db.reDr(sql);/獵取數(shù)據(jù)源,數(shù)據(jù)源來源于special表 dp_spc.DataSource = dr;/綁定數(shù)據(jù)源 dp_spc.DataTextField = spc
41、_name;/顯示專業(yè)名稱給用戶看 dp_spc.DataValueField = spc_id;/把專業(yè)的id值賦值給下拉列表的項(xiàng) dp_spc.DataBind();/顯示數(shù)據(jù) dp_spc.Items.Insert(0, new ListItem(=請(qǐng)選擇專業(yè)=, ); else /假如dp_dept選中的是第一項(xiàng)“=請(qǐng)選擇系部=”,現(xiàn)在的DataValueField是為空的,因此要相應(yīng)的把dp_spc,dp_class,dp_name中的項(xiàng)清空掉 dp_spc.Items.Clear();/清空 DropDownList2下拉列表的項(xiàng) dp_spc.Items.Insert(0, ne
42、w ListItem(=請(qǐng)選擇專業(yè)=, ); dp_class.Items.Clear();/清空 DropDownList3下拉列表的項(xiàng) dp_class.Items.Insert(0, new ListItem(=請(qǐng)選擇班級(jí)=, ); dp_name.Items.Clear();/清空 下拉列表的項(xiàng) dp_name.Items.Insert(0, new ListItem(=請(qǐng)選擇姓名=, ); protected void dp_spc_SelectedIndexChanged(object sender, EventArgs e) string spc_id = dp_spc.Sele
43、ctedValue; if (spc_id != ) string sql = select class_id,class_name from class where spc_id= + spc_id; SqlDataReader dr = db.reDr(sql);/獵取數(shù)據(jù)源,數(shù)據(jù)源來源于class表 dp_class.DataSource = dr;/綁定數(shù)據(jù)源到 dp_class.DataTextField = class_name; dp_class.DataValueField = class_id; dp_class.DataBind(); dp_class.Items.Inse
44、rt(0, new ListItem(=請(qǐng)選擇班級(jí)=, ); else dp_class.Items.Clear(); dp_class.Items.Insert(0, new ListItem(=請(qǐng)選擇班級(jí)=); protected void dp_class_SelectedIndexChanged(object sender, EventArgs e) string class_id = dp_class.SelectedValue; if (class_id != ) string sql = select stu_id,stu_name from stuInfo where clas
45、s_id= + class_id; SqlDataReader dr = db.reDr(sql);/獵取數(shù)據(jù)源,數(shù)據(jù)源來源于stuInfo表 dp_name.DataSource = dr;/綁定數(shù)據(jù)源 dp_name.DataTextField = stu_name; dp_name.DataValueField = stu_id; dp_name.DataBind(); dp_name.Items.Insert(0, new ListItem(=請(qǐng)選擇姓名=, ); else dp_name.Items.Clear();/清空下拉列表的項(xiàng) dp_name.Items.Insert(0,
46、new ListItem(=請(qǐng)選擇姓名=, ); protected void btn_record_Click(object sender, EventArgs e) DateTime lateTime = DateTime.Parse(txtLateTime.Text.Trim();/獵取從文本框輸入的晚歸時(shí)刻字符串,并把字符串轉(zhuǎn)換成真正的時(shí)刻類型 string lateIntro = txtContent.Text.Trim();/獵取輸入的晚歸事由,Trim()方法的作用是截?cái)嘧址笥覂蛇叺目崭?string stuId =dp_name.SelectedValue;/從選中的dp_
47、name的項(xiàng)的value獵取到stu_id string regionId = dp_region.SelectedValue;/從選中的dp_region的項(xiàng)的value獵取到region_id string sql = insert into late(stu_id,region_id,late_time,late_intro) values( + stuId + , + regionId + , + lateTime + , + lateIntro + ); try int flag = db.sqlEx(sql); if (flag 0) Response.Write(alert(登記
48、成功!); txtContent.Text = ; txtLateTime.Text = ; else Response.Write(alert(數(shù)據(jù)錄入失??!); catch (System.Exception ee) Response.Write(alert( + ee.Message.ToString() + ); protected void btn_reset_Click(object sender, EventArgs e) txtContent.Text = ; txtLateTime.Text = ; 到此,實(shí)現(xiàn)晚歸情況記錄功能。實(shí)現(xiàn)晚歸查詢功能模塊latecheck.aspx
49、的頁面設(shè)計(jì)如下:那個(gè)模塊最難就難在如何依照用戶選擇的查詢條件動(dòng)態(tài)地組合SQL查詢語句,那個(gè)地點(diǎn)使用一個(gè)GridView控件用于顯示用戶查詢后的數(shù)據(jù)。那個(gè)地點(diǎn)的查詢邏輯是如此的:假如用戶進(jìn)入此查詢頁面查詢數(shù)據(jù)時(shí),當(dāng)用戶直接單擊查詢按鈕,不選擇任何的查詢條件,就將全部信息綁定到GridView中顯示出來,假如用戶查詢時(shí)加上了查詢條件(如:用戶能夠選擇系部進(jìn)行查詢,或者是選擇系部和專業(yè)作為查詢條件進(jìn)行查詢,或者是選擇系部,專業(yè)和班級(jí)進(jìn)行作為查詢條件進(jìn)行查詢,或者直接輸入要查詢的姓名或者宿舍或者開始時(shí)刻或者是結(jié)束時(shí)刻或者是同時(shí)輸入這些查詢關(guān)鍵字或者是輸入查詢關(guān)鍵字的同時(shí)由選擇了系部,專業(yè)和班級(jí)等關(guān)鍵詞
50、組成的查詢條件),那么就依照查詢條件從數(shù)據(jù)庫中查詢出滿足條件的記錄,將滿足的記錄綁定到GridView控件中進(jìn)行輸出顯示。查詢部分的代碼如下:protected void btnSearch_Click(object sender, EventArgs e) string sql = select stuInfo.stu_name,stuInfo.room,class.class_name,region.region_name,late.late_intro,late.late_time,late.late_id from stuInfo,class,region,late where stu
51、Info.class_id=class.class_id and stuInfo.stu_id=late.stu_id and region.region_id=late.region_id; /*假如用戶沒有選擇查詢條件,只是單擊查詢按鈕,就只執(zhí)行這條SQL語句,將全部的記錄查詢出來*/ string dept_Id = dp_selectDept.SelectedValue; string spc_Id = dp_selectSpec.SelectedValue; string class_Id = dp_selectClass.SelectedValue; string region_I
52、d=dp_selectRegion.SelectedValue; string startime = txtStartTime.Text; string endtime = txtEndTime.Text; string room = txtRoom.Text; string name = txtName.Text; if (dept_Id != ) /假如用戶選擇了系部,則重新組合SQL語句,加上查詢條件“系部編號(hào)” sql += and stuInfo.dept_id=+dept_Id; if (spc_Id != ) /假如用戶選擇了專業(yè) sql += and stuInfo.spc_i
53、d=+spc_Id; if (class_Id != ) /假如用戶選擇了班級(jí) sql += and stuInfo.class_id=+class_Id; if (region_Id != ) /假如用戶選擇了專門 sql += and late.region_id= +region_Id; if (startime != & endtime=) /假如用戶只輸入了開始時(shí)刻,結(jié)束時(shí)刻為空 /sql += and late.late_time=+startime+; sql += and late.late_time like % + startime + %;/遺留的問題,如何對(duì)時(shí)刻進(jìn)行模糊
54、查詢 if (endtime != & startime=) /假如用戶只輸入了結(jié)束時(shí)刻,開始時(shí)刻為空 sql += and late.late_time=+endtime+; if (startime != & endtime != ) /假如用戶同時(shí)輸入了結(jié)束時(shí)刻和開始時(shí)刻 sql += and late.late_time between + startime + and + endtime + ; if (room != ) /假如用戶輸入了宿舍關(guān)鍵字 sql += and stuInfo.room like % + room + %;/進(jìn)行模糊查詢,使查詢更加人性化,用戶只需要輸入有
55、關(guān)宿舍一個(gè)關(guān)鍵字就能夠找到與關(guān)鍵字相關(guān)的記錄 if (name != ) /假如用戶只輸入了姓名關(guān)鍵字 sql += and stuInfo.stu_name like % + name + %;/進(jìn)行模糊查詢,使查詢更加人性化,用戶只需要輸入姓名中的一個(gè)關(guān)鍵字就能夠找到與關(guān)鍵字相關(guān)的記錄 /Response.Write(sql);/調(diào)試語句,用于調(diào)試SQL語句是否正常 /Response.End();/程序執(zhí)行到那個(gè)地點(diǎn)以后就不再往下執(zhí)行了 DataTable dt = db.reDt(sql); GridView_DataShow.DataSource = dt;/綁定數(shù)據(jù)源到GridVi
56、ew_DataShow GridView_DataShow.DataBind();/顯示數(shù)據(jù) 那個(gè)地點(diǎn)的多表聯(lián)合查詢涉及到的表有stuInfo,class,region,late這四個(gè)表,組合查詢條件“where stuInfo.class_id=class.class_id and stuInfo.stu_id=late.stu_id and region.region_id=late.region_id ”差不多上依照各個(gè)表之間建立的主鍵外鍵約束關(guān)系建立起來的。這條語句難就難在如何找出各個(gè)表之間的聯(lián)系,繼而組合出查詢條件,以及后面依照用戶進(jìn)行的查詢條件的選擇動(dòng)態(tài)地添加查詢條件,重新拼湊SQ
57、L語句進(jìn)行查詢。運(yùn)行結(jié)果如下圖所示:當(dāng)用戶什么條件都沒有選擇就直接點(diǎn)擊【查詢】按鈕時(shí),顯示出全部的查詢信息當(dāng)用戶查詢出了想要的信息以后,點(diǎn)擊【查看】那個(gè)超鏈接,就能夠跳轉(zhuǎn)到lateview.aspx頁面顯示指定學(xué)生的詳細(xì)信息,如下圖lateview.aspx頁面設(shè)計(jì)如下所示:lateview.aspx要緊是使用了一個(gè)DataList控件來顯示數(shù)據(jù),使用DataList控件來顯示數(shù)據(jù)時(shí),在頁面設(shè)計(jì)時(shí)會(huì)出現(xiàn)如上所示的重復(fù)顯示的情況,這是正常的情況,因此見到這種情況不要認(rèn)為是自己哪里弄錯(cuò)了,事實(shí)上是沒有錯(cuò)的。使用DataList控件顯示數(shù)據(jù)時(shí),需要回到源碼視圖中手動(dòng)綁定數(shù)據(jù)源,部分截圖如下圖所示:在
58、ItemTemplate模版中插入一個(gè)表格,然后在表格的單元格中插入一個(gè)Label控件用來顯示信息,Label控件的Text屬性都寫成了“Text=”這種形式,這確實(shí)是綁定相關(guān)的查詢字段,顯示相關(guān)查詢字段的信息。lateview.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.WebCo
59、ntrols;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;public partial class lateview : System.Web.UI.Page DB db = new DB();/創(chuàng)建數(shù)據(jù)庫使用對(duì)象 protected void Page_Load(object sender, EventArgs e) if (Sessionusername != null) /那個(gè)功能的實(shí)現(xiàn)難點(diǎn)在于SQL語句的編寫,SQL語句包含了大
60、量的選擇邏輯。 int lateId = int.Parse(RequestlateId.ToString(); string sql = select department.dept_name,special.spc_name,class.class_name,region.region_name,stuInfo.stu_name,stuInfo.room,late.late_time,late.late_intro from department,special,class,stuInfo,region,late where stuInfo.dept_id=department.dept_
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 滬科版八年級(jí)物理全一冊(cè)《第三章光的世界》單元檢測卷及答案
- 利用元數(shù)據(jù)促進(jìn)數(shù)據(jù)共享協(xié)作
- 蘇教版五年級(jí)下冊(cè)課內(nèi)閱讀25篇、及課外閱讀材料(含答案)
- 2024高中地理第四章區(qū)域經(jīng)濟(jì)發(fā)展章末整合學(xué)案新人教版必修3
- 2024高中生物第5章生態(tài)系統(tǒng)及其穩(wěn)定性第1節(jié)生態(tài)系統(tǒng)的結(jié)構(gòu)課堂演練含解析新人教版必修3
- 2024高中語文第二單元第7課陸文學(xué)自傳課時(shí)作業(yè)含解析粵教版選修唐宋散文蚜
- 2024高考地理一輪復(fù)習(xí)第十六章第1講資源的跨區(qū)域調(diào)配-以我國西氣東輸為例教案含解析新人教版
- 2024高考?xì)v史一輪復(fù)習(xí)方案專題九走向世界的資本主義市場第22講“蒸汽”的力量與走向整體的世界教學(xué)案+練習(xí)人民版
- 2024高考地理一輪復(fù)習(xí)第一部分自然地理-重在理解第二章地球上的大氣第6講冷熱不均引起大氣運(yùn)動(dòng)學(xué)案新人教版
- (3篇)2024年幼兒園園長年度考核表個(gè)人總結(jié)
- 2025至2031年中國臺(tái)式燃?xì)庠钚袠I(yè)投資前景及策略咨詢研究報(bào)告
- 第三章第一節(jié)《多變的天氣》說課稿2023-2024學(xué)年人教版地理七年級(jí)上冊(cè)
- 2025年中國電科集團(tuán)春季招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年度建筑施工現(xiàn)場安全管理合同2篇
- 建筑垃圾回收利用標(biāo)準(zhǔn)方案
- 2024年考研英語一閱讀理解80篇解析
- 樣板間合作協(xié)議
- 2024解析:第一章機(jī)械運(yùn)動(dòng)-講核心(解析版)
- 屋面板的拆除與更換施工方案
- 無人機(jī)飛行區(qū)域安全協(xié)議書
- 物業(yè)員工安全知識(shí)教育培訓(xùn)
評(píng)論
0/150
提交評(píng)論