(搬运).net起步 (构建 T ASP.NET 三层架构实例演示)

开发环境:VS2010+SQLServer2008

功能:简单实现显示一张表的记录。

具体步骤:

1、打开 sql server2008

在里面创建名为 school 的数据库,然后在数据库中创建 grade 表,里面有两个字段 id(自增字段),name(varchar(50)),然后在该表中任意插入几条记录。

2、创建一个文件夹,用来存储该程序,假设放在“E:\test”文件夹下。

3、打开 VS2010,创建解决方案:

步骤:文件--新建--项目,在弹出来的“新建项目”对话框中,已安装的模板中选择“其他项目类型”--“Visual Studio 解决方案”,然后在右边选择“空白解决方案”,其次在名称中输入“MySchool”,然后在位置中选择上面的新建文件夹:E:\test,然后点击“确定”。

4、创建一个 ASP.NET Web 应用程序,用来显示 grade 中的所有内容。

步骤:文件--新建--项目,在弹出来的“新建项目”对话框中,已安装的模板中选择“VisualC#”--“ASP.NET 空 Web 应用程序”,名称处取名叫“MySchool”,位置选择:e:\test\ myschool,解决方案中选择“添加到解决方案”--然后点击“确定”。
此时,右边的解决方案资源管理器中多出了一个 MyShcool。这里双击里面的 web.config 文件,向里面添加数据库连接代码。
	<connectionStrings>
		<add name="ConnectionString" connectionString="Integrated Security=sspi;server=.;database=school;connect timeout=30"/>
	</connectionStrings>

5、Model 层,直接对数据库的表中的字段赋值和取出某个字段中的值的层。

步骤:在解决方案“MySchool” (工具->选项->项目和解决方案->总是显示显示解决方案) 上单击右键选择“添加”> 新建项目,已安装的模板中选择“Visual C#”--“类库”,名称:MySchoolModel;选择添加到解决方案;位置:E:\test\MySchool,
然后点击“确定”。此时右边的解决方案资源管理器中多了一个 MySchoolModel。添加一个新类 Grade.cs;然后双击这个文件,左边出现它的所有代码。然后在该类中添加如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Model
{
    class Grade
    {
        private int _id = 0;
        private string _name = "";
        public int ID
        {
            set { _id = value; }
            get { return _id; }
        }
        public string GradeName
        {
            set { _name = value; }
            get { return _name; }
        }
    }
}

6、创建一个类库 Utility 来完成数据库底层操作

步骤:在解决方案“MySchool” 上单击右键选择“添加” 新建项目,已安装的模板中选择“Visual C#”--“类库”,名称: Utility;解决方案:选择添加到解决方案;位置:E:\test\myschool,然后点击“确定”。此时右边的解决方案资源管理器中多了一个 Utility。添加一个新类SQLHelper.cs;然后双击这个文件,左边出现它的所有代码。 这里开始做引用了。
操作过程:
右击 Utility 目录下面的引用--添加引用。在弹出的添加引用对话框中,选择.net 选择卡,找到System.Configuration,再点击确定。
这样,右边的引用中就多了 System.Configuration 了。引用这个文件的目的是获取 web.config文件中的值,这里主要用来获取连接数据库字符串。
此时我们开始处理 SQLHelper.cs 文件了,在这个文件顶部添加如下引用:
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
然后定义相关连接数据库函数,如下:
        public static string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

        public static int ExecuteSql(string SQLSting, params SqlParameter[] cmdParms)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    try
                    {
                        PrepareCommand(cmd, connection, null, SQLSting, cmdParms);
                        int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        return rows;
                    }
                    catch (System.Data.SqlClient.SqlException E)
                    {
                        throw new Exception(E.Message);
                    }
                }
            }
        }
        public static DataSet Query(string SQLStirng, params SqlParameter[] cmdParms)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand cmd = new SqlCommand();
                PrepareCommand(cmd, connection, null, SQLStirng, cmdParms);
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    try
                    {
                        da.Fill(ds, "ds");
                        cmd.Parameters.Clear();
                    }
                    catch (System.Data.SqlClient.SqlException ex)
                    {
                        throw new Exception(ex.Message);
                    }
                    return ds;
                }
            }
        }
        private static void PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, string cmdText, SqlParameter[] cmdParms)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();
            cmd.Connection = conn;
            cmd.CommandText = cmdText;
            if (trans != null)
            	cmd.Transaction = trans;
                cmd.CommandType = CommandType.Text;
                if (cmdParms != null)
                {
                    foreach (SqlParameter parm in cmdParms)
                        cmd.Parameters.Add(parm);
                }
            
        }
