ASP.NET三層架構基礎詳細操作圖文教程(一)


本文主要講述Asp.net B/S結構 下基礎的三層架構項目。

三層主要是指的界面UI層,邏輯層,數據層。

界面UI層:用於用戶觀看,體驗的表示層。

邏輯層:程序運行邏輯的封裝層。

數據層:程序數據相關操作的封裝層。
每層當中還可以進行不同的詳細划分,因為是基礎教程,先領新手入門,所以不進行復雜的講解。

有問題可以到我所在的社區中國微軟.NET技術交流社區cnntec.com 找AZ貓 歡迎各位轉載,請保留此信息,感謝您的合作。

准備工具:

Microsoft Visual Studio 2008 以下簡稱vs08

Microsoft SQLServer 2005 以下簡稱 數據庫

安裝就不詳說了。

首先,我們新建一個項目:

如下圖

 asp.net教程

打開VS2008后,點擊創建項目,選擇C#中的web項目,選擇ASP.NET web應用程序,填寫名稱為StudyCSharp.Web 選擇保存的路徑,填寫解決方案名稱StudyCSharp,記得勾下創建解決方雜的選項。

確定 建好項目后,右側的解決方案資源管理器如下圖

ASP.NET三層架構基礎詳細操作圖文教程(一)

保存的目錄中應有如下圖中的文件夾和文件

 ASP.NET三層架構基礎詳細操作圖文教程(一)


現在我們要對項目進行三層架構,剛才我們在創建項目的時候,已經創建了UI層,即web項目。 現在我們要創建BLL層和DAL層等 。

如下圖

 ASP.NET三層架構基礎詳細操作圖文教程(一)


在文件中,我們選擇添加,選擇新建項目,彈出如下圖

ASP.NET三層架構基礎詳細操作圖文教程(一)

左側,我們選擇windows項目,右則我們選擇類庫。 然后在名稱中輸入StudyCSharp.BLL 路徑地址可以不用更改。

創建完后項目目錄下如下圖

ASP.NET三層架構基礎詳細操作圖文教程(一)
根據以上操作,我們再創建StudyCSharp.DAL和StudyCSharp.Entity及StudyCSharp.Utility

創建完如下圖:

cnntec.com

各項目說明:

StudyCSharp.Web項目:表示層,用於顯示給用戶觀看和操作體驗的

StudyCSharp.BLL項目:邏輯層,程序實現邏輯

StudyCSharp.DAL項目:數據層,程序數據相關操作封裝

StudyCSharp.Entity項目:實體類,映射數據庫表結構

StudyCSharp.Utility項目:實用應用層,封裝相關應用操作


項目目錄中如下圖:

 ASP.NET三層架構基礎詳細操作圖文教程(一)


到此為止,三層的框架已經搭建好了,但是還不能正常運用,我們還要進行一些配置和修改。

首選,我們修改DAL層,刪除默認的Class1.cs文件,新建SQLHelper.cs類和Configuration.cs類。

SQLHelper類CNNTEC以前發布過,現在不重復。

不明白的可以看 SqlHelper

http://www.cnntec.com/showtopic-899.html

以下是Coniguration.cs類內容

1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.using System.Data;
5.namespace StudyCSharp.DAL
6.{
7.public partial class Configuration
8.{
9.public static string DateFormat
10.{
11.get
12.{
13.string formatStr = System.Configuration.ConfigurationManager.AppSettings["DateFormat"];
14.if (formatStr == null)
15.{
16.return "yyyy/MM/dd HH:mm";
17.}
18.return "yyyy/MM/dd HH:mm";
19.}
20.}
21.private static string mConnectionString = string.Empty;
22.public static string ConnectionString
23.{
24.get
25.{
26.if (mConnectionString == string.Empty)
27.{
28.mConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
29.}
30.return mConnectionString;
31.}
32.set
33.{
34.mConnectionString = value;
35.}
36.}
37.static EnumNetDbType mDbType = EnumNetDbType.Sql;
38.public static EnumNetDbType DbType
39.{
40.get
41.{
42.return mDbType;
43.}
44.set
45.{
46.mDbType = value;
47.}
48.}
49.//public static int GetOracleSequenceNextValue(string sequenceName)
50.//{
51.//string sequel = "select" + sequenceName + ".nextval from dual";
52.//return (int)(OracleHelper.ExecuteScalar(ConnectionString, CommandType.Text, sequel));
53.//}
54.}
55.public enum EnumNetDbType
56.{
57.Sql = 0,
58.Oracle = 1,
59.OleDb = 2
60.}
61.public enum EnumPersistStatus
62.{
63.New = 0,
64.Update = 1,
65.Delete = 2
66.}
67.}

 

