用ADO实现三层结构实验
实战案例:使用ADO和三层架构完成登录实例
实战案例:使用ADO技术和三层架构实现用户登录案例【案例描述】现在我们将会通过一个简单的登录案例体会三层架构的开发。
登录是大部分的软件都会拥有的重要功能之一,虽然它不是在软件设计的功能用例之内,但它却是软件不可缺少的一部分,通过登录功能我们可以有效的阻止非授权的用户访问软件中保存的信息。
首先用户通过软件的提示输入用户名和密码,接下来软件将会通过ADO在数据库中使用select语句查询对应的信息,检测数据表中是否有满足用户输入的用户名和密码,并将检测出来的结果返回到记录集中,软件通过读取记录集中保存的信息,检测用户是否可以登录,如果可以登录则显示“允许登录”的提示,否则显示“不允许登录”的提示。
运行效果如下:【三层架构的描述】清楚了上面的需求之后我们可以使用三层架构来描述一下这个简单的功能。
首先我们从表示层出发。
表示层负责提示用户输入用户名和密码,并且接收用户输入的用户名和密码。
接下来通过调用事务层的函数Login,通过Login的形参将用户名和密码传递到事务层进行处理。
接下来事务层将传递的用户名和密码整理到SQL语句中,并调用数据库访问层的函数ExcuteSelect函数将这条SQL语句传递到数据库访问层。
数据库访问层通过ADO技术和数据库建立连接并且执行该SQL语句,将数据库执行出的结果通过RecordSet对象保存起来并且返回RecordSet对象的指针,通过该指针将RecordSet对象传递到事务层。
接下来事务层通过对该RecordSet对象进行“拆包”获取记录集中保存的结果,并判断该结果是否可以满足允许用户登录的条件,如果允许则返回true,否则返回false。
表示层中通过事务层的Login函数的返回值判断用户是否可以登录,如果可以则提示“允许登录”,否则提示“不允许登录”。
在Visual Studio中生成的关系依赖图如下:(具体可见工程中的体系结构图)【数据结构的设计】该案例是一个非常简单的使用用户名和密码设计的案例,因此我们可以设计一个用于保存某个用户的用户名和密码的数据结构,在C++中,用户自定义的数据结构有很多种描述方案,我们此处选择面向对象的描述方法,使用类进行描述,例如User类,其类图如下:【数据库设计】接下来我们可以进行该项目的数据库设计了。
ADO.NET在多层模式下应用的研究
摘 要 : 了结 合 多 层 模 式 系统 的 优 点 来 访 问企 业 级 应 用 中 数 据 库 , 出 了 将 A O.E 为 提 D N T与 多层 模 式相 融合 的 方 法 分 析 了
多层模 式的结构 ,指 出 了需要 利 用 A . T的连接模 式和 断开模 式数据 访 问技术 ,在数据 访 问层构 建独 立 的 S L引 擎组 DO NE Q
中 图法分类 号: P l. T 3 12 5
文献标 识 码 : A
文章 编号 :0 07 2 2 1) 63 2 -4 10 .04(0 0 1.6 1 0
Re e r h a plc to fADO . s a c p iai n o NET n mulim o e i t— d
S UN n p n Re . e g
( ol e f o wa , nig ol e fnoma o eh oo y Naj g2 0 4 , hn) C l g S f r Naj l g Ifr t nT cn lg , n n 10 6 C ia e o t e nC e o i i
d v lp n c iv o dmanan bl f h y tm. e eo me t oa he eg o itia it o t es se t i y
数据库系统实验报告ADO连接数据库
图4-1 新建项目CREATE TABLE course (Cno char(4) NOT NULL,Cname char(40) DEFAULT NULL,Cpno char(4) DEFAULT NULL,Ccredit smallint DEFAULT NULL,PRIMARY KEY (Cno)) ;---- 转存表中的数据'course'--INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('1', '数据库', '5', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('2', '数学', NULL, 2);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('3', '信息系统', '1', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('4', '操作系统', '6', 3);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('5', '数据结构', '7', 4);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUES ('6', '数据处理', NULL, 2);INSERT INTO course (Cno, Cname, Cpno, Ccredit) V ALUESINSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215123', '王敏', '女', 18, 'MA');INSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215125', '张立', '男', 19, 'IS');INSERT INTO student (Sno, Sname, Ssex, Sage, Sdept) V ALUES('200215128', '陈冬', '男', 18, 'IS');---- 限制表'course'--ALTER TABLE courseADD CONSTRAINT course_ibfk_1 FOREIGN KEY (Cpno) REFERENCES course (Cno);---- 限制表'sc'--ALTER TABLE scADD CONSTRAINT sc_ibfk_1 FOREIGN KEY (Sno) REFERENCES student (Sno); ALTER TABLE scADD CONSTRAINT sc_ibfk_2 FOREIGN KEY (Cno) REFERENCES course (Cno);3.在应用程序AdoConnection类的InitInstance()函数中添加如下语句,初始化COM库AfxOleInit();首先找到源文件AdoConnection.cpp。
ADONET数据库操作技术实验报告
实验报告题目:数据库操作技术院系:计算机科学与工程学院【实验题目】数据库操作技术【实验目的】1.掌握服务器验证控件的使用。
2.掌握对象的使用方法。
3.初步熟悉数据绑定控件GridView控件的使用方法。
【实验内容】使用DataReader对象设计一个用户登陆身份验证页面,页面打开时用户输入了正确的用户名和密码后,程序根据用户级别跳转到不同的页面。
建立Microsoft SQL Sever数据库manager.mdb的设计,并在其中创建存放用户信息的Admin表。
表中user字段表示用户名,pwd字段表示密码,level 字段表示用户级别,0表示管理员,1表示普通用户(游客)。
程序设计步骤:(1)设计Web页面Web页面的设计并不复杂,使用列表的形式,将Label和TextBox嵌入其中,如图4-1所示。
图 4-1 Web页面的设计(2)设置对象属性此处需要注意的是,密码部分需要做密文处理,并且不可进行复制粘贴。
(3)编写事件代码页面设计完成后,需要对登录按钮编写相应的时间。
其中包括与数据库的连接,获取输入的用户名和密码,之后与数据库进行匹配,并将匹配的结果返回给用户,同时程序根据用户级别跳转到不同的页面。
程序运行结果如图4-2所示。
图 4-2 程序运行结果【实验代码】Default:<%@Page Language="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default" %><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title>无标题页</title></head><body><form id="form1"runat="server"><div><table border="1"><tr><td colspan="2"style="text-align: center"><strong><span style="font-size: 14pt">登 录</span></strong></td></tr><tr><td style="width: 100px; text-align: center">用户名</td><td style="width: 100px"><asp:TextBox ID="txtUsername"runat="server"Width="146px"></asp:TextBox></td></tr><tr><td style="width: 100px; text-align: center">密 码</td><td style="width: 100px"><asp:TextBox ID="txtPassword"runat="server"TextMode="Password" Width="145px"></asp:TextBox></td></tr><tr><td style="width: 100px"> </td><td style="width: 100px"><asp:Button ID="btnLogin"runat="server"OnClick="btnLogin_Click" Text="登录"/></td></tr></table></div></form></body></html>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 System.Web.UI.HtmlControls;using System.Data.OleDb;public partial class_Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){this.Title = "Reader对象应用示例";txtUsername.Focus();}protected void btnLogin_Click(object sender, EventArgs e){OleDbConnection conn = new OleDbConnection();conn.ConnectionString = "Provider=Microsoft.Jet.OleDb.4.0;" + "Data Source=" + Server.MapPath("App_Data/manager.mdb");conn.Open();string strSQL = "select * from Admin";OleDbCommand com = new OleDbCommand(strSQL, conn);OleDbDataReader dr = com.ExecuteReader();string strUsername="", strPassword="",strLevel="";while (dr.Read()){if (txtUsername.Text == dr["user"].ToString() && txtPassword.Text ==dr["pwd"].ToString()){strUsername = dr["user"].ToString();strPassword=dr["pwd"].ToString();strLevel = dr["level"].ToString();break;}}dr.Close();conn.Close();if (strUsername == ""){Response.Write("<script language=javascript>alert('用户名或密码错!');</script>");return;}if (strLevel == "0"){Session["pass"] = "admin";Response.Redirect("manager.aspx");}else{Session["pass"] = "guest";Response.Redirect("guest.aspx");}}}Guest:<%@Page Language="C#"AutoEventWireup="true"CodeFile="guest.aspx.cs"Inherits="guest"%><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title>无标题页</title></head><body><form id="form1"runat="server"></form></body></html>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;public partial class guest : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){this.Title = "游客页面";string strPass = (string)Session["pass"];if (strPass != "guest"){Response.Redirect("default.aspx");}Response.Write("这是游客页面");}}Manager:<%@Page Language="C#"AutoEventWireup="true"CodeFile="manager.aspx.cs" Inherits="manager" %><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title>无标题页</title></head><body><form id="form1"runat="server"></form></body></html>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;public partial class manager : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){this.Title = "管理页面";string strPass = (string)Session["pass"];if (strPass != "admin"){Response.Write("<script language=javascript>alert('请先登录!');</script>"); Response.Redirect("default.aspx");}Response.Write("这是管理员页面");}}【实验结果】【实验心得】通过本次实验,我的的掌握更加深入,我基本掌握的服务器控件的应用,也基本掌握了GridView控件,熟悉了如何设置这个控件的基本属性,同时也加强了对其他控件的掌握。
实验三新闻发布体系的三层架构DAL层操作步骤1
<add key="WEB_id" value="1"/> <add key="dbtype" value="access"/> <add key="sqlconn" value="User ID=sa;Password=;Data Source=(local);Initial Catalog=news2008;Provider=SQLOLEDB.1;Trusted_Connection=yes;"/> <add key="accessconn" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|newspub.mdb"/> <add key="access64conn" value="Provider=Microsoft.ACE.OLEDB.12.0;Data
3.创建新闻发布系统的业务逻辑层 BLL。
4.创建简单的用户界面层 UI 对 BLL 层的方法进行调用
实验步骤:
1、完善 MODEL 层命名空间
(1) 开始菜单》所有程序》Microsoft Visual Studio 2008》 Microsoft Visual Studio 2008
(2) 在开发环境的左上角点击“文件》打开网站》”,在弹出的对话框中选择 网站, 位置后方输入“D:\newspub1007”,
实验教案:新闻发布系统的三层架构(DAL 层)
实验名称:新闻发布系统的三层架构 实验目的:
《ADONET实验》课件
提供完整的实验代码和示例,供您参考和学习。
通过DataGridView实现数据显示
DataGridView控件介 绍
讲解DataGridView控件的使用 方法和绑定数据的操作。
数据绑定
讲解数据绑定的原理和相关的 操作,让您能够掌握如何将数 据绑定到DataGridView控件上。
实现数据显示操作
提供完整的示例和代码,让您 能够实现ADONET中的数据显 示操作。
实验总结及感想
1 实验结果
介绍实验结果和数据,包 括实验的优点和不足。
2 问题和解决方法
总结在实验中遇到的问题 和解决方法,帮助您更好 地掌握该技术。
3 实验收获及感想
和您分享我对ADONET实 验的经验和感受,希望能 够让您受益匪浅。
参考资料
相关书籍和网站
推荐一些优秀的参考书和网站,供您深入学习。
ADONET实验 PPT课件
为您带来ADONET实验 PPT课件。本课程深入浅出,旨在让您更好地了解 ADONET。
实验介绍
实验背景和目的
介绍课程的背景和目的,探讨ADONET在实际开发中的应用。
实验内容和步骤
详细解释实验的内容和相关的步骤,让您能够了解该课程的主要内容和学习方法。
ADONET概述
ADONET定义及作用
学习ADONET的基础知识,包括定义、作用和优势, 帮助您更好地理解该技术。
ADONET架构
讲解ADONET的三层架构和相关的组件,以便您能 够理解的结构和工作原理。
ADONET组件
介绍中的组件和框架,包括DataSet、 DataAdapter、DataReader等,让您了解如何应用
操作数据库
ADO.NET数据访问层基类的构建
1472006年第9期下学术理论现代企业教育M OD ER N EN TERPR I SE ED U C ATI O N 现代企业教育传统数据访问层存在的问题在编写数据访问代码时总要一遍又一遍地重复编写读数据库连接字符串建立数据库连接对象打开连接创建C om m a nd 对象创建数据适配器创建数据集填充数据集建立表间关联关闭连接这种高重复代码的编写每次就像在写一篇八股文枯燥乏味有时尽管可以通过代码段粘贴来减轻打键盘的一些负担但还要小心修改一些参数在一定程度上还是影响编程效率在总结以前的代码以后决定构建一个数据访问层基类以简化有关的编程基本思路数据访问层无非进行两种操作第一类是查询返回D at a T a bl e 并进行插入更新删除等无返回值的操作我们完全可以创建一个自定义函数将数据库连接字符串数据表名称字符串等作为参数加以处理就可以将建立数据库连接对象打开连接创建Com m a nd 对象创建数据适配器创建数据集及填充数据集这一系列操作交给自定义函数来处理至于第二类是对数据集里面的已有表建立关联操作相对简单总之只要构建一个数据访问层基类包含这些繁琐的代码其余的数据访问层代码继承该数据访问层基类就可以提高编程效率并增加程序的可读性但对第一类情况在调用基类函数时可能要给出存储过程名称和存储过程参数又因为在调用时可能是用存储过程也可能是用SQ L 语句来读取表中的数据所以要综合考虑这两种情形设置一个布尔型参数指示调用时是否使用存储过程如果是存储过程则直接运行否则运行指定的S Q L 语句具体的实现细节及源程序如下实现原理及说明本程序在V isual St ud i o.N et 2003下运行通过且以SQ LServer Pr o-vi de r 为例对O L E Pr ovi der 实现原理基本一样只需作很小改动即可使用基类名称cl sD at abase.vb 函数名称Ful l D at aSet Fr om T abl e 函数功能填充并返回数据集参数说明st r C onnect i on----数据库连接字符串st r T abl eN am e-----数据表的名称字符串st r SQ Lor St or edPr oc ----SQ L 语句字符串或存储过程名称字符串b l nSt or edPr ocedur e-----是否为存储过程dsD at aset -----要填充的数据集名称函数名称Popu l at eD at aSet R el ati on shi p函数功能创建数据集中两表之间的关系(篇幅所限代码从略)参数说明st r T abl e1------第一个表(父表)的名称st r T abl e 2-------第二个表(子表)的名称s t r C o l u mn F r o mTa b l e 1---第一表的主键名称s t r Col um nFr om T abl e2---第二表的外键名称st r R el at i onshi pN am e-------要创建的关联名称dsD at aSet 数据访问层基类的构建刘文化杨小影济源职业技术学院454650)摘要本文对A D O .N ET 访问数据源的环节进行了概括指出原有数据访问层的缺点提出了构建数据访层基类的思路并用两个自定义函数给出了具体的构建途径关键词数据访问层数据集SQ L 语句存储过程关联---------------数据集名称源程序如下I m port sS yst em .d ata I m po rt sS ystem .d ata.sqlC lien t Fun cti onFull D at aSetFrom T able(B yV al st r C on nect i o n A sSt ri n g,_B yv al st rT ab l eN am e A s S t ri ng ,_B yv al st r S Q L or S t ored Pr o c A s Str i n g,_B yval blnStor edProcedure A s B oo l ean,_B yR ef d sD at aSet A s D at aSet)A S D at aSetT ry D i m Sq l co nnA s N ew sqlcli ent.sq l C o nn ecti o n(st rC on nect ion )S ql C onn .O pen ()D imadap t erG en er al A s N ewS ql C l i ent.SqlD ataA d apter ()A dap t erG en eral.T ab l eM app i ng s.add(T ab l e ,st r T ableN am e)D i mcm dt y pe as Sql C l ient.Sql C om m and=N ew_S qlC l ient.S ql C om m and (st r S Q L o r S t oredP r oc,sql C onn )I f bl nStor edPr ocedure T hen `运行指定的存储过程或SQ L 语句C m dT abl e.C om m and T ype=C om m an dT ype.St or edPr ocedur e E lse C m dT abl e.C om m andt ype=C om m andT ype.T ext E ndIf A dapter G en er al.Sel ect C om m and=cm dT ab l e `使用存储过程或SQ L 语句从指定的表中读取的结果填充数据集ad ap ter G en er al.fi ll(d sD ataSet)Sq lC o n n.C l o se()R et urndsD at asetCat ch`捕获错误句柄U nh and l ed E xcepti on H an dl er ()E nd T r y E ndF uncti on sub U nhandl edE xcept i onH andl er ()`错误处理子程序也属于该类的成员M sgbox(发生错误错误代码&E r r .N um be r &_描述&Er r.D es cr i pt i on &错误源&Er r.Sour ce)End s ub `错误发生时对用户显示错误信息总结A DO .ne t 的多层结构决定了其数据访问层的调用有固定的规律可循创建其数据访问层的基类为用户提供统一的调用接口参数可极大地提高编程效率同时也提高了应用程序的可读性和可重用性参考文献A D O .N E T 高级编程Paul D i cki nson 等著张晓明等译中国电力出版社V i sual St udi o.N ET 高手攻略许进标编著袁鹏飞改编人民邮电出版社。
使用ADO操作数据库
使用ADO操作数据库ADO (ActiveX Data Objects) 是一种用于访问数据库的编程技术,它是微软开发的一种组件对象模型(COM)。
ADO 提供了一种统一的方法来访问各种类型的数据源,如关系数据库、Excel 表格、文本文件等。
通过使用 ADO,开发人员可以简化数据库操作,并提高代码的可重复性和可维护性。
ADO 可以在许多编程环境中使用,如 Visual Basic、ASP、C++等,并且可以与不同的数据库进行交互,如 SQL Server、Oracle、MySQL等。
ADO 使用了一种层次化的模型来表示数据库,即连接、命令、记录集和字段。
下面将详细介绍如何使用 ADO 进行数据库操作。
首先,我们需要建立与数据库的连接。
在 ADO 中,可以使用Connection 对象来实现。
连接字符串是连接到数据库所需的关键信息。
例如,在连接到 SQL Server 数据库时,连接字符串通常包含服务器名称、数据库名称、用户名和密码等信息。
以下是一个示例连接字符串的格式:```Provider=SQLOLEDB;Data Source=ServerName;InitialCatalog=DatabaseName;User ID=UserName;Password=Password;```接下来,使用 Connection 对象打开与数据库的连接:```vbDim conn As New ADODB.Connectionconn.Open "连接字符串"``````vbcmd.ActiveConnection = conn```在执行命令之前,我们需要创建一个 Recordset 对象来存储查询结果。
Recordset 对象可以看作是一个二维表,其中包含了从数据库中返回的数据。
以下是创建 Recordset 对象的代码:```vbDim rs As New ADODB.Recordsetrs.Open cmd, , adOpenStatic, adLockReadOnly```在获取了数据库查询结果后,我们可以使用 rs 对象来访问这些数据。
三层架构下ADO.NET数据库访问技术的应用探究
三层架构下数据库访问技术的应用探究作者:钟大利黄宗正来源:《电脑知识与技术》2013年第05期摘要:为了使web应用程序结构更清楚,分工更明确,利于后期维护和升级,三层架构下的数据库访问技术受到越来越多设计者的青睐。
该文主要从技术角度分析了三层结构体系、数据库访问技术以及它们在新闻系统中用户登录模块的设计与实现方法。
关键词:三层架构;;数据库访问;WEB开发中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)05-0961-021 三层架构体系三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。
通常情况下,客户端不直接与数据库进行交互,而是通过COM/DCOM通讯与中间层建立连接,再经由中间层与数据库进行交换。
以微软推荐的分层结构为例,将web应用程序依次划分为数据访问层、业务逻辑层和表示层。
图1 三层系统的分层结构数据访问层负责对数据库的访问,实现对数据表的“查插删改”操作。
业务逻辑层负责业务处理和数据传递,实现业务规则和业务逻辑。
表示层主要负责内容呈现和用户交互。
它从业务逻辑层获取数据并显示,同时将和用户交互的相关数据送回业务逻辑层处理。
模型层作为在层与层之间数据传递的载体,包含了与数据库表象对应的实体类。
各层之间的关系为上层调用下层,上层依赖下层,其中模型层是各层间的载体,各层均依赖模型层。
2 数据库访问技术提供了平台互用性和可伸缩的数据访问,由一系列用于操作数据访问的类组成,通过它可以快速地存取数据,其流程类似生活中的“买苹果“,首先,买家根据卖家信息,和卖家打招呼并告知他购买意愿;其次,告诉卖家要买什么,具体数量等信息;再次,卖家执行买家要求,称好水果;最后,装袋给买家,等待买家进一步处理水果。
过程中,WEB应用程序好比“买家”,数据库好比要买的“水果”,核心对象好比“卖家”, WEB应用程序要想实现对数据库的操作,必须通过和“卖家”核心对象,具体流程如下:1)打招呼:建立并打开连接Using (SqlConnection cn=new SqlConnection(connectionString)){cn.Open();数据库相关操作}2)告知“卖家”要做什么:初始化命令SqlCommand cm=new SqlCommand();cm.Connection=cn;mandText=“相关SQL命令”;cm.Parameters.AddWithValue(“参数名”,参数值);3)卖家称水果:执行命令cm.executeReader()或者cm.executeNonquery()或者cm.executeScalar(),三种方法视具体情况选择。
用ADO.NET实现三层结构
D t S t D t A a t r 主 要 对 象 。 o n c in 象 主 要 a a e和 a a d p e等 C n e to对 提 供 对 数 据 库 的 连 接 功 能 : o m n 对 象 提 供 了从 数 据 库 检 C ma d 索 数 据 、 入 数 据 、 改 数 据 、 除数 据 的功 能 ; a a e d r 插 修 删 D t R a e 对 象 通 过 C m a d 象 提 供 从 数 据 库 检 索 数 据 信 息 的功 能 ; o m n对 D t R a e对 象是 以一种 只读 的 、 aa edr 向前 的、 速 的 方 式 访 问数 快 据 库 的操 作 ; a a e提 供 一 种 断 开 式 的 数 据 访 问机 制 , 可 D t St 它 以看 成 数 据 存 储 器 的 部分 数 据 的本 地 副本 , 以执 行 读 取 、 可 插 入 、 改 和 删 除其 中 的数 据 ; a a d p e 对 象是 D t S t 数 修 DtA atr aae和 据 源 之间 的桥 梁 。 通过 映射 Fl ( 法 来 填充 D t St 象 , 它 i l) 方 aa e对 通过U ̄ t ( J p a e ) 法更 新数 据 源 中的数 据 。 D .E 对 象 读 取 数 7 A ON T 据库示意图如图2 示。 所
置 十 分 重 要 。 位于 数 据 访 问层 与 表 示 层 中 间 , 到 在 数 据 交 它 起
4采 用ADONE 实现 三层架 构 . T
如 果 要 通 过 表 格 控 件 显 示 学 生信 息 表 S u e t i f 的全 tdn no
—
部 或 按 性 别 显 示 的 部 分 记 录 , 以 通 过 采 用 A ON T 数 据 可 D .E 的 库 访 问 , 用 三 层 架 构 程 序 设 计方 法 设 计 应 用 程 序 , 明创 建 使 说 A PN T 层架 构 应 用程 序 的一般 步 骤 和 常用技 巧 。 S.E 三
三层结构
三层结构概述
所谓三层结构是指为了完成某一个功能设计程序时,例 如上述用户注册功能。将原本集中在一个文件中的程序代码 分为几个部分,分别放在不同的文件中,每部分之间通过函 数调用相联系。这些文件根据其中存放的函数代码的分工不 同,而被命名为不同的层。设计模式中的分层架构实现了各 司其职,互不干涉,所以如果一旦哪一层的需求发生了变化 ,就只需要更改相应的层中的代码而不会影响到其它层中的 代码。这样就能更好的实现开发中的分工,有利于组件的重 用。
2 如果不重名,读取consumer对象的各个属性值,向consumer表中插入一条记录。
*/ } }
分析:代码段①是完成程序功能的代码,这段代码主要利用 已经配置好的consumer变量按照一定的规则去数据库中读取 或写入数据。因此可以将代码段封装在一个方法中,该方法有 一个Consumer类型的参数。在代码段①处只要调用该方法 即可。问题是,该方法的定义放在何处。如果放在 Login.aspx.cs文件中,程序还是一层结构,没有改变。所以 要新建一个类文件ConsumerManager.cs,将方法放置其中 ,而在页面文件中,只需将配好的consumer变量作为实参调 用ConsumerManager中的方法即可。这样就将页面上完成程 序功能的部分从页面代码文件中分离出来。从而极大减轻了 页面文件的代码量,使网页美工人员可以用更大的精力美化 网页,而不必关心程序功能究竟如何实现。修改后的代码为 :
为什么需要三层结构
观察上一章章完成的用户注册程序中提交按钮的代码:
protected void 1_Click(object sender, EventArgs e) {
//首先判断用户名是否已经被注册过
string str = "Data Source=localhost;Initial Catalog=sportshop;Integrated Security=True"; SqlConnection conn = new SqlConnection(str); string str1 = " select * from consurm where loginid = @loginid "; SqlCommand cmd = new SqlCommand(str1, conn); SqlParameter[] para = new SqlParameter[]{ //数组中添加一个SqlParameter对象变量元素,该参数定义sql命令在执行时,@LoginId的值由txtLoginId.Text代替 new SqlParameter("@loginid",txtloginid.Text) }; //将该参数数组添加到sqlcommand的Parameters中 cmd.Parameters.AddRange(para); conn.Open(); SqlDataReader rd = cmd.ExecuteReader(); if (!rd.Read()) //说明没找到重名的记录,该用户名可以使用 {
ADO及其在开发C/S结构的数据库系统中的应用研究
储 过程 的参 数 。大多数 数据 提供 者支 持参 数
CREATE PR0CEDURE e sum g t
—
m oney
A DO, 即 A t e a a Ob e t ,是 ci X D t v jc s 微软先 进 的对象层 次上 的数 据操 作技 术 ,它
维普资讯
SIC &EHOOY FR AI CNE T N L OM T N E C GI N O
高 新 技 术
AD O及其在开发 C S结构 的数据库系统 中的应 用研究 /
王 郑 霞 一 肖来 胜 (. 1 广东海 洋大学法学院 2 广东海洋大学信 息学院 广东湛江 5 4 8 ) . 2 0 8
1 —1所示 :
t t t ei ddat e dat tme. ei 化命 令 ,这 些命 令 往 往是 已经定 义 好 了的 , @ sarda e dat tme.@ en @s um mOBe foat UTPUT y l O 只足 在执 行过 程 中调 整参 数 的内 容 。 AS 24R crst 象 如果 执 行 的命 令 是 . e od e 对 个杏 询并 返 回存 放在 表 中的结 果 集 ,这 些 S EC @s mmo e SUM( h r e EL T u nv c ag) 结 果集 将被 保存 在本地 的存 储 区里 , FR0 M c r er o d ha g ec r W HERE i e tm >=@ s ard e t t at AND tme i R crst eo e对象是执行这种存储的 A O对象。 d D nddat e 通 过R crst 可 以操纵 来 自数 据提供 者 <:@ e eo e d 对象 的数 据 ,包 括 修 改 和 更 新 行 、插 人 和 删 除 42在工作站 中执行存储过程 . 行。 下 面 代 码 在工 作 站 中执 行 存 储 过程 25Fed 象 R crst 象 的一 个行 get s mm n v . i 对 l eode 对 u o e ,统 计 一段 时 问 内 的收 费总 由一 个或 者多个 Fe s id对象 组成 , 果把 一个 额 。 l 如 trV R crst 象看 成 一个 二 维 网格 表 ,那 么 eod e 对 Fed 对象 就 是这 些列 。 i s l f ・ 26 E rr 象 E rr . ro 对 ro 对象 包 含 了 AD O Par amet r r t rdat e Pt s a t e; 数 据操 作 时 发生错 误 的详 细描 述 。 Par amet Pt e er r ndd e at ; Par am e e Pt s t r r umm o v; ne 27 P o e t 对 象 Po et . rp ry rp r y对象 代 表 m PC m d一 >A i ct eC v onnect i on= 了一 个 南提 供者 定 义 的 A DO对象 的动态 特 征。 m p o ; /获 得 当前 连 接 Cn / m p C d 一 > C m e xt= m o m an d T 在 A O的对象 和集合 中 , D 有很 多对 数据 g 库 的 状 态和设 定 进行 操 作 的属 性(rp r ) Po et , L” et s mm n y ; / 设 置存 储 过 程 名 y u o e” / 以及 对 数据 库进 行操 作 的 方法 ( ehd。利 M to ) m pC m 一 >C d om m an dT vpe= 用这些 属性 和方 法 就可 以开发 出事 件驱 动 的 a c soe P o ; d md trd rc / 参数 设 定 为 是调 / 数据 库 应 提 供 了一套 高层 次 自 动化 接 口。从 功 能上 来 说 ,A O也 是 一 种 D O ED L B客户程序 ,不过它不依赖于特定的 O ED L B服 务器 ,相 反 ,它 支持 所有 的 O E L D B服 务提 供者 。通过 这 些 O E D L B服务 提 供 者,AD O支持客户 / 服务器模式和基 于 We b的数 据库 应 用 。 A O支持 客户 , D 服务 器模式 和基 于 We b 的数 据操作 ,A O尤其 支持通 过 客户 / D 服务 器模 式 或 者基 于 We 模 式 访 问 微软 的 S b OL S re数 据库 服 务器 。本 文是 在作 者 开发 有 evr 关 应用 系统 实践 的基础 上 , A O 其在 开 对 D 及 发 CS结构 的数据 库 系统 中的 应用 进行 了 的 /
ADO存储过程和三层架构的应用
实验报告实验四:存储过程和三层架构的应用实验目的能熟练使用存储过程对数据进行操作,掌握三层架构开发软件的思想,能熟练应用一、实验内容1.搭建三层架构,实现登陆功能2.使用三层架构完成下面窗体的功能:二、实验环境1.硬件:学生用微机、局域网环境2.软件:Windows XP中文操作系统、SQLSERVER2005及以上版本三、实验调试与结果分析(附上代码,以及运行结果的截图)一:UI层(有多个窗体)using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using .Mail;using .Mime;using ;using System.IO;using MODEL;using BLL;namespace UI{public partial class Form1 : Form{private string email;private string email_pwd;private string usepwd;public Form1(){InitializeComponent();}///<summary>///登录与找回密码///</summary>///<param name="sender"></param>///<param name="e"></param>///private void button1_Click(object sender, EventArgs e){usedatacs use = new usedatacs();ename = textBox_name.Text.Trim();Bll b = new Bll();usedatacs us = b.Login(use);email = us.Email;//获取绑定邮箱email_pwd = us.Email_pwd;//获取绑定邮箱密码usepwd = epwd;//获取学生管理系统登录密码if (ename == ""){errorProvider1.SetError(textBox_name, "帐号不存在或不为空"); }else{if (epwd == textBox_pwd.Text.Trim()){main m = new main(textBox_name.Text);m.Show();this.Hide();}else{errorProvider1.SetError(textBox_pwd, "密码错误");}}}private void Form1_Load(object sender, EventArgs e){errorProvider1.BlinkStyle = ErrorBlinkStyle.AlwaysBlink;toolTip1.ReshowDelay = 0;toolTip1.InitialDelay = 0;toolTip1.SetToolTip(textBox_name,"用户名不超过9位");toolTip1.SetToolTip(textBox_pwd,"密码不超过6位");}private void textBox_name_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox_name,string.Empty);//提示消失}private void textBox_pwd_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox_pwd, string.Empty);//提示消失 }private void button2_Click(object sender, EventArgs e){textBox_name.Text="";textBox_pwd.Text = "";}private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e){// //this.linkLabel1.Links[0].LinkData = "";Sear_pwd pwd = new Sear_pwd();pwd.ShowDialog();}private void groupBox1_Enter(object sender, EventArgs e){}}}using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using BLL;namespace UI{public partial class Formxiangxixinxi : Form{private string sno;private string sex;private string name;public Formxiangxixinxi(){InitializeComponent();}public Formxiangxixinxi(string sno,string name,string sex){this.sno = sno; = name;this.sex = sex;InitializeComponent();}private void Formxiangxixinxi_Load(object sender, EventArgs e){label_name.Text = name;label_sex.Text = sex;label_sno.Text = sno;groupBox1.Text = name + ":同学的详细信息";belWrap = true;listView1.View = View.Details;listView1.Columns.Add("课程号");listView1.Columns.Add("课程名");listView1.Columns.Add("学分");listView1.Columns.Add("成绩");Bll bl = new Bll();DataSet ds = bl.Select_xiangxixinxi(sno);listView1.Items.Clear();for (int i = 0; i < ds.Tables[0].Rows.Count;i++ ){//MessageBox.Show(ds.Tables[0].Rows[i][j].ToString());ListViewItem list = new ListViewItem(new string[]{ ds.Tables[0].Rows[i][0].ToString(), ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][2].ToString(), ds.Tables[0].Rows[i][3].ToString() });listView1.Items.Add(list);}}private void button1_Click_1(object sender, EventArgs e){this.Close();}}}using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using MODEL;using BLL;namespace UI{public partial class Form_suoding : Form{string name;public Form_suoding(){InitializeComponent();}public Form_suoding(string name){ = name;InitializeComponent();}private void button1_Click(object sender, EventArgs e) { if(textBox1.Text==""){errorProvider1.SetError(textBox1,"不能为空");}else{usedatacs use = new usedatacs();ename = name;Bll b = new Bll();usedatacs us = b.Login(use);if(ename!=""){if (epwd == textBox1.Text.Trim()){main m = new main();m.Show();this.Hide();}}}}private void textBox1_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox1,string.Empty);}}}using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using MODEL;using BLL;using System.Data.SqlClient;using System.Text.RegularExpressions;namespace UI{public partial class main : Form{string xuehao;string xingming;string xingbie;string name;public main(){InitializeComponent();}public main(string name){ = name;InitializeComponent();}string path;//存放照片路劲///<summary>///刷新功能///</summary>public void getbin(){Bll bl = new Bll();s use = new s();DataSet ds = null;ds = bl.Select_all(use);try{bindingSource1.DataSource = ds.Tables[0];bindingNavigator1.BindingSource = bindingSource1;dataGridView1.DataSource = bindingSource1;}catch (Exception s){MessageBox.Show(s.Message);}}///<summary>///实现添加///</summary>///<param name="sender"></param>///<param name="e"></param>private void button1_Click(object sender, EventArgs e){if(textBox_sno.Text==""){errorProvider1.SetError(textBox_sno,"不能为空");}else if(textBox_name.Text==""){errorProvider1.SetError(textBox_name, "不能为空");}else if(comboBox1_sex.Text==""){errorProvider1.SetError(comboBox1_sex, "不能为空"); }else if(textBox4_age.Text==""){errorProvider1.SetError(textBox4_age, "不能为空");}else if(textBox5_class.Text==""){errorProvider1.SetError(textBox5_class, "不能为空");}else if (textBox6_sumcredit.Text == ""){errorProvider1.SetError(textBox6_sumcredit, "不能为空");}else if(path==""){errorProvider1.SetError(button5, "选择照片");}else{ int i=0;s use = new s();Bll bl = new Bll();use.Sno = textBox_sno.Text.Trim(); = textBox_name.Text.Trim();use.Sex = comboBox1_sex.Text;use.Age =Convert .ToInt32( textBox4_age.Text.Trim());use.Cla = textBox5_class.Text.Trim();use.Sumgrade = textBox6_sumcredit.Text.Trim();use.Photo = path;try{i = bl.Insert(use);}catch (Exception s){MessageBox.Show(s.Message+"照片路劲为空了亲");}if (i > 0) { MessageBox.Show("插入成功!"); getbin(); }; }}///<summary>///选择照片///</summary>///<param name="sender"></param>///<param name="e"></param>private void button5_Click(object sender, EventArgs e){openFileDialog1.Filter = " *.jpg|*.jpg|*.bmp|*.bmp";if(openFileDialog1.ShowDialog()==DialogResult.OK){path = this.openFileDialog1.FileName;pictureBox1.Image=Image.FromFile(path);}}///<summary>///清空///</summary>///<param name="sender"></param>///<param name="e"></param>private void button6_Click(object sender, EventArgs e) {textBox_sno.Text="";textBox_name.Text = "";comboBox1_sex.Text = "";textBox4_age.Text = "";textBox5_class.Text = "";textBox6_sumcredit.Text = "";pictureBox1.Image = null;path="";}private void main_Load(object sender, EventArgs e){belWrap = true;listView1.View = View.Details;listView1.Columns.Add("课程号",100);listView1.Columns.Add("课程名", 200);listView1.Columns.Add("人数", 150);listView1.Columns.Add("学分", 100);belWrap = true;listView2.View = View.Details;listView2.Columns.Add("学号",120);listView2.Columns.Add("课程号", 120);listView2.Columns.Add("成绩", 120);belWrap = true;listView3.View = View.Details;listView3.Columns.Add("用户名", 100);listView3.Columns.Add("密码", 100);listView3.Columns.Add("邮箱", 100);listView3.Columns.Add("邮箱密码", 100);Bll bl = new Bll();s use = new s();C c=new C();o = "";DataSet ds = bl.Select_all(use);com_c_sno.DataSource = ds.Tables[0];com_c_sno.DisplayMember = "sno";DataSet ds1 = bl.Selectall_c(c);com_c_cno.DataSource = ds1.Tables[0];com_c_cno.DisplayMember = "cno";toolStripStatusLabel2.Text = name;this.dataGridView1.RowsDefaultCellStyle.BackColor = Color.Bisque;this.dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.Beige;}private void timer1_Tick(object sender, EventArgs e){toolStripStatusLabel4.Text = DateTime.Now.ToString();label11.Left = label11.Left-5;if(label11.Left<200){label11.Left = 500;}}private void textBox_sno_TextChanged(object sender, EventArgs e){errorProvider1.SetError(textBox_sno,string.Empty);}private void textBox_name_TextChanged(object sender, EventArgs e){errorProvider1.SetError(textBox_name, string.Empty);}private void comboBox1_sex_TextChanged(object sender, EventArgs e){errorProvider1.SetError(comboBox1_sex, string.Empty);}private void textBox4_age_TextChanged(object sender, EventArgs e){errorProvider1.SetError(textBox4_age, string.Empty);}private void textBox5_class_TextChanged(object sender, EventArgs e){errorProvider1.SetError(textBox5_class, string.Empty);}private void textBox6_sumcredit_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox6_sumcredit, string.Empty);}///<summary>///删除///</summary>///<param name="sender"></param>///<param name="e"></param>private void button2_Click(object sender, EventArgs e){if (textBox_sno.Text == ""){errorProvider1.SetError(textBox_sno, "不能为空");}else{Bll bl = new Bll();s use=new s();use.Sno=textBox_sno.Text.Trim();int i = bl.Delete(use);if(i>0){MessageBox.Show("删除成功");getbin();}}}///<summary>///修改///</summary>///<param name="sender"></param>///<param name="e"></param>private void button3_Click(object sender, EventArgs e){if(textBox_sno.Text==""){errorProvider1.SetError(textBox_sno,"不能为空");}else if(textBox_name.Text==""){errorProvider1.SetError(textBox_name, "不能为空");}else if(comboBox1_sex.Text==""){errorProvider1.SetError(comboBox1_sex, "不能为空");}else if(textBox4_age.Text==""){errorProvider1.SetError(textBox4_age, "不能为空");}else if(textBox5_class.Text==""){errorProvider1.SetError(textBox5_class, "不能为空");}else if (textBox6_sumcredit.Text == ""){errorProvider1.SetError(textBox6_sumcredit, "不能为空");}else if (path == ""){errorProvider1.SetError(button5, "选择照片");}else{int i = 0;s use = new s();Bll bl = new Bll();use.Sno = textBox_sno.Text.Trim(); = textBox_name.Text.Trim();use.Sex = comboBox1_sex.Text;use.Age = Convert.ToInt32(textBox4_age.Text.Trim());use.Cla = textBox5_class.Text.Trim();use.Sumgrade = textBox6_sumcredit.Text.Trim();use.Photo = path;try{i = bl.Update(use);}catch (Exception s){MessageBox.Show(s.Message + "照片路劲为空了亲");}if (i > 0) { MessageBox.Show("更新成功!"); getbin(); }; }}///<summary>///查询///</summary>///<param name="sender"></param>///<param name="e"></param>private void button4_Click(object sender, EventArgs e){if (radioButton3.Checked)//查询全部{comboBox_leixing.Text = "性别";textBox1_shuru.Text = "不用输入";Bll bl = new Bll();s use = new s();DataSet ds = null;ds = bl.Select_all(use);try{bindingSource1.DataSource = ds.Tables[0];bindingNavigator1.BindingSource = bindingSource1;dataGridView1.DataSource = bindingSource1;}catch (Exception s){MessageBox.Show(s.Message);}}if(comboBox_leixing.Text==""){errorProvider1.SetError(comboBox_leixing,"不能为空");}else if (textBox1_shuru.Text == ""){errorProvider1.SetError(textBox1_shuru, "不能为空");}else {if(radioButton1.Checked == false&& radioButton2.Checked == false && radioButton3.Checked == false){MessageBox.Show("选择查询模式");}else{ if(radioButton1.Checked)//精确查询{Bll bl = new Bll();s use = new s();DataSet ds=null;switch (comboBox_leixing.Text.Trim()){case"学号": {use.Sno = textBox1_shuru.Text.Trim();ds= bl.Select(use,"学号");break;}case"姓名":{= textBox1_shuru.Text.Trim();ds = bl.Select(use, "姓名");break;}case"性别":{use.Sex = textBox1_shuru.Text.Trim();ds = bl.Select(use, "性别");break;}case"班级":{use.Cla = textBox1_shuru.Text.Trim();ds = bl.Select(use, "班级");break;}}try{bindingSource1.DataSource = ds.Tables[0];bindingNavigator1.BindingSource = bindingSource1; dataGridView1.DataSource = bindingSource1;}catch (Exception s){MessageBox.Show(s.Message);}}if (radioButton2.Checked)//模糊查询{Bll bl = new Bll();s use = new s();DataSet ds = null;switch (comboBox_leixing.Text.Trim()){case"学号":{use.Sno = textBox1_shuru.Text.Trim();ds = bl.Select_mohu(use, "学号");break;}case"姓名":{ = textBox1_shuru.Text.Trim();ds = bl.Select_mohu(use, "姓名");break;}case"性别":{use.Sex = textBox1_shuru.Text.Trim();ds = bl.Select_mohu(use, "性别");break;}case"班级":{use.Cla = textBox1_shuru.Text.Trim();ds = bl.Select_mohu(use, "班级");break;}}try{bindingSource1.DataSource = ds.Tables[0];bindingNavigator1.BindingSource = bindingSource1; dataGridView1.DataSource = bindingSource1;}catch (Exception s){MessageBox.Show(s.Message);}}}}}private void comboBox_leixing_SelectedIndexChanged(object sender, EventArgs e){errorProvider1.SetError(comboBox_leixing, string.Empty);}private void textBox1_shuru_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox1_shuru, string.Empty);}///<summary>///显示所有///</summary>///<param name="sender"></param>///<param name="e"></param>private void dataGridView1_CellClick(object sender,DataGridViewCellEventArgs e){ Byte[] by=new byte[0];try{textBox_sno.Text =dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();textBox_name.Text =dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();comboBox1_sex.Text =dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();textBox4_age.Text =dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();textBox5_class.Text =dataGridView1.Rows[e.RowIndex].Cells[4].Value.ToString();textBox6_sumcredit.Text =dataGridView1.Rows[e.RowIndex].Cells[5].Value.ToString();by =(byte[])dataGridView1.Rows[e.RowIndex].Cells[6].Value; System.IO.MemoryStream memorystream = newSystem.IO.MemoryStream(by);pictureBox1.Image = Image.FromStream(memorystream);}catch (Exception s){MessageBox.Show(s.Message);}}///<summary>///显示菜单///</summary>///<param name="sender"></param>///<param name="e"></param>private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e){if(e.Button==MouseButtons.Right ){if(e.RowIndex>=0){if(dataGridView1.Rows[e.RowIndex].Selected==false ){dataGridView1.ClearSelection();dataGridView1.Rows[e.RowIndex].Selected = true;}if(dataGridView1.SelectedRows.Count==1){dataGridView1.CurrentCell =dataGridView1.Rows[e.RowIndex].Cells[0];// MessageBox.Show(dataGridView1.CurrentCell.Value.ToString());Formxiangxixinxi form = new Formxiangxixinxi();try{xuehao= dataGridView1.CurrentCell.Value.ToString();xingming =dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();xingbie =dataGridView1.Rows[e.RowIndex].Cells[2].Value.ToString();}catch (Exception s){MessageBox.Show(s.Message);}}contextMenuStrip1.Show(MousePosition.X, MousePosition.Y);}}}private void查看详细信息ToolStripMenuItem_Click(object sender, EventArgs e){Formxiangxixinxi form = newFormxiangxixinxi(xuehao,xingming,xingbie);form.ShowDialog();}//添加课程表信息private void button7_Click(object sender, EventArgs e){if (textBox_cno.Text == ""){errorProvider1.SetError(textBox_cno, "不能为空");}else if (textBox_cname.Text == "")errorProvider1.SetError(textBox_cname, "不能为空");}else if(textBox_sconut.Text==""){errorProvider1.SetError(textBox_sconut, "不能为空");}else if (textBox_credit.Text == ""){errorProvider1.SetError(textBox_credit, "不能为空");}else{Bll bl = new Bll();C c = new C();o = textBox_cno.Text.Trim();ame = textBox_cname.Text.Trim();c.Scount =Convert.ToInt32( textBox_sconut.Text.Trim());c.Credit = textBox_credit.Text.Trim();int i = bl.Insert_C(c);if(i>0){MessageBox.Show("插入成功");}}}private void textBox_cno_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox_cno,string.Empty);}private void textBox_cname_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox_cname, string.Empty);}private void textBox_sconut_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox_sconut, string.Empty);}private void textBox_credit_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(textBox_credit, string.Empty);}///<summary>///删除课程信息///</summary>///<param name="sender"></param>///<param name="e"></param>private void button8_Click(object sender, EventArgs e){if (textBox_cno.Text == ""){errorProvider1.SetError(textBox_cno, "不能为空");}else{Bll bl = new Bll();C c = new C();o = textBox_cno.Text.Trim();int i = bl.Delete_C(c);if(i>0){MessageBox.Show("删除成功");}}}///<summary>///修改课程信息///</summary>///<param name="sender"></param>///<param name="e"></param>private void button9_Click(object sender, EventArgs e){if (textBox_cno.Text == ""){errorProvider1.SetError(textBox_cno, "不能为空");}else if (textBox_cname.Text == ""){errorProvider1.SetError(textBox_cname, "不能为空");}else if (textBox_sconut.Text == ""){errorProvider1.SetError(textBox_sconut, "不能为空");}else if (textBox_credit.Text == ""){errorProvider1.SetError(textBox_credit, "不能为空");}else{Bll bl = new Bll();C c = new C();o = textBox_cno.Text.Trim();ame = textBox_cname.Text.Trim();c.Scount = Convert.ToInt32(textBox_sconut.Text.Trim());c.Credit = textBox_credit.Text.Trim();int i = bl.Update_C(c);if (i > 0){MessageBox.Show("修改成功");}}}///<summary>///查询课程信息///</summary>///<param name="sender"></param>///<param name="e"></param>private void button10_Click(object sender, EventArgs e){if (textBox_cno.Text == ""){errorProvider1.SetError(textBox_cno, "不能为空");}else{Bll bl = new Bll();C c = new C();o = textBox_cno.Text.Trim();DataSet ds = bl.Select_c(c);listView1.Items.Clear();for (int i = 0; i < ds.Tables[0].Rows.Count;i++ ){ListViewItem list = new ListViewItem(new string[]{ ds.Tables[0].Rows[i][0].ToString(), ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][2].ToString(), ds.Tables[0].Rows[i][3].ToString() }); listView1.Items.Add(list);}}}public void Select_c_all(){Bll bl = new Bll();C c = new C();o = "";DataSet ds = bl.Selectall_c(c);listView1.Items.Clear();for (int i = 0; i < ds.Tables[0].Rows.Count; i++){ListViewItem list = new ListViewItem(new string[]{ ds.Tables[0].Rows[i][0].ToString(), ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][2].ToString(), ds.Tables[0].Rows[i][3].ToString() }); listView1.Items.Add(list);}}private void button11_Click(object sender, EventArgs e){Select_c_all();}private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e){}///<summary>///删除选课信息///</summary>///<param name="sender"></param>///<param name="e"></param>private void button12_Click(object sender, EventArgs e){Bll bl = new Bll();Sc sc = new Sc();o = com_c_cno.Text;sc.Sno = com_c_sno.Text;int i = bl.Delete_Sc(sc);if(i>0){MessageBox.Show("删除成功");}}///<summary>///选课表添加///</summary>///<param name="sender"></param>///<param name="e"></param>private void button13_Click(object sender, EventArgs e){if (text_sc_grade.Text == ""){errorProvider1.SetError(text_sc_grade, "不能为空"); }else{Bll bl = new Bll();Sc sc = new Sc();o = com_c_cno.Text;sc.Sno = com_c_sno.Text;sc.Grade = text_sc_grade.Text.Trim();int i = bl.Insert_Sc(sc);if (i > 0){MessageBox.Show("添加成功");}}}private void text_sc_grade_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(text_sc_grade,string.Empty);}///<summary>///选课表的修改///</summary>///<param name="sender"></param>///<param name="e"></param>private void button14_Click(object sender, EventArgs e){if (text_sc_grade.Text == ""){errorProvider1.SetError(text_sc_grade, "不能为空");}else{Bll bl = new Bll();Sc sc = new Sc();o = com_c_cno.Text;sc.Sno = com_c_sno.Text;sc.Grade = text_sc_grade.Text.Trim();int i = bl.Update_Sc(sc);if (i > 0){MessageBox.Show("修改成功");}}}private void button15_Click(object sender, EventArgs e){Bll bl = new Bll();Sc sc = new Sc();o = com_c_cno.Text;sc.Sno = com_c_sno.Text;DataSet ds = bl.Select_Sc(sc);listView2.Items.Clear();for (int i = 0; i < ds.Tables[0].Rows.Count; i++){ListViewItem list = new ListViewItem(new string[]{ ds.Tables[0].Rows[i][0].ToString(), ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][2].ToString() });listView2.Items.Add(list);}}private void button16_Click(object sender, EventArgs e){Bll bl = new Bll();Sc sc = new Sc();o ="";sc.Sno = "";DataSet ds = bl.Selectall_Sc(sc);listView2.Items.Clear();for (int i = 0; i < ds.Tables[0].Rows.Count; i++){ListViewItem list = new ListViewItem(new string[]{ ds.Tables[0].Rows[i][0].ToString(), ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][2].ToString() });listView2.Items.Add(list);}}///<summary>///修改密码///</summary>///<param name="sender"></param>///<param name="e"></param>private void button19_Click(object sender, EventArgs e){if (t_name.Text == ""){errorProvider1.SetError(t_name, "不能为空");}else if (t_pwd.Text == ""){errorProvider1.SetError(t_pwd, "不能为空");}else if (t_email.Text == ""){errorProvider1.SetError(t_email, "不能为空");}else if (t_emailpwd.Text == ""){errorProvider1.SetError(t_emailpwd, "不能为空");}else{Bll bl = new Bll();usedatacs use = new usedatacs();ename = t_name.Text.Trim();epwd = t_pwd.Text.Trim();use.Email = t_email.Text.Trim();use.Email_pwd = t_emailpwd.Text.Trim();int i = bl.Update_usedatacs(use);if(i>0){MessageBox.Show("更新成功");}}}private void t_name_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(t_name,string.Empty);}private void t_pwd_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(t_pwd, string.Empty);}private void t_email_TextChanged(object sender, EventArgs e){errorProvider1.SetError(t_email, string.Empty);Regex rg = newRegex("^\\s*([A-Za-z0-9_-]+(\\.\\w+)*@(\\w+\\.)+\\w{2,5})\\s*$");if (rg.IsMatch(t_email.Text.Trim())){t_email.BackColor = Color.White;//正确为白色}else{t_email.BackColor = Color.Pink;//错误为粉红色}}private void t_emailpwd_TextChanged(object sender, EventArgs e) {errorProvider1.SetError(t_emailpwd, string.Empty);}private void button18_Click(object sender, EventArgs e){if (t_name.Text == ""){errorProvider1.SetError(t_name, "不能为空");}else{Bll bl = new Bll();usedatacs use = new usedatacs();ename = t_name.Text.Trim();int i = bl.Delete_usedatacs(use);if (i > 0){MessageBox.Show("删除成功");}}}private void button20_Click(object sender, EventArgs e) {if (t_name.Text == ""){errorProvider1.SetError(t_name, "不能为空");}else if (t_pwd.Text == ""){errorProvider1.SetError(t_pwd, "不能为空");}else if (t_email.Text == ""){errorProvider1.SetError(t_email, "不能为空");}else if (t_emailpwd.Text == ""){errorProvider1.SetError(t_emailpwd, "不能为空");}else{Bll bl = new Bll();usedatacs use = new usedatacs();ename = t_name.Text.Trim();epwd = t_pwd.Text.Trim();use.Email = t_email.Text.Trim();use.Email_pwd = t_emailpwd.Text.Trim();int i = bl.Insert_usedatacs(use);if (i > 0){MessageBox.Show("插入成功");}}}private void button17_Click(object sender, EventArgs e) {if (t_name.Text == "")。
ADO三层结构
的组成:由.NET Framework和Dataset组成。
其中.NET Framework提供了四个核心的对象Connection::负责连接数据库的Command:执行命令的dataReader:数据阅读器dataAdapter:填充datasetdataset的作用:专门独立与任何数据源,就是存储查到的数据命名空间的引用:使用using system.data.sqlClient核心对象:Sqlconnection,sqlcommand,sqldataReader,sqldataAdapterConnection对象:数据库连接字符串:语法:Sqlconnection con=new sqlconnection();Con.connectionstring=”data source=.;initial caatalog=数据库的名字;user id=用户的名字;password=密码”打开服务器和关闭服务器Con.open()和con..close()异常处理Try{}catch{}finally{}异常特殊:特殊的错误,一般情况下代码执行是正常的,只是在特殊的情况下生成的错误其中try一定要有,catch和finally可以必须存在一个。
Command的对象和主要方法:Connection:连接数据对象Commandtext:可以是存储过程,可以使增删改查的sql语句,命令文本返回的是字符串的格式Executenonquery()执行SQl语句返回受影响的行数Executereader()执行查询命令返回的datareader的对象Executescalar()执行SQL命令并返回单个值。
三层架构实验报告
实验学院:课程名称:专业班级:学生姓名:学生学号:指导教师:完成时间:2013年6月5日实验内容:一个数据库中,有两个数据表。
其中custom,department表如下结构。
Custom与department的关系如下图所示。
实验要求:设计一个基于Web的应用程序,采用3层结构的方式实现对custom,department表中的记录进行:插入、修改、删除、查询的操作。
(写出详细的设计文档或实验报告)实验步骤1.创建数据库命明为ThreeTest建立custom表建立department表custom表的数据department表的数据创建BLL类库,负责系统领域业务的处理Model(数据实体)和ThreeTest(表示层)。
2.Model(数据实体类)封装的实体类一般用于映射数据库的数据表或视图,该类包括custom表和department表的字段属性信息custom.cs department.cs2.DBUtility(数据库操作类)DBUtility类中包括SQLHelper封装数据库的操作。
3.DAL(数据访问层)实现对数据库的访问custom.csdepartment.cs4.BLL(业务逻辑层)负责系统领域业务的处理。
custom.csdepartment.cs5.Web(表示层)实现与用户的交互Login.aspx实现用户登录show.aspxAdd.aspxDAdd.aspxUp.aspxDUp.aspxDel.aspxDDel.aspx。
使用三层框架搭建一个CRUD(增删改查)操作的程序使用UML分析学生成绩管理系统
编号《.NET架构与程序设计》课程设计题目1: _使用三层框架搭建一个CRUD(增删改查)操作的程序题目2:使用UML分析学生成绩管理系统二级学院计算机科学与工程专业软件工程班级软件工程6班学生姓名 xxx 学号 36542指导教师 2222评阅教师 2222时间 2017年1月一、课程设计概述:本次数据结构课程设计共完成三个题:1使用三层框架搭建一个CRUD(增删改查)操作的程序、2使用UML分析学生成绩管理系统。
使用语言:C#编译环境:VS2013二、课程设计题目使用三层框架搭建一个CRUD(增删改查)操作的程序[实验目标]熟悉三层框架的创建和每层相互的引用关系。
熟悉技术,实现对表的CRUD。
熟悉GrifView的使用。
[实验内容]练习三层框架编程,实现对宠物表的增加删除查询和修改,实现对数据表格的分页。
三层框架是表示层、业务逻辑层、数据访问层。
[依赖关系][运行结果及分析]程序运行界面插入页面编辑状态编辑成功[存储结构]Category表Product表[三层架构代码]Modelpublic class PetProduct{private string productId;private string name;private string descn;private string image;private PetCategory petCategory;public PetProduct(string productId,string name,string descn,string image,PetCategory petCategory){this.productId = productId; = name;this.descn = descn;this.image = image;this.petCategory = petCategory;}public string ProductId{get { return productId; }set { productId = value; }}public string Name{get { return name; }set { name = value; }}public string Descn{get { return descn; }set { descn = value; }}public string Image{get { return image; }set { image = value; }}public PetCategory PetCategory{get { return petCategory; }set { petCategory = value; }}BLLpublic class PetProductService{public List<PetModel.PetProduct> getData(){return new PetCategroyDAO().getData();}public static DataTable selectAllfromproduct_BLL(){return PetCategroyDAO.selectAllfromProduct_DAL(); }public static int deleteProductById(String id){return PetProductDAO.DeleteProductByProductID(id); }public static int update(PetProduct pro){return PetProductDAO.update(pro);}public static int insert(PetProduct pro){return PetProductDAO.insert(pro);}DALpublic class PetProductDAO{public static DataTable selectAllfromProduct_DAL(){return DBHelper.getData("selectAllfrompruduct");}public static int DeleteProductByProductID(string id){SqlParameter[] values = { new SqlParameter("@pruductId", 1) };values[0].Value = id;return DBHelper.ExecuteCommand("DeleteProductByPruductID", values); }public static int update(PetProduct pro){SqlParameter[] values = {new SqlParameter("@ProductById","1"), new SqlParameter("@Name","1"),new SqlParameter("@Descn","1")};values[0].Value = pro.ProductId;values[1].Value = ;values[2].Value = pro.Descn;return DBHelper.ExecuteCommand("UpdateProductByID", values);}public static int insert(PetProduct pro){SqlParameter[] values = {new SqlParameter("@ProductId","1"),new SqlParameter("@CategoryId","1"),new SqlParameter("@Name","1"),new SqlParameter("@Descn","1"),new SqlParameter("@Image","1")};values[0].Value = pro.ProductId;values[1].Value = pro.ProductId;values[2].Value = ;values[3].Value = pro.Descn;values[4].Value = @"/IMG/bird.jpg";return DBHelper.ExecuteCommand("InsertProduct", values); }}题目二使用UML分析学生成绩管理系统[问题描述][需求分析]1.编制用例图2.编制业务模型类图3.为每个用例编制时序图[概要设计]功能功能:此学生成绩管理系统基本能够实现学生成绩的查询的功能本系统对功能的要求,如下:1. 输入一个同学的姓名和学号,系统能够输出学生所在的学院、班级、成绩等学生信息2.对于已经录入学生成绩管理系统的学生信息可以进行修改,例如:删除、添加。
实验报告三层架构
软件开发环境与工具实验报告题目:三层架构实验序号:实验4学号:姓名:班级:日期:一、实验目的通过本次实验,了解了三层架构实验的具体步骤和方法,掌握了实验的具体内容。
二、实验原理设计一个模拟登录界面,通过登录(姓名与密码)进入用户管理界面。
用户管理界面创建四个用户操作功能,浏览.修改.新增.删除。
并将操作中数据变化同步到数据库,实现数据库与用户管理的同步一体化。
三、实验过程核心代码Imports System.Data.SqlClientPublic Class UserDaoPublic conn As New SqlConnectionPublic Function getData() As DataSetDim ds As New DataSetconn.ConnectionString ="server=100.100.28.24;uid=sa;pwd=root;database=test"conn.Open()Dim se As String = "select * from userMessage "Console.WriteLine(se)Dim da As New SqlDataAdapter(se, conn)da.Fill(ds, "userMessage")conn.Close()Return dsEnd FunctionPublic Function update(ByVal userId As String, ByVal password As String,ByVal oldUserId As String) As IntegerDim conn As New SqlConnectionconn.ConnectionString ="server=100.100.28.24;uid=sa;pwd=root;database=test"conn.Open()Dim updateString As String = "UPDATE userMessage set userId='" & userId & "',password='" & password & "' where userId='" & oldUserId & "'"Console.WriteLine(updateString)Dim command As SqlCommand = New SqlCommand(updateString, conn)Dim result As Integer = command.ExecuteNonQuery()conn.Close()Return resultEnd FunctionPublic Function insert(ByVal userID As String, ByVal password As String) As IntegerDim conn As New SqlConnectionconn.ConnectionString ="server=100.100.28.24;uid=sa;pwd=root;database=test"conn.Open()Dim insertString As String = "insert into userMessage values('" & userID & "','" & password & "')"Console.WriteLine(insertString)Dim command As SqlCommand = New SqlCommand(insertString, conn)Dim result As Integer = command.ExecuteNonQuery()conn.Close()Return resultEnd FunctionPublic Function delete(ByVal userId As String) As BooleanDim conn As New SqlConnectionconn.ConnectionString ="server=100.100.28.24;uid=sa;pwd=root;database=test"conn.Open()Dim insertString As String = "DELETE from userMessage where userId=('" & userId & "')"Dim command As SqlCommand = New SqlCommand(insertString, conn)Dim result As Integer = command.ExecuteNonQuery()conn.Close()Return resultEnd FunctionPublic Function getUserPassword(ByVal userName) As StringConsole.WriteLine("UserDao")Dim data As DataSetDim password As String = ""data = getData()'Console.WriteLine(userName)For Each row As DataRow In data.Tables("userMessage").Rows Console.WriteLine("userID" + row("userID") + "userName" + userName)If row("userId").ToString.Trim.Equals(userName) ThenConsole.WriteLine("Password")password = row("password").ToString()End IfNextConsole.WriteLine("从䨮数ºy据Y库a中D取¨?出?的Ì?密¨¹码?是º?" + password)Return passwordEnd FunctionEnd Class四.实验总结通过本次实验,掌握了三层架构实验具体步骤,实验过程出现了一些问题,但都得到解决。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广东科学技术职业学院
计算机工程技术学院(软件学院)
实验报告
专业软件技术班级09软件1班成绩评定______
学号43 姓名刘钊(合作者____号____) 教师签名段班祥实验十一题目三层结构(1)第十五周星期五第12 节
主窗体菜单如下图:
实现思路及关键代码:
(1)在数据访问层用DataSet封装从数据库中取出的所有教员信息
(2)根据所选性别在业务逻辑层使用DataView对教员信息进行筛选、排序
(3)在表示层使用DataGridView控件展示信息
四、思考题(由老师在上机前出好题目,学生通过实验后再回答)。