PS:
1.ConfigurationManager 类:
提供对客户端应用程序配置文件的访问。




2.params:
使用params关键字可以指定采用数目可变的参数的方法参数。
3.SqlParameter 类:
表示 SqlCommand 的参数,或者其与 DataSet 列的映射。
4.SqlCommand 类:
表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。
SqlCommand.Paramters.Clear()方法:从SqlParameter中移除所有的SqlParameterCollection对象。
5.SqlConnection 类:
表示到 SQL Server 数据库的打开连接。
6.SqlParameterCollection 类:
表示与 SqlCommand 关联的参数的集合以及各个参数到 DataSet 中列的映射。
7.SqlDataAdapter 类:
表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
第二个参数 String是指定DataSet 里表的名字,例如 sqlDataAdapter.fill(DataSet,"学生表") 指定后,以后就可以这样调用这张表 DataSet.Tables["学生表"] .
第二个参数可以不要的,如果不要第二个参数 String  那你调用这张表只能通过索引号,例如 DataSet.Tables[0]  如果填充的表比较多的话,用这个参数比较容易管理和调用。
8.ConnectionState 枚举
描述与数据源连接的当前状态。
9.SqlTransaction 类
表示将在 SQL Server 数据库中进行的 Transact-SQL 事务。
10.CommandType 枚举
指定如何解释命令字符串。

7、数据访问层(MySchoolDAL),该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。

创建的步骤如第 6 条,名称:MySchoolDAL;解决方案:添加到解决方案;路径为e:\test\MySchool。在该项目下添加新类为 GradeService.cs。这里要对 Model 层进行操作,所以要引用 Model 层。
方法,右击引用--添加引用--选择“项目”选项卡--选择 MySchoolModel--确定;用同样的方法添加对 Utility 项目引用。然后在 GradeService.cs 的顶部加上 using MySchoolModel(Model 的命名空间);由于这层还要调用数据库进行操作,需要加上 using Utility;(数据库实际操作在这里,Utility 项目的命名空间是什么这里就 using 什么)。
using System;
using System.Data;
using System.Text;
using System.Data.SqlClient;
using MySchoolModel;
using Utility;