添加完2個類后,我們需對DAL項目的引用文件夾點右鍵,選擇添加引用。

如圖

 ASP.NET三層架構基礎詳細操作圖文教程(一)

選擇System.Configuration,確定,添加后如下圖。

cnntec

完成以后我們再繼續來配置web項目下的web.config文件,主要是連接數據庫。

如下圖

 cnntec.com

在appSettings節點下。原節點為<appSettings/> 我們改成如上圖設置

發現很多新手不知道數據庫連接字符串怎么寫。簡單的教下如何用vs08來自動生成這個字符串.

如下圖


cnntec.com

我們 打開web項目下的Default.aspx文件,選擇拆分,然后雙擊左側工具欄上的SqlDataSource控件。

會在視圖和代碼中生成相應的視圖和代碼,不用管它,我們點擊控件上的配置數據源。

彈出窗口如下圖:
cnntec.com

選擇新建鏈接,如上圖,在彈出窗口中,選擇如上圖。

然后我們根據自己的數據庫來配置,選擇數據庫,數據庫認證,輸入用戶名,密碼,保存密碼,選擇數據庫。

點高級,出現如下圖

 cnntec.com

彈出如上圖對話框,就可以復制這個字符串,這個字符串就是鏈接字符串。
OK,現在我們來配置實體類。 實體類為數據庫表的映射,即與數據庫的表對應。

我們建立數據庫為StudyCSharp,建立表為UserInformation 具體建表一下會兒給出代碼。

我們在Entity項目上點擊右鍵,選擇添加類,然后寫入如下圖數據。 與數據庫中表UserInformation對應。

如圖:
cnntec.com

我們做了這個數據庫的實體映射后我們要怎么用呢?怎么才能操作這個實體像在操作數據庫一樣的呢?

我們馬上來配置DAL項目。 對DAL項目右鍵,選擇新建類。

如下圖:
cnntec.com

因為是直接項目右鍵,所以不用做選擇。

直接輸入名稱即可 這里我們是操作的UserInformation所以我們類名命名為Userinformation_DAL.cs,確定

如下圖:
cnntec.com

然后在類中,我們添加如下名命空間的引用:

1.Using System.Data;
2.Using System.Data.SqlClient;

並將類前面加上public如下圖
cnntec.com

未完,照下圖操作,繼續添加引用
cnntec.com

在彈出的對話框中,我們選擇項目欄,選中剛才我們建立的數據訓的映射類

如下圖
cnntec.com

需要的數據庫腳本如下。 創建表和相關存儲過程。這個不是我們主講的核心,所以略過,賦上腳本。

