陈明忠
摘要 后台数据库管理是指管理员在系统提供的平台中对数据库记录进行添加、删除、修改、查询等操作,本文结合实例介绍了在ASP.Net页面中如何友好、高效、规范地实现后台数据库管理。 关键词 后台数据库管理,管理员,ASP.Net页面 一、 引言 随着Web技术的广泛应用和Internet的发展,基于Internet/intranet的B/S结构的管理信息系统应运而生。在B/S模式中,每个客户端只需要简单地安装和运行一个通用的浏览器就可以了,而在服务器端安装Web服务器软件和数据库系统,系统的大部分功能都在服务器上实现,大大降低了日常维护的工作量。由于客户端不必安装用户界面程序,用户的操作变得很简单。并且,该模式基于Internet/intranet,采用TCP/IP协议,使得信息能够很便捷地在Internet上发布和传输,使服务地域不再局限在局域网内,可以通过因特网和世界各地建立联系。因此,将Web技术与数据库相结合,开发动态的Web数据库应用已成为当今Web技术研究的热点。 系统管理员是指软件系统投入使用以后,使用软件系统的人员,只能通过软件系统提供的界面去添加、删除、修改、查询数据库记录,不能直接在DBMS环境下操作数据库。开发一个软件系统时需要涉及系统分析员、数据库管理员、程序员、测试员等角色,这些角色可直接在DBMS环境下操作数据库。对于中小型的软件系统,这些角色可由一人承担,我们统称为程序员。开发基于Internet的系统的步骤一般是:首先,合理地规划系统的目标、结构、内容、导航机制以及系统的整体风格等。然后,根据需求分析的结果精心设计数据库的结构,指出各数据表之间的关系以及各数据表的主码、外码。上机开发系统,一般是先开发前端页面,后开发后台数据库管理页面。程序员先创建数据库的结构,指出各表的主码、外码。当系统投入使用以后,普通用户通过前端页面向数据表输入记录,系统管理员通过后台页面向数据表输入记录,对于由系统管理员输入的那些数据表,程序员应在DBMS环境下模拟输入一些记录,因为其他数据表中的记录往往是从这些数据表导出的,或与这些数据表存在一定的关联关系,如果这些数据表没有记录,软件系统的开发将无法进行下去。而对于由普通用户输入的那些数据表,程序员不必在DBMS环境下输入记录,可在开发前端页面时,通过前端页面输入。最后,将软件系统交付使用前,程序员要删去除系统管理员表以外的所有数据表中的记录。后台数据库管理的工作量约占软件系统总工作量的三分之一,每个数据表在后台一般都有对应的管理模块,但这些管理模块风格相同,任务相似、一般均是记录的逐条显示,记录的添加、删除、修改,记录的分页显示等。下面将在ASP.Net平台上讨论这方面的编程技巧,考虑到ASP.Net提供了DataGrid或DataList控件,很容易实现记录的分页显示,所以记录的分页显示这里不作讨论。这里力求程序小巧、界面简洁、功能完备、操作方便,完全符合大众化实用软件的要求。 二、后台管理的实现界面 设有一个Access数据库stu.mdb,内有一个student表,包含如下字段:sno,sname,ssex,sage,sdept,其中sno为主键。现要在1.aspx页面上对student表进行管理,实现界面如图1所示,其中单击[查询]按钮将分页显示student表中的记录,这里不作讨论。