namespace MySchoolDAL
{
    public class GradeService
    {
        public bool Add(MySchoolModel.Grade model)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("insert into grade(");
            strSql.Append("name)");
            strSql.Append(" values (");
            strSql.Append("@name)");
            SqlParameter[] parameters = {new SqlParameter("@name", SqlDbType.VarChar,50)};
            parameters[0].Value = model.GradeName;
            int rows = SQLHelper.ExecuteSql(strSql.ToString(), parameters);
            if (rows > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        ///更新一条数据
        /// </summary>
        public bool Update(MySchoolModel.Grade model)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("update grade set ");
            strSql.Append("name=@name");
            strSql.Append(" where id=@id ");
            SqlParameter[] parameters = {
		new SqlParameter("@id", SqlDbType.Int,4),
		new SqlParameter("@name", SqlDbType.VarChar,50)
		};
            parameters[0].Value = model.ID;
            parameters[1].Value = model.GradeName;
            int rows = SQLHelper.ExecuteSql(strSql.ToString(), parameters);
            if (rows > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 删除一条数据
        /// </summary>
        public bool Delete(int id)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("delete from grade ");
            strSql.Append(" where id=@id ");
            SqlParameter[] parameters = {
		new SqlParameter("@id", SqlDbType.Int,4) };
            parameters[0].Value = id;
            int rows = SQLHelper.ExecuteSql(strSql.ToString(), parameters);
            if (rows > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 根据一个id得到某条信息的model
        /// </summary>
        public MySchoolModel.Grade GetModel(int id)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select top 1 id,name from grade ");
            strSql.Append(" where id=@id ");
            SqlParameter[] parameters = {
		new SqlParameter("@id", SqlDbType.Int,4) };
            parameters[0].Value = id;
            MySchoolModel.Grade model = new MySchoolModel.Grade();
            DataSet ds = SQLHelper.Query(strSql.ToString(), parameters);
            if (ds.Tables[0].Rows.Count > 0)
            {
                if (ds.Tables[0].Rows[0]["id"] != null &&
                ds.Tables[0].Rows[0]["id"].ToString() != "")
                {
                    model.ID = int.Parse(ds.Tables[0].Rows[0]["id"].ToString());
                }
                if (ds.Tables[0].Rows[0]["name"] != null &&
                ds.Tables[0].Rows[0]["name"].ToString() != "")
                {
                    model.GradeName = ds.Tables[0].Rows[0]["name"].ToString();
                }
                return model;
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// 根据条件获得数据列表,如果strwhere为空,表示获得所有数据
        /// </summary>
        public DataSet GetList(string strWhere)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select id,name ");
            strSql.Append(" FROM grade ");
            if (strWhere.Trim() != "")
            {
                strSql.Append(" where " + strWhere);
            }
            return SQLHelper.Query(strSql.ToString());
        }

    }
}
PS:
1.StringBuilder 类:
表示可变字符字符串。

8、业务层(Bll)

针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。创建的方法同上。名称为 MySchoolBLL;解决方案:添加到解决方案;路径为e:\test\MySchool;然后添加新类 GradeBll.cs。这层要引用 DAL 层和 Model 层,所以要添加引用 DAL 和 Model,添加引用的方法同上;然后在 GradeBll.cs 顶部加以下代码:


using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MySchoolModel;
using MySchoolDAL;

namespace MySchoolBLL
{
    public class GradeBll
    {
        GradeService dal = new GradeService();
        /// <summary>
        /// 增加一条记录
        /// </summary>
        public bool Add(Grade model)
        {
            return dal.Add(model);
        }
        /// <summary>
        /// 更新一条记录
        /// </summary>
        public bool Update(Grade model)
        {
            return dal.Update(model);
        }
        /// <summary>
        /// 删除一条记录
        /// </summary>
        public bool Delete(int id)
        {
            return dal.Delete(id);
        }
        /// <summary>
        /// 得到一个对象实体
        /// </summary>
        public Grade GetModel(int id)
        {
            return dal.GetModel(id);
        }
        /// <summary>
        /// 获得所有数据列表
        /// </summary>
        public DataSet GetList()
        {
            return dal.GetList("");
        }

    }
}

9、表现层(UI)

通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
现在开始给页面添加代码了,让查询出来的内容显示到页面上来。步骤:展开web项目myschool,找到default.aspx文件,双击。在页面上添加一个gridview用来显示查询出来的grade
信息。编辑列为HyperLinkField,班级名称列为BoundField。
   <asp:GridView ID="gv" runat="server" >
            <Columns>
                <asp:HyperLinkField DataNavigateUrlFields="id" 
                    DataNavigateUrlFormatString="gradeedit.aspx?type=2&id={0}" 
                    HeaderText="编辑" 
                    Text="编辑">
                <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" />
                </asp:HyperLinkField>
                <asp:BoundField DataField="name" HeaderText="班级名称"/>
            </Columns>
        </asp:GridView>

10.添加新页 gradeedit.aspx,完成班级信息的添加和编辑。

如果传递到本页的 type=1 表示是添加,如果 type=2 表示是编辑,需要从数据库检索出当前这条信息。
    <div>
    班级名称:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <br /> <br />
        <asp:Button ID="Button1" runat="server" Text="确认" οnclick="Button1_Click" />
	<asp:Button ID="Button2" runat="server" Text="取消" οnclick="Button2_Click" />
    </div>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MySchool
{
    public partial class GradeEdit : System.Web.UI.Page
    {
        MySchoolBLL.GradeBll obj = new MySchoolBLL.GradeBll();
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                if (Request.QueryString["type"] != null)
                {
                    int type = int.Parse(Request.QueryString["type"].ToString());//获取类型编号,是添加还是编辑
                    if (type == 2)
                    {
                        if (Request.QueryString["id"] != null)
                        {
                            int id = int.Parse(Request.QueryString["id"].ToString());//获取班级id
                            MySchoolModel.Grade model = obj.GetModel(id);
                            if (model != null)
                                model.Grade =NameTextBox1.Text;

                        }
                    }
                }
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (Request.QueryString["type"] != null)
            {
                int type = int.Parse(Request.QueryString["type"].ToString());//获取类型编号,是添加还是编辑
                MySchoolModel.Grade model = new MySchoolModel.Grade();
                model.GradeName = TextBox1.Text.Trim();

                if (type == 2)
                {

                    if (Request.QueryString["id"] != null)
                    {
                        int id = int.Parse(Request.QueryString["id"].ToString());//获取班级id
                        model.ID = id;
                    }
                    else
                        return;
                    bool flag = obj.Update(model);
                    if (flag)
                    {
                        //Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('修改成功!');</script>");
                        Response.Redirect("default.aspx");
                    }
                    else
                    {
                        Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('修改不成功,请联系管理员!');</script>");
                    }
                }
                else
                {
                    bool flag = obj.Add(model);
                    if (flag)
                    {
                        Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('添加成功!');</script>");
                        Response.Redirect("default.aspx");
                    }
                    else
                    {
                        Page.ClientScript.RegisterStartupScript(Page.GetType(), "", "<script>alert('添加不成功,请联系管理员!');</script>");
                    }
                }
            }
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            Response.Redirect("default.aspx");
        }
    }
}
PS:
1.Page.IsPostBack 属性:
获取一个值,该值指示页上呈现第一次还是正在加载中为回发的响应。
true为Post提交(也就是提交表单),flase则为第一次进入该页面。
2.Request.QueryString(取得地址栏参数值)获取地址栏中的参数,意思就是取得”?"号后面的参数值.如果是多个是用这”&”符号连接起来的.
例如:http://localhost:1988/JPKC/zuoyeDown.aspx?catalog=2009年第二学期
Request.QueryString["catalog"]的内容是2009年第二学期 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用方法: 先附加DB_51aspx文件夹里面数据库到你的mssql 2000当中,用VS2005打开,修改web.config中的数据库配置: 这里改你的数据库用户名及密码 ,运行!OK! 后台路径为:admin/login.aspx 用户名 、密码为51aspx 采用多层分布式架构 -------WEB-------- 表示层,负责应用程序的表现形式、用户体验等。 -------Common------- 公共函数类,字符截取、验证用户输入信息等功能。一般被表示层调用。 -------BLL------ 处理应用程序的业务逻辑,被表示层调用。 -------DALFactory----- 抽象工厂,用于创建各种数据对象的方法,这里有配置文件和反射的运用。 -------Model------- Model程序集,存放实体类,用于数据访问层和逻辑层调用 -------IDAL-------- 数据操作接口,数据访问层实现其接口并重写它(体现了面向接口的编程思想)。 -------Sqlserver---- 数据访问层,实现具体的select、update、delete....操作,重写IDAL接口。 -------DBUtility---- 数据访问类组件,这里使用的是SqlHelper 注:这是我参考一些多层架构的资料结合对多层的理解写的一个demo,用了两天时间,可能不是很标准,大家看的时候,有什么意见多多交流,一起探讨.分页那里还有点bug,不过我想以后再改进了(分页封装到数据层我总觉得不好),前台部分没有用控件(貌似一个高手告诉我,如果哪天你做.net不用控件了,你就可以了,汗一下!我就索性试一试。^_^)。有什么不合理的地方,欢迎提出来,我们一起学习,一起交流。 作者:李平

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值