1.USE [StudyCSharp]
2.GO
3.SET ANSI_NULLS ON
4.GO
5.SET QUOTED_IDENTIFIER ON
6.GO
7.CREATE TABLE [dbo].[SC_Userinformation](
8.[ID] [int] IDENTITY(1,1) NOT NULL,
9.[UserName] [nvarchar](32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
10.[UserPassword] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
11.CONSTRAINT [PK_SC_Userinformation] PRIMARY KEY CLUSTERED
12.(
13.[ID] ASC
14.)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
15.) ON [PRIMARY]
16.USE [StudyCSharp]
17.GO
18.SET ANSI_NULLS ON
19.GO
20.SET QUOTED_IDENTIFIER ON
21.GO
22.CREATE PROCEDURE [dbo].[SP_SelectAllFromUserinformatoin]
23.AS
24.BEGIN
25.Select * from SC_userinformation
26.END
27.USE [StudyCSharp]
28.GO
29.SET ANSI_NULLS ON
30.GO
31.SET QUOTED_IDENTIFIER ON
32.GO
33.CREATE PROCEDURE [dbo].[SP_SelectAllFromUserinformatoinById]
34.@UID int
35.AS
36.BEGIN
37.Select * from SC_userinformation where id=@UID
38.END
39.USE [StudyCSharp]
40.GO
41.SET ANSI_NULLS ON
42.GO
43.SET QUOTED_IDENTIFIER ON
44.GO
45.CREATE PROCEDURE [dbo].[SP_InsertUserinformatoin]
46.@ID int=null,
47.@UserName nvarchar(32),
48.@UserPassword nvarchar(128)
49.AS
50.BEGIN
51.Insert into SC_Userinformation
52.(
53.UserName,
54.UserPassword
55.)
56.values
57.(
58.@UserName,
59.@UserPassword
60.)
61.select @@identity as 'identity'
62.END
63.USE [StudyCSharp]
64.GO
65.SET ANSI_NULLS ON
66.GO
67.SET QUOTED_IDENTIFIER ON
68.GO
69.CREATE PROCEDURE [dbo].[SP_UpdateUserinformatoin]
70.@ID int,
71.@UserName nvarchar(32),
72.@UserPassword nvarchar(128)
73.AS
74.BEGIN
75.Update SC_Userinformation
76.SET UserName=@UserName,
77.UserPassword=@UserPassword
78.where ID=@ID
79.END
80.USE [StudyCSharp]
81.GO
82.SET ANSI_NULLS ON
83.GO
84.SET QUOTED_IDENTIFIER ON
85.GO
86.CREATE PROCEDURE [dbo].[SP_UserLogin]
87.@UserName nvarchar(32),
88.@UserPassword nvarchar(128)
89.AS
90.BEGIN
91.select count(id)
92.from SC_UserInformation
93.where username=@UserName
94.and userPassword=@UserPassword
95.END


存儲過程相關調用,詳細Userinformation_DAL.cs中的說明。
附上Userinformation_DAL.cs文件內容如下

1.using System;
2.using System.Collections.Generic;
3.using System.Text;
4.using System.Data;
5.using System.Data.SqlClient;
6.namespace StudyCSharp.DAL
7.{
8.public partial class Userinformation_DAL
9.{
10./// <summary>
11./// 用戶登錄驗證
12./// </summary>
13./// <param name="userName">用戶名</param>
14./// <param name="userPassword">密碼</param>
15./// <returns>布爾值True成功</returns>
16.public static bool UserLogin(string userName, string userPassword)
17.{
18.string sequel = "SP_UserLogin";
19.SqlParameter[] paras = new SqlParameter[]
20.{
21.new SqlParameter("@UserLoginName", userName),
22.new SqlParameter("@UserPassword",userPassword)
23.};
24.int result =(int)SqlHelper.ExecuteScalar(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
25.if (result > 0)
26.{
27.return true;
28.}
29.else
30.{
31.return false;
32.}
33.}
34./// <summary>
35./// 添加新用戶
36./// </summary>
37./// <param name="ui">用戶信息實體</param>
38./// <returns>用戶編號</returns>
39.public static int CreateUserInfo(StudyCSharp.Entity.UserInformation ui)
40.{
41.string sequel = "SP_InsertUserinformatoin";
42.SqlParameter[] paras = (SqlParameter[])ValueParas(ui);
43.int result = SqlHelper.ExecuteNonQuery(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
44.return result;
45.}
46./// <summary>
47./// 獲取用戶所有信息
48./// </summary>
49./// <returns>泛型實體</returns>
50.public static List<StudyCSharp.Entity.UserInformation> GetAllUserInfo()
51.{
52.string sequel = "SP_SelectAllFromUserinformatoin";
53.DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.StoredProcedure, sequel,null).Tables[0];
54.return LoadListFromDataView(dt.DefaultView);
55.}
56./// <summary>
57./// 獲取用戶所有信息同上,不同的是不是調用的存儲過程,而是直接拼寫的SQL
58./// </summary>
59./// <returns>DataTable</returns>
60.public static DataTable GetAllUserInfoBySql()
61.{
62.string sequel = "Select * from SC_UserInformation";
63.DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.Text, sequel, null).Tables[0];
64.return dt;
65.}
66./// <summary>
67./// 獲取某用戶信息
68./// </summary>
69./// <param name="empId">用戶id</param>
70./// <returns>用戶信息實體</returns>
71.public static StudyCSharp.Entity.UserInformation GetUserInfoByEmpId(string empId)
72.{
73.string sequel = "SP_SelectAllFromUserinformatoinById";
74.SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@UID", empId) };
75.DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras).Tables[0];
76.if (dt.Rows.Count == 0)
77.{
78.return null;
79.}
80.else
81.{
82.DataRow row = dt.Rows[0];
83.return GetEntity(row);
84.}
85.}
86./// <summary>
87./// 更新用戶信息
88./// </summary>
89./// <param name="ui">用戶實體</param>
90./// <returns>影響行數</returns>
91.public static int UpdateUserInfo(StudyCSharp.Entity.UserInformation ui)
92.{
93.string sequel = "SP_UpdateUserinformatoin";
94.SqlParameter[] paras = (SqlParameter[])ValueParas(ui);
95.int result = SqlHelper.ExecuteNonQuery(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
96.return result;
97.}
98./// <summary>
99./// 將DataView轉換為泛型實體對象
100./// </summary>
101./// <param name="dv">DataView</param>
102./// <returns>泛型實體對象</returns>
103.private static List<StudyCSharp.Entity.UserInformation> LoadListFromDataView(DataView dv)
104.{
105.List<StudyCSharp.Entity.UserInformation> list = new List<StudyCSharp.Entity.UserInformation>();
106.for (int index = 0; index <= dv.Count - 1; index++)
107.{
108.list.Add(GetEntity(dv[index].Row));
109.}
110.return list;
111.}
112./// <summary>
113./// 從DataReader中讀取數據映射到實體類的屬性中
114./// </summary>
115./// <remarks></remarks>
116.private static StudyCSharp.Entity.UserInformation GetEntity(IDataReader dataReader)
117.{
118.StudyCSharp.Entity.UserInformation _obj = new StudyCSharp.Entity.UserInformation();
119.if (!dataReader["ID"].Equals(DBNull.Value))
120._obj.ID = Convert.ToInt32(dataReader["ID"]);
121.if (!dataReader["UserName"].Equals(DBNull.Value))
122._obj.UserName = Convert.ToString(dataReader["UserName"]);
123.if (!dataReader["UserPassword"].Equals(DBNull.Value))
124._obj.UserPassword = Convert.ToString(dataReader["UserPassword"]);
125.return _obj;
126.}
127./// <summary>
128./// 從行中讀取數據映射到實體類的屬性中
129./// </summary>
130./// <remarks></remarks>
131.private static StudyCSharp.Entity.UserInformation GetEntity(DataRow row)
132.{
133.StudyCSharp.Entity.UserInformation _obj = new StudyCSharp.Entity.UserInformation();
134.if (!row["ID"].Equals(DBNull.Value))
135._obj.ID = Convert.ToInt32(row["ID"]);
136.if (!row["UserName"].Equals(DBNull.Value))
137._obj.UserName = Convert.ToString(row["UserName"]);
138.if (!row["UserPassword"].Equals(DBNull.Value))
139._obj.UserPassword = Convert.ToString(row["UserPassword"]);
140.return _obj;
141.}
142./// <summary>
143./// 該數據訪問對象的屬性值裝載到數據庫更新參數數組Insert用
144./// </summary>
145./// <remarks></remarks>
146.private static IDbDataParameter[] ValueParas(StudyCSharp.Entity.UserInformation _obj)
147.{
148.SqlParameter[] paras = new SqlParameter[3];
149.paras[0] = new SqlParameter("@ID", _obj.ID);
150.paras[1] = new SqlParameter("@UserName", _obj.UserName);
151.paras[2] = new SqlParameter("@UserPassword", _obj.UserPassword);
152.paras[0].DbType = DbType.Int32;
153.paras[1].DbType = DbType.String;
154.paras[2].DbType = DbType.String;
155.return paras;
156.}
157.}
158.}

 

下篇解析三層架構的DAL及BLL還有WEB之間的關系和調用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM