基于C#+asp.net+sqlserver的报表管理系统设计与实现(毕业论文+程序源码)
大家好,今天给大家介绍基于C#+asp.net+sqlserver的报表管理系统设计与实现,更多精选毕业设计项目实例见文末哦。
文章目录:
1、项目简介
- 本论文设计采用B/S模式,利用VS2005(c#)、Dreamwear8.0、 MSSQL2000数据库等开发技术,设计与开发了包括报表四级权限管理模块、报表WEB录入页面等功能模块。通过本论文设计开发的功能模块,满足了报表系统中用户分级查询各自报表数据、并且相互不影响的功能需求,实现了报表WEB录入页面简洁直观、报表数据上传方便快捷,同时确保了报表数据的保密性和安全性。
2、资源详情
项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:8971个字25页
包含内容:整套源码+完整毕业论文
很多同学询问怎么下载开题报告、论文答辩、课题报告等ppt模板,给大家找了个好用的下载工具,可以试试:
3、关键词:
VS(c#);报表管理;权限管理4、资源下载
本项目全套源码及配套论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击文章最下方的卡片扫码自助下载。
序号 | 毕业设计全套资源(点击下载) |
---|---|
本项目源码 | 基于C#+asp.net+sqlserver的报表管理系统设计与实现(源码+文档)C#_.net_BS架构_报表管理系统.zip |
5、毕设简介
提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。
引言
省略
报表管理系统考虑到教育局的报表多,数据复杂,使用的用户多,以及用户对系统的操作权限不同等众多问题,要求设计开发一套完整的报表管理系统,以适应不同用户的需要。通过我们对教育局现状的分析,对报表数据以及用户权限等问题的综合考虑,制定出了一套完整的报表方案,完成了报表系统的开发。该系统的完成可以节省更多的人力、物力以及财力,更提高了工作效率以及准确性和安全性。打开报表网站,输入用户名和密码,就可以根据用户权限轻松地完成各种操作,添加报表,删除报表,报表数据录入与删除,查看操作记录,及时修正错误数据等等。由于增加了用户权限管理功能,大大提高了数据的保密性。
2 选题背景
2.1课题起源
省略
2.2课题目的
设计一套符合某教育局的实际情况、完整统一、技术先进、高效稳定、安全可靠的基于B/S架构的报表管理系统。
2.3课题意义
本课题是根据某教育局的实际情况制定出完整方案并开发完成的。该教育局共有70多种类型的表格需要处理,并且对报表的操作分为四种权限(市、县、乡镇、学校),传统的手工管理方式操作复杂,错误率高并且保密性较差。本系统的完成,可以提高该教育局的工作效率以及准确性和安全性。
3相关技术介绍
3.1系统架构
系统在选用结构的时候,采用了B/S模式开发方案。它有如下优缺点:
B/S架构
(1)维护和升级方式简单
目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。
(2)成本降低,选择更多
大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。
(3)应用服务器运行数据负荷较重
由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。
3.2数据传输方案
Web Service
Web Service是一个应用组件,它逻辑性地为其他应用程序提供数据与服务。各应用程序通过网络协议和规定的一些标准数据格式(HTTP、XML、SOAP)来访问Web Service,通过Web Service内部执行得到所需结果。Web Service结合了基于组件开发各个方面的特点、网络技术和.NET程序模型的基础。
Web Service是一种构建应用程序的普遍模型,它可以在任何支持网络通信的操作系统中实施运行。Web Service可以接受和生成Message(消息),Message的形式严格定义了Web Service接口。只要用户能生成和使用Web Service接口所规定的Message,便可以在任何平台上通过程序化语言来执行Web Service。
Web Service在易操作、跨平台等方面具有一定有时,但最大的优势是在于它的SOAP协议是基于XML标准的,因此它可以穿透企业防火墙,这对于开发基于Internet的企业应用有相当的优势。它的结构如下图所示:
图1 Web Service结构图
3.3系统实现环境和技术
本系统在.Net Framework 2.0下实现,采用SQL Server 作为数据提供者。系统开发中使用的集成开发环境是和.Net Framework 2.0配套的Visual Studio ,使用的语言是C#2.0,它们均推出时间不久。
Visual Studio 介绍
Visual Studio 是一系列高效的、智能的开发工具的统称,它拥有一个庞大的产品线,包括面向学生、爱好者、初学者的Express版,面向专家、Visual Basic 6的Standard版,面向顾问、企业开发人员的Professional版和面向架构师的Team System版本。在这些版本中,有些集成了开发软件常用到的东西,比如重构、单元测试、类设计器等等,以方便开发人员快速的设计各类软件。
SQL Server 介绍
SQL Server 是一个全面的数据库平台,使用集成的商业智能工具提供了企业级的数据管理。SQL Server 提供了显著增强的网络功能来构建数据库解决方案。利用这些网络特性,用户可以将企业数据以安全、快捷、高效的方式,通过Web页发布给企业内部相关部门或发布给客户群体。SQL Server 具有完备的Web 功能,企业既可以将数据存储在Web 页面上 或XML 文档内,也可将其存储在数据库中,完全适合构建B2B(商业到商)业或 B2C(商业到客户)模式的电子商务,并且通过支持具有多层体系结构的客户/服务器模式为Web 应用提供高度的可扩展性和高可靠性。SQL Server 与 Windows DNA 平台一起“融洽”地工作,从而使各种规模的企业或组织能够Web上方便地与客户和供应商进行商业贸易并可以把老式系统集成到下一代的商业解决方案中去。除此之外,SQL Server 可以协助公司更好地理解客户或供应商在Web 站点上的行为,并快速发现由数字经济所提供的新的商业机会。SQL Server 2000还有其它重要的地方,例如丰富的编程接口集。扩 展了Transaction SQL(T-SQL)语言的功能,其中包含了像XPath、XML、XSL、XSLT这样的标准。
C#介绍
C#是一种简单的、现代的、面向对象的、类型安全的、版本控制的、兼容的、灵活的、基于组件开发的编程语言,它是作为Visual Studio中的一部分推出。C#既保持了C++中熟悉的语法,还包含了大量的高效代码和面向对象特性,它简化和革新了C++中的类、名字空间、方法重载和异常处理等领域,摒弃了C++的复杂性,更易用,更少出错。它不仅能应用于WEB服务程序的开发,并且还能开发强大的系统级程序。
C#提供了方便的功能,如垃圾收集、类型安全、版本控制等等。仅有的"代价"就是,代码操作默认是类型安全的,不允许指针。光是类型安全就可以搞定了。但是,如果我们需要指针,仍可以通过非安全码使用它们,而且当调用非安全码时,不能含有列集。
4需求分析
4.1功能需求
报表需求
报表需求:根据云南市教育局提供的报表数据显示,共有70多张报表,同时在制作这些报表时,对报表的排版有严格的要求,需考虑报表的查看与打印时的格式,列举部分报表名称如下列表:
用户权限需求
根据用户的需求,系统要提供一定的报表安全性,所以本系统将登陆页面放在了首页。根据需求,该系统分为四级权限,分别是:市级权限,县级权限,乡镇级权限,学校级权限,每级权限可管理所管辖范围内的所有报表数据,如市级权限可管理市下的所有县,乡镇,学校的报表,县级权限可管理县及一下单位的报表数据。每级权限可添加和删除所管辖范围内的用户,如市级权限可添加和删除市下的所有县,乡镇和学校的用户,县级权限可添加或删除县下面所有乡镇、学校的报表数据。
4.2应解决的问题
(1)权限部分的数据库设计和建立。
涉及到地区的绑定问题,输入市时只出现其管辖内的县名、乡镇名、学校名,输入县名时,也只能出现其管辖内的乡镇名等。
(2)用户管理模块的设计
涉及用户的密码修改问题。
(3)报表的制作
根据云南某教育局提供的报表模板进行制作,并显示到管理系统中。报表的外观要与实际报表外观相符合。
(4)四级权限的设计
权限设计主要考虑四个权限的管理问题。权限是一个倒数状问题,不能越级使用权限,并且只有市级用户拥有添加用户的权力。
(5)界面设计
界面设计需要使用专业的图片处理软件和专业的网页制作软件。整个网页的风格要求清新大方,简洁明了。
5数据库设计(权限管理部分)
5.1数据库总表
在开发工程中,数据库的个别地方在设计上存在着一些缺陷,使得软件在开发过程中遇到了一些本可以避免的问题,因此新版本的数据库在设计上进行了适当的优化。
下图是系统中所使用到的所有表,一共有75张(包括69张报表)。
图2 系统中使用到的所有表图
下边就每个表分被给出说明。
⑴ sysCity表 -存储市级城市名。
图3 市级权限表图
① CityID:记录ID(种子);
② CityName: 市级城市名;
⑵ sysCounty表 - 存储县级信息
图4 县级权限表图
① CountyID:记录ID(种子);
② CountyName:县级名称;
③ CityID:市级ID外键;
⑶ sysTown表 - 存储乡镇级信息
图5 乡镇级权限表图
① TownID:记录ID(种子);
② CountyID:县级ID外键;
③ TownName:乡镇名称;
④ CityID:市级ID外键;
⑷ sysSchool表 - 存储学校级信息
图6学校级权限表图
① SchoolID:记录ID(种子);
② CountyID:县级ID外键;
③ TownID :乡镇ID外键;
④ CityID:市级ID外键;
⑤ SchoolName:学校名称;
⑸ syslog表 - 存储操作记录相关数据
图7 用户表图
① userid:记录ID(种子);
② Username:用户姓名;
③ userPwd:用户密码;
④ CountyID:用户所属的县级ID外键;
⑤ TownID:用户所属的乡镇级ID外键;
⑥ CityID:用户所属的市级ID外键;
⑦ SchoolID:用户所属的学校级ID外键;
⑧ UserPower:用户的权限标识符;
⑹ 数据表 - 存储报表数据
图8报表数据表图
① DataID:记录ID(种子);
② Datadate:记录报表数据的时间;
③ Userid:报表的所属的用户ID;
④ CityID:报表所属的市级ID外键;
⑤ CountyID:报表所属的县级ID外键;
⑥ TownID:报表所属的乡镇级ID外键;
⑦ SchoolID:报表所属的学校级ID外键;
⑧ A1-。。。记录报表的数据;
5.2数据库关系图
四级权限关系
数据库里sysCity(市级权限表),sysCounty(县级权限表),sysTown(乡镇级权限表),sysSchool(学校级权限表)这四张表描述了四级权限的关系,从市级权限到学校级权限,每张表的主键都作为下一级权限的外键,建立一对多的关系,在查询方式上,根据四张权限表的关系,建立内联查询,将大大提高了数据库的性能。在每张报表数据里都建立了与用户一一对应的四张权限表的主键ID,这样每张报表都有了报表所属地的权限,对不同权限用户都可控制所对应所属地的报表为了方便软件开发。四张权限关系表图如下:
图9四级权限关系图
数据库关系
数据库总体结构由sysUser(用户表),syslog(操作记录日志表),sysCity(市级权限表),sysCounty(县级权限表),sysTown(乡镇级表),sysSchool(学校权限表),xiaoxue12(报表数据表)…等表构成。这些表都是用sysUser表关联的,在用户权限里,sysCity,sysCounty,sysTown,sysSchool的主键都将写入susUser表的作外键,在syslog表里,userid作外键与sysUser表关联;在xiaoxue12等报表数据表里,sysUser表里的cityid,countyid,townid,schoolid都将写入xiaoxue12等数据表里与sysUser表关联。关系图如下:
图10 数据库关系图
6 建模
6.1 模块设计(权限管理部分)
各子模块的重要功能如下:
模块一:密码模块
该模块主要完成密码的修改部分。用户登陆后,如果需要修改密码,则进入该页面。需要输入三次密码,原密码,新密码和新密码确认。输入完成后可选择确定修改密码,也可取消此次操作。如果原密码错误或新密码确认出错,则此次修改密码失败。密码可以修改多次,但是用户名必须由市级用户确定,一旦用户名确定,其权限也被确定,用户自己不得修改。
密码模块流程图如下:
图11 密码模块流程图
模块二:权限管理部分
权限管理部分主要实现四级权限和用户权限的管理。分为市、县、乡镇、学校四个管理级别。市级用户登陆后,系统会识别出用户名以及其权限。市级用户可以完成市及其下属单位的添加和删除,比如县名,乡镇名等。市级用户还可以添加和删除用户,在添加用户时,需给出用户的密码以及用户拥有的权限,比如市级用户,县级用户等。市级用户可查看修改整个市及下属单位的报表数据,县级用户只能查看县及下属单位数据,以次类推。整个四级权限采用了数据库绑定,实现地区绑定。绑定由市级用户完成。
权限管理流程图如下:
图12权限管理流程图
6.2部署图
图13系统部署图
部署图说明:
⑴ 服务器:.NET Framework 2.0和IIS服务;
⑵ 数据库服务器:需安装有SQL Server 2000。
7 系统实现
7.1配置信息管理
服务器端的配置:
Windows2000/2003 Sever
Microsoft .NET Framework2.0以上
IIS6.0以上
MSSQL2000以上
数据库连接设置
以文本方式打开Web.Config,设置连接数据库服务器的用户名、密码以及服务器的机器名。下图中以高亮形式显示为需要设置的地方。
Uid=“连接数据库服务器的用户名”;
Pwd=“连接数据库服务器的密码”;
Database=“数据库名称”;
Server=“数据库服务器的主机名”。
请按照实际的情况来设置。
图14 数据库连接图
7.2报表的制作
报表的制作采用Dreamweaver 8 专业网页制作工具制作,不仅方便,而且效率相当高。制作过程非常简单,使用Dreamweaver自带的表格工具进行制作。这里就不详细叙述了。报表是根据教育局原有报表进行排版和设计的。在制作中需要注意网页显示以及打印出的效果是否与教育局的实体表格一致,往往需要经过反复修改才能达到实体的效果。报表制作图见图15
7.3页面的制作
页面的制作我使用的是Photoshop cs 9.0和Dreamweaver 8这两种软件。Photoshop cs 9.0是专门用来进行图像处理的软件。通过它可以对图像修饰、对图形进行编辑,以及对图像的色彩处理,另外,还有绘图和输出功能等。Dreamweaver主要用来制作网页文件。网页素材主要是平时积累所得。先选择比较理想的素材,或者是通过制图软件绘制的图片,通过Photoshop图片处理器做一些必要的修改,添加文字和效果,再使用Dreamweaver软件将制作好的网站图片镶嵌到网页中去。其具体过程我就不详细叙述了。
图15 报表制作图
7.4用户登陆功能
在用户登陆后,系统自动识别用户权限,登陆界面设计如下:
图16系统登陆界面
用户登陆后系统自动识别用户的权限,并把用户权限和用户名用Session方法在服务器保存,密码在数据库里采用MD5加密保存,用户登陆成功后,用户名将在客服端用Cookie方式保存,这样避免了用户在登陆系统时重复输入用户名和密码,在其他页面初始化时,将判断客服端的保存的Cookie值,如果值为空将返回登陆界面。
主要代码如下:
string pwd;
pwd = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Password.Text, "MD5"); //密码用MD5加密
drLogin = new scReader("select userid,countyid,townid,schoolid,userpower from sysuser where username='" + UserName.Text + "' and userpwd='" + pwd + "'");//查询用户名和密码是否存在
if (Password.Text != "" && UserName.Text != "" && drLogin.Read())//如果用户名,密码都正确
{
//写入Cookies
HttpCookie MyCookie = new HttpCookie("UserName"); //新建Cookie
MyCookie.Value = UserName.Text; //保存UserName为Cookie
DateTime dt = DateTime.Now; //得到系统时间
TimeSpan ts = new TimeSpan(30, 0, 0, 0); //设置cookie的过期时间为当前时间后的10000分钟
MyCookie.Expires = dt.Add(ts); //添加Cookie的过期时间
Response.Cookies.Add(MyCookie); //保存Cookie的设置
Response.Redirect("Manage.aspx", true); //转向管理页面
}
Else //用户名和名判断失败
{
Response.Write("<script language='javascript'>alert('用户名或密码错误,请重新输入!');</script>"); //提示
UserName.Text = "";
Password.Text = "";
}
drLogin.Close(); //数据库对象关闭
}
7.5四级权限与用户添加
图17权限管理与用户模块界面
四级权限管理与用户的添加根据管理员完成,对应执行相应的代码
主要代码如下:
if (dlAddUser1.SelectedValue.ToString() == "市级权限") //添加市级用户的代码
{
drLogin = new scReader("select cityid from syscity where cityname='" + dlAddUser2.SelectedValue.ToString() + "'");//查询市级ID
if (drLogin.Read())
{
cityid= (int)drLogin["cityid"];//保存CityID
drLogin = new scReader("insert sysuser(countyid,townid,schoolid,userpower,cityid,username,userpwd) values(0,0,0,0," + cityid + ",'" + txtAddUserName.Text + "','" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtAddUserPwd.Text, "MD5") + "')");
//用户名,密码,用户权限写入数据库
Response.Write("<script language='javascript'>alert('添加成功!');</script>");//添加成功
txtAddUserName.Text = "";
txtAddUserPwd.Text = "";
}
}
if (dlAddUser1.SelectedValue.ToString() == "县级权限")//添加县级权限的代码
{
drLogin = new scReader("select countyid,cityid from syscounty where countyname='" + dlAddUser2.SelectedValue.ToString() + "'"); //查询县级ID,市级ID
if (drLogin.Read())
{
countyid = (int)drLogin["countyid"]; //保存县级ID
cityid = (int)drLogin["cityid"]; //保存市级ID
drLogin = new scReader("insert sysuser(townid,schoolid,userpower,cityid,countyid,username,userpwd) values(0,0,1," + cityid + "," + countyid + ",'" + txtAddUserName.Text + "','" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtAddUserPwd.Text, "MD5") + "')");
//写入数据库用户名,密码,权限
Response.Write("<script language='javascript'>alert('添加成功!');</script>");//添加成功
txtAddUserName.Text = "";
txtAddUserPwd.Text = "";
}
}
if (dlAddUser1.SelectedValue.ToString() == "乡镇级权限")//添加乡镇级权限ID
{
drLogin = new scReader("select countyid,townid,cityid from systown where townname='" + dlAddUser2.SelectedValue.ToString() + "'");
//查询乡镇级ID,县级ID,市级ID
if (drLogin.Read())
{
countyid = (int)drLogin["countyid"]; //保存县级IID
townid = (int)drLogin["townid"];//保存乡镇级D
cityid = (int)drLogin["cityid"]; //保存市级ID
drLogin = new scReader("insert sysuser(schoolid,userpower,cityid,townid,countyid,username,userpwd) values(0,2," + cityid +"," + townid + "," + countyid + ",'" + txtAddUserName.Text + "','" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtAddUserPwd.Text, "MD5") + "')");
//写入数据库用户名,密码,权限
Response.Write("<script language='javascript'>alert('添加成功!');</script>"); //添加成功
txtAddUserName.Text = "";
txtAddUserPwd.Text = "";
}
}
if (dlAddUser1.SelectedValue.ToString() == "学校权限")
//添加学校级权限的代码
{
drLogin = new scReader("select countyid,townid,schoolid,cityid from sysschool where schoolname='" + dlAddUser2.SelectedValue.ToString() + "'");
//查询学校级ID,乡镇级ID,县级ID,市级ID
if (drLogin.Read())
{
countyid = (int)drLogin["countyid"]; //保存县级ID
townid = (int)drLogin["townid"]; //保存乡镇级ID
schoolid = (int)drLogin["schoolid"]; //保存学校级ID
cityid = (int)drLogin["cityid"]; //保存市级ID
drLogin = new scReader("insert sysuser(userpower,cityid,schoolid,townid,countyid,username,userpwd) values(3," + cityid + "," + schoolid + "," + townid + "," + countyid + ",'" + txtAddUserName.Text + "','" + System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(txtAddUserPwd.Text, "MD5") + "')");
//写入数据库用户名,密码,权限
Response.Write("<script language='javascript'>alert('添加成功!');</script>");
//添加成功
txtAddUserName.Text = "";
txtAddUserPwd.Text = "";
}
}
}
7.6报表权限控制
在报表录入数据是,同时加入其权限控制。
Userid,CityID,CountyID,TownID,SchoolID,用户在录入报表时,同时在报表数据中写入报表与用户相对应的Userid,CityID,CountyID,TownID,SchoolID这几个值,这样可以很快查出报表数据的所属地。主要代码如下:
if (Request.QueryString["method"].ToString() == "input")
//通过Query得到报表的操作状态
{
sql1 = "insert ";
sql1 += Request.QueryString["table"] + "(";
sql2 = " values(";
try
{
while (true)
//构造sql语句
{
sql2 += "'" + Session["A" + num].ToString() + "',";
sql1 += "A" + num + ",";
num++;
}
}
catch
{
}
if (num == 1)
return;
sql1 += "datadate,cityid,countyid,townid,schoolid,userid)";
//构造sql语句
sql2 += "'" + Request.QueryString["date"].ToString() + "'," + cityid + "," + countyid + "," + townid + "," + schoolid + "," + userid + ")";
//构造sql语句,同时加入数据库表的权限与范围
sql1 = sql1 + sql2;
sql3 = "insert syslog(tablevalue,userid,logdate,property) values('" + Request.QueryString["table"].ToString() + "'," + userid + ",'" + Request.QueryString["date"].ToString() + "','添加')";
//构造数据库日志的SQL语句
Label1.Text = sql3;
}
//报表权限控制代码
8 测试
我的主要工作都放在整个网页的设计和开发方面,每完成一步我都进行了测试,比如数据的写入读出,操作的记录情况等。整个系统完成后又做了一个整体的测试,该系统完全能够正常的运行。
结 论
省略
参考文献
[1] 易向东,陈蓓,万英.C#程序员开发指南[M].北京:中国林业出版社,2006。
[2] Simon Pobinson等.Professional C#[M].北京:清华大学出版社,2002。
[3] James W.Cooper.C# Design Patterns[M].北京:电子工业出版社,2004。
[4] Richard Blum.C# Network Programming[M].北京:电子工业出版社,2003。
[5] 狄龙(Darin Dillon)…NET开发人员调试策略[M].北京:清华大学出版社,2004。
[6] 方睿,刁仁宏,吴四九.网络数据库原理及应用[M].成都:四川大学出版社, 2005。
[7] Chris H.Pappas,William.Murray. C#精髓[M].北京:人民邮电出版社, 2002。
[8] Jeffrey.McManus Chris Kinsman著 常晓波,朱剑平 译.C#开发人员指南——ASP.NET、XML、Web服务与ADO.NET[M].北京:中国电力出版社,2003。
致 谢
省略