作者marker 欢迎转载!!!
参照原文地址:ASP.NET三层架构基础详细操作图文教程(一)作者:乔杨 出自:http://www.cnntec.com 作者:AZ猫 转发请注明出处,违者必究
本文主要讲述Asp.net MVC B/S结构 下基础的三层架构项目。
三层主要是指的界面UI层,逻辑层,数据层。
界面UI层:用于用户观看,体验的表示层。
逻辑层:程序运行逻辑的封装层。
数据层:程序数据相关操作的封装层。
每层当中还可以进行不同的详细划分,因为是基础教程,先领新手入门,所以不进行复杂的讲解。
准备工具:
Microsoft Visual Studio 2017以下简称vs2017
Microsoft SQLServer 2016 以下简称 数据库
安装就不详说了。
首先,我们新建一个项目:如下图
打开VS2017后,点击创建项目,选择C#中的web项目,选择ASP.NET web应用程序,填写名称为StudyCSharp.Web
选择保存的路径,填写解决方案名称StudyCSharp,记得勾下创建解决方杂的选项。确定建好项目后,选择MVC模版,
右侧的解决方案资源管理器如下图
现在我们要对项目进行三层架构,刚才我们在创建项目的时候,已经创建了UI层,即web项目。
现在我们要创建BLL层和DAL层等 。如下图
左侧,我们选择Visual C#项目,右则我们选择类库。
然后在名称中输入StudyCSharp.BLL
路径地址可以不用更改。
根据以上操作,我们再创建StudyCSharp.DAL和StudyCSharp.Entity及StudyCSharp.Utility
创建完如下图:
各项目说明:
StudyCSharp.Web项目:表示层,用于显示给用户观看和操作体验的
StudyCSharp.BLL项目:逻辑层,程序实现逻辑
StudyCSharp.DAL项目:数据层,程序数据相关操作封装
StudyCSharp.Entity项目:实体类,映射数据库表结构
StudyCSharp.Utility项目:实用应用层,封装相关应用操作
到此为止,三层的框架已经搭建好了,但是还不能正常运用,我们还要进行一些配置和修改。
首选,我们修改DAL层,删除默认的Class1.cs文件,新建SQLHelper.cs类和Configuration.cs类。
以下是Coniguration.cs类内容
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Data;
- namespace StudyCSharp.DAL
- {
- public partial class Configuration
- {
- public static string DateFormat
- {
- get
- {
- string formatStr = System.Configuration.ConfigurationManager.AppSettings["DateFormat"];
- if (formatStr == null)
- {
- return "yyyy/MM/dd HH:mm";
- }
- return "yyyy/MM/dd HH:mm";
- }
- }
- private static string mConnectionString = string.Empty;
- public static string ConnectionString
- {
- get
- {
- if (mConnectionString == string.Empty)
- {
- mConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
- }
- return mConnectionString;
- }
- set
- {
- mConnectionString = value;
- }
- }
- static EnumNetDbType mDbType = EnumNetDbType.Sql;
- public static EnumNetDbType DbType
- {
- get
- {
- return mDbType;
- }
- set
- {
- mDbType = value;
- }
- }
- //public static int GetOracleSequenceNextValue(string sequenceName)
- //{
- // string sequel = "select " + sequenceName + ".nextval from dual";
- // return (int)(OracleHelper.ExecuteScalar(ConnectionString, CommandType.Text, sequel));
- //}
- }
- public enum EnumNetDbType
- {
- Sql = 0,
- Oracle = 1,
- OleDb = 2
- }
- public enum EnumPersistStatus
- {
- New = 0,
- Update = 1,
- Delete = 2
- }
- }
添加完2个类后,我们需对DAL项目的引用文件夹点右键,选择添加引用。如图
选择System.Configuration,确定,OK,完成以后我们再继续来配置web项目下的web.config文件,主要是连接数据库。
如下图
在appSettings节点下。原节点为<appSettings/>
OK,现在我们来配置实体类。
实体类为数据库表的映射,即与数据库的表对应。
我们建立数据库为StudyCSharp,建立表为UserInformation
具体建表一下会儿给出代码。
我们在Entity项目上点击右键,选择添加类,然后写入如下图数据。
与数据库中表UserInformation对应。如下:
public class UserInformation
{
public int ID{get;set;}
public string UserName{get;set;}
public string UserPassword{get;set;}
}
们做了这个数据库的实体映射后我们要怎么用呢?怎么才能操作这个实体像在操作数据库一样的呢?
我们马上来配置DAL项目。
对DAL项目右键,选择新建类.因为是直接项目右键,所以不用做选择。直接输入名称即可
这里我们是操作的UserInformation所以我们类名命名为Userinformation_DAL.cs,确定
如下图:
然后在类中,我们添加如下名命空间的引用:
- Using System.Data;
- Using System.Data.SqlClient;
并将类前面加上public,继续添加引用
在弹出的对话框中,我们选择项目栏,选中刚才我们建立的项目的映射类
如下图
需要的数据库脚本如下。
创建表和相关存储过程。这个不是我们主讲的核心,所以略过,附上脚本。
- USE [StudyCSharp]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE TABLE [dbo].[SC_Userinformation](
- [ID] [int] IDENTITY(1,1) NOT NULL,
- [UserName] [nvarchar](32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
- [UserPassword] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
- CONSTRAINT [PK_SC_Userinformation] PRIMARY KEY CLUSTERED
- (
- [ID] ASC
- )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
- ) ON [PRIMARY]
- USE [StudyCSharp]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE PROCEDURE [dbo].[SP_SelectAllFromUserinformation]
- AS
- BEGIN
- Select * from SC_userinformation
- END
- USE [StudyCSharp]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE PROCEDURE [dbo].[SP_SelectAllFromUserinformationById]
- @UID int
- AS
- BEGIN
- Select * from SC_userinformation where id=@UID
- END
- USE [StudyCSharp]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE PROCEDURE [dbo].[SP_InsertUserinformation]
- @ID int=null,
- @UserName nvarchar(32),
- @UserPassword nvarchar(128)
- AS
- BEGIN
- Insert into SC_Userinformation
- (
- UserName,
- UserPassword
- )
- values
- (
- @UserName,
- @UserPassword
- )
- select @@identity as 'identity'
- END
- USE [StudyCSharp]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE PROCEDURE [dbo].[SP_UpdateUserinformation]
- @ID int,
- @UserName nvarchar(32),
- @UserPassword nvarchar(128)
- AS
- BEGIN
- Update SC_Userinformation
- SET UserName=@UserName,
- UserPassword=@UserPassword
- where ID=@ID
- END
- USE [StudyCSharp]
- GO
- SET ANSI_NULLS ON
- GO
- SET QUOTED_IDENTIFIER ON
- GO
- CREATE PROCEDURE [dbo].[SP_UserLogin]
- @UserName nvarchar(32),
- @UserPassword nvarchar(128)
- AS
- BEGIN
- select count(id)
- from SC_UserInformation
- where username=@UserName
- and userPassword=@UserPassword
- END
存储过程相关调用,详细Userinformation_DAL.cs中的说明。
附上Userinformation_DAL.cs文件内容如下
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Data;
- using System.Data.SqlClient;
- namespace StudyCSharp.DAL
- {
- public partial class Userinformation_DAL
- {
- /// <summary>
- /// 用户登录验证
- /// </summary>
- /// <param name="userName">用户名</param>
- /// <param name="userPassword">密码</param>
- /// <returns>布尔值True成功</returns>
- public static bool UserLogin(string userName, string userPassword)
- {
- string sequel = "SP_UserLogin";
- SqlParameter[] paras = new SqlParameter[]
- {
- new SqlParameter("@UserName", userName),
- new SqlParameter("@UserPassword",userPassword)
- };
- int result =(int)SqlHelper.ExecuteScalar(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
- if (result > 0)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- /// <summary>
- /// 添加新用户
- /// </summary>
- /// <param name="ui">用户信息实体</param>
- /// <returns>用户编号</returns>
- public static int CreateUserInfo(StudyCSharp.Entity.UserInformation ui)
- {
- string sequel = "SP_InsertUserinformation";
- SqlParameter[] paras = (SqlParameter[])ValueParas(ui);
- int result = SqlHelper.ExecuteNonQuery(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
- return result;
- }
- /// <summary>
- /// 获取用户所有信息
- /// </summary>
- /// <returns>泛型实体</returns>
- public static List<StudyCSharp.Entity.UserInformation> GetAllUserInfo()
- {
- string sequel = "SP_SelectAllFromUserinformation";
- DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.StoredProcedure, sequel,null).Tables[0];
- return LoadListFromDataView(dt.DefaultView);
- }
- /// <summary>
- /// 获取用户所有信息同上,不同的是不是调用的存储过程,而是直接拼写的SQL
- /// </summary>
- /// <returns>DataTable</returns>
- public static DataTable GetAllUserInfoBySql()
- {
- string sequel = "Select * from SC_UserInformation";
- DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.Text, sequel, null).Tables[0];
- return dt;
- }
- /// <summary>
- /// 获取某用户信息
- /// </summary>
- /// <param name="empId">用户id</param>
- /// <returns>用户信息实体</returns>
- public static StudyCSharp.Entity.UserInformation GetUserInfoByEmpId(string empId)
- {
- string sequel = "SP_SelectAllFromUserinformationById";
- SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@UID", empId) };
- DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras).Tables[0];
- if (dt.Rows.Count == 0)
- {
- return null;
- }
- else
- {
- DataRow row = dt.Rows[0];
- return GetEntity(row);
- }
- }
- /// <summary>
- /// 更新用户信息
- /// </summary>
- /// <param name="ui">用户实体</param>
- /// <returns>影响行数</returns>
- public static int UpdateUserInfo(StudyCSharp.Entity.UserInformation ui)
- {
- string sequel = "SP_UpdateUserinformation";
- SqlParameter[] paras = (SqlParameter[])ValueParas(ui);
- int result = SqlHelper.ExecuteNonQuery(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
- return result;
- }
- /// <summary>
- /// 将DataView转换为泛型实体对象
- /// </summary>
- /// <param name="dv">DataView</param>
- /// <returns>泛型实体对象</returns>
- private static List<StudyCSharp.Entity.UserInformation> LoadListFromDataView(DataView dv)
- {
- List<StudyCSharp.Entity.UserInformation> list = new List<StudyCSharp.Entity.UserInformation>();
- for (int index = 0; index <= dv.Count - 1; index++)
- {
- list.Add(GetEntity(dv[index].Row));
- }
- return list;
- }
- /// <summary>
- /// 从DataReader中读取数据映射到实体类的属性中
- /// </summary>
- /// <remarks></remarks>
- private static StudyCSharp.Entity.UserInformation GetEntity(IDataReader dataReader)
- {
- StudyCSharp.Entity.UserInformation _obj = new StudyCSharp.Entity.UserInformation();
- if (!dataReader["ID"].Equals(DBNull.Value))
- _obj.ID = Convert.ToInt32(dataReader["ID"]);
- if (!dataReader["UserName"].Equals(DBNull.Value))
- _obj.UserName = Convert.ToString(dataReader["UserName"]);
- if (!dataReader["UserPassword"].Equals(DBNull.Value))
- _obj.UserPassword = Convert.ToString(dataReader["UserPassword"]);
- return _obj;
- }
- /// <summary>
- /// 从行中读取数据映射到实体类的属性中
- /// </summary>
- /// <remarks></remarks>
- private static StudyCSharp.Entity.UserInformation GetEntity(DataRow row)
- {
- StudyCSharp.Entity.UserInformation _obj = new StudyCSharp.Entity.UserInformation();
- if (!row["ID"].Equals(DBNull.Value))
- _obj.ID = Convert.ToInt32(row["ID"]);
- if (!row["UserName"].Equals(DBNull.Value))
- _obj.UserName = Convert.ToString(row["UserName"]);
- if (!row["UserPassword"].Equals(DBNull.Value))
- _obj.UserPassword = Convert.ToString(row["UserPassword"]);
- return _obj;
- }
- /// <summary>
- /// 该数据访问对象的属性值装载到数据库更新参数数组Insert用
- /// </summary>
- /// <remarks></remarks>
- private static IDbDataParameter[] ValueParas(StudyCSharp.Entity.UserInformation _obj)
- {
- SqlParameter[] paras = new SqlParameter[3];
- paras[0] = new SqlParameter("@ID", _obj.ID);
- paras[1] = new SqlParameter("@UserName", _obj.UserName);
- paras[2] = new SqlParameter("@UserPassword", _obj.UserPassword);
- paras[0].DbType = DbType.Int32;
- paras[1].DbType = DbType.String;
- paras[2].DbType = DbType.String;
- return paras;
- }
- }
- }
下篇解析三层架构的DAL及BLL还有WEB之间的关系和调用。