图1 后台管理的实现界面 三、记录的逐条显示 当单击[下一条]等超链接时,就能逐条显示student表中的记录,若当前显示的记录为第1条,则首条、上一条不显示超链接;若当前显示的记录为最后一条,则下一条、尾条不显示超链接。实现的核心代码如下: void Page_Load(Object sender,EventArgs e) { str="provider=Microsoft.Jet.OLEDB.4.0;data source="+Server.MapPath("stu.mdb"); if (Request["b1"]!="添加" && Request["b2"]!="修改" && Request["b3"]!="删除" && Request["clear"]!="清除")bind(); } void bind() {//创建连接对象 con=new OleDbConnection(str); con.Open(); //返回student表的记录条数 String sql="select count(sno) from student"; OleDbCommand cmd=new OleDbCommand(sql,con); int count=(int)cmd.ExecuteScalar(); //创建命令对象 sql="select * from student"; cmd=new OleDbCommand(sql,con); OleDbDataReader rs = cmd.ExecuteReader(); //记录指针指向第1条记录之前。 String page1; // GO按钮的id名为go,page1为GO左旁文本框的id名,pages为超链接中的参数名。 if (Request["go"]=="GO") {page1=Request["page1"];} else page1=Request["pages"]; int page;//表示要显示的记录号 if (page1==null) page=1; else page=int.Parse(page1); if (page<1) page=1; if (page>count) page=count; //将记录指针指向要显示的记录号。 for(int i=1;i<=page;i++) rs.Read(); //将当前记录的属性值通过表单控件显示出来。 T1.Value=rs["sno"].ToString(); T2.Value=rs["sname"].ToString(); if (rs["ssex"].ToString()=="男") R1.Checked=true; if (rs["ssex"].ToString()=="女") R2.Checked=true; T3.Value=rs["sage"].ToString(); String sdept=rs["sdept"].ToString().Trim(); D1.Items[D1.SelectedIndex].Selected = false; if (sdept=="CS") D1.Items[1].Selected=true; if (sdept=="IS") D1.Items[2].Selected=true; if (sdept=="MA") D1.Items[3].Selected=true; Session["xh"]=rs["sno"]; //保存学号,以便在修改时,可以连学号一起改. label1.Text = page.ToString(); label2.Text = count.ToString(); if (page==1) label3.Text="<font style='family:Arial; font-size: 10pt'>首 条</font> | <font style='family:Arial; font-size: 10pt'>上一条</font> |"; else label3.Text="<a href='1.aspx?pages=1'><font style='family:Arial; font-size: 10pt; color:#0000ff'>首 条</font></a> | "+ "<a href='1.aspx?pages="+(page-1)+"'><font style='family:Arial; font-size: 10pt; color:#0000ff'>上一条</font></a> | "; if (page==count) label4.Text="<font style='family:Arial; font-size: 10pt'>下一条</font> | <font style='family:Arial; font-size: 10pt'>尾 条</font>"; else label4.Text="<a href='1.aspx?pages="+(page+1)+"'><font style='family:Arial; font-size: 10pt; color:#0000ff'>下一条</font></a> | "+ "<a href='1.aspx?pages="+count+"'><font style='family:Arial; font-size: 10pt; color:#0000ff'>尾 条</font></a>"; //连接对象有打开,就必须有关闭。 con.Close(); } 当在“GO”左旁的文本框输入页号时,亦能显示相应页面。若输入非数字字符,则自动清空;若输入的数字小于1,则显示第1页;若输入的数字大于总页数,则显示最后1页,此项功能由javascript脚本实现即可。 四、记录的添加、删除、修改 当单击[清除]按钮时,就能将学号、姓名、性别、年龄清空,系别处显示[请选择系别],此时[添加]、[查询]正常显示,[修改]、[删除]呈灰色。当单击[添加]按钮时,系统依次检查表单各控件是否正确填写,若某个控件未正确填写,就弹出对话框提示用户,并取消此次添加动作,此项功能由javascript脚本实现即可。 当表单各控件正确填写并击[添加]按钮时,系统要检查student表中是否存在着欲添加的学号,若存在,则显示“学号XX已经存在,请重输!”,此时[修改]、[删除]仍呈灰色。若不存在,则向student表插入一条记录后,显示“添加成功”,[修改]、[删除]正常显示,如图2所示。实现的核心代码如下: void bb1(Object sender, EventArgs e) { bool b = test(); if (b == false) Label6.Text = "学号" + T1.Value + "已经存在,请重输!"; else { //创建连接对象 con = new OleDbConnection(str); //创建数据集对象与适配器对象 DataSet DS = new DataSet(); OleDbDataAdapter adapter = new OleDbDataAdapter("select * from student", con); //将适配器对象指定的查询结果置入数据集对象的student表中 adapter.Fill(DS, "student"); //向数据集的student表添加新记录 //先按student表的结构创建一个数据行对象r DataRow r = DS.Tables["student"].NewRow(); r["sno"] = T1.Value; r["sname"] = T2.Value; if (R1.Checked == true) r["ssex"] = R1.Value; if (R2.Checked == true) r["ssex"] = R2.Value; r["sage"] = T3.Value; r["sdept"] = D1.Value; DS.Tables["student"].Rows.Add(r); //用数据集对象的指定表去更新适配器对象指定的数据表 OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter); adapter.InsertCommand = builder.GetInsertCommand(); adapter.Update(DS, "student"); con.Close(); //显示刚才添加的记录,使[修改]、[删除]按钮正常显示。 bind(); Label6.Text = "添加成功!"; b2.Disabled =false; b3.Disabled = false; } } bool test() { con = new OleDbConnection(str); String sql = "select * from student where sno='" + T1.Value + "'"; OleDbCommand cmd = new OleDbCommand(sql, con); con.Open(); OleDbDataReader rs = cmd.ExecuteReader(); if (rs.Read()) return false; else return true; }

图2 添加记录
删除、修改记录的代码可参考添加记录的代码的步骤,再作部分修改即可。 五、结语 后台数据库管理是所有基于Internet的应用系统都必须面对的问题,本文以一个数据表为例,讨论如何对数据表进行高效、规范的增删、修改、查询,并给出记录的逐条显示,记录的添加的完整代码。读者可以自行推广到以ASP、JSP、PHP为开发工具的软件系统中。 参考文献 [1] 徐谡主编.ASP.Net应用与开发案例教程.北京:清华大学出版社,2005 [2] 邵鹏鸣.ASP.Net技术应用教程.北京:电子工业出版社,2005,12 [3] 胡业江.基于ASP.NET的WEB数据库的分页显示,计算机系统应用,2004年第1期
|