標籤:c# vb.net 三層結構
大家在閱讀這篇文章之前可以先閱讀另外一篇博文《三層結構》(請點擊這裡)。對其有最基本的認識。
在看視頻的過程中,用C#實現了登入的執行個體,之後對其又轉換為了VB.NET。實現功能是一樣的,只是換湯不換藥,換了一種表達方式而已。對比著來學習效果更佳。
對比一:實體層
C#實現:
<span style="font-size:18px;">public class UserInfo { public int ID { get; set; } public string UserName { get; set; } public string Password { get; set; } public string Email { get; set; } }</span> VB.NET實現:
<span style="font-size:18px;">Public Class UserInfo Private _ID As Integer Public Property ID As Integer Get Return _ID End Get Set(value As Integer) _ID = value End Set End Property Private _UserName As String Public Property UserName As String Get Return _UserName End Get Set(value As String) _UserName = value End Set End Property Private _Password As String Public Property Password As String Get Return _Password End Get Set(value As String) _Password = value End Set End Property Private _Email As String Public Property Email As String Get Return _Email End Get Set(value As String) _Email = value End Set End PropertyEnd Class</span>
對比分析:都是為了封裝資料,便於資料在三層中流轉,很明顯,C#比VB.NET的代碼簡單很多,但實現的功能卻是相同的。有一個最大的區別非常顯眼,C#每句結尾都有分號,而VB.NET沒有。
對比二:DAL層
C#實現:
<span style="font-size:18px;">class DbUtil { public static string ConnString = @"Server=qiwei;Database=Login; User ID=sa; Password=130427"; }</span>
<span style="font-size:18px;">public class UserDAO { public Login .Model .UserInfo SelectUser(string userName, string password) { using(SqlConnection conn=new SqlConnection (DbUtil.ConnString )) { SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @"SELECT ID,UserName, Password, Email FROM USERS WHERE [email protected] AND [email protected]"; cmd.CommandType = CommandType.Text; cmd.Parameters.Add (new SqlParameter ("@UserName",userName )); cmd.Parameters .Add (new SqlParameter ("@Password",password )); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); Login.Model.UserInfo user = null; while (reader.Read()) { if (user == null) { user = new Login.Model.UserInfo(); } user.ID =reader.GetInt32(0); user.UserName = reader.GetString(1); user.Password = reader.GetString(2); //not suggestion if (!reader.IsDBNull(3)) { user.Email = reader.GetString(3); } } return user; } } }</span> VB.NET實現:
<span style="font-size:18px;">Public Class UserDAO Public conn As New SqlConnection("server =localhost;database=Login;user=sa;password=130427") Dim sql As String = "select ID,UserName,Password,Email from Users where [email protected]" Public Function SelectUser(ByVal userName As String, ByVal password As String) Dim cmd As New SqlCommand(sql, conn) Dim reader As SqlDataReader Dim user1 As New LoginEntity.UserInfo() cmd.CommandText = sql cmd.CommandType = CommandType.Text cmd.Parameters.Add(New SqlParameter("@UserName", userName)) cmd.Parameters.Add(New SqlParameter("@Password", password)) conn.Open() reader = cmd.ExecuteReader While reader.Read() If user1 Is Nothing Then user1 = New LoginEntity.UserInfo() End If user1.ID = reader.GetInt32(0) user1.UserName = reader.GetString(1) user1.Password = reader.GetString(2) If Not reader.IsDBNull(3) Then user1.Email =reader .GetString (3) End If End While Return user1 End FunctionEnd Class</span> 對比分析:都是提供基本的資料訪問,串連資料庫,從資料庫中尋找資料,然後讀資料,將資料傳遞到實體層。
C#中,先單獨將串連資料類DbUtil放在一個類庫,方便之後各類串連資料庫調用,對今後若更換資料庫提供方便。當然VB.NET同樣可以實現。這裡直接與資料庫進行相連。
DAL層都需要引用實體層。用到資料庫都需要添加引用,C#實現:
<span style="font-size:18px;">using System.Data;using System.Data.SqlClient;</span>
VB.NET實現:
<span style="font-size:18px;">Imports System.DataImports System.Data.SqlClient</span>
如果仔細觀察,C#中只有conn.Open(),開啟資料庫連接,而沒有conn.Open(),關閉資料庫連接。這裡Using(){}函數體的使用是自動關閉的。
對比三:BLL層
C#實現:
<span style="font-size:18px;">public class LoginManager { public Login.Model.UserInfo UserLogin(string userName, string password) { Login.DAL.UserDAO uDao = new Login.DAL.UserDAO(); Login.Model.UserInfo user = uDao.SelectUser(userName, password); if (user != null) //login successfully { Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO(); sDao.UpdateScore(userName, 10); return user; } else { throw new Exception("登入失敗!"); } } }</span> VB.NET實現:
<span style="font-size:18px;">Public Class LoginMagnager Public Function UserLogin(ByVal userName As String, ByVal password As String) Dim uDAO As New LoginDAL.UserDAO Dim user1 As New LoginEntity.UserInfo user1 = uDAO.SelectUser(userName, password) If IsNothing(user1.UserName) Then Throw New Exception("登入失敗") Else Return user1 End If End FunctionEnd Class</span> 對比分析:這裡用VB.NET實現的時候沒有加入積分的功能。兩種代碼的實現都是為了將DAL層的資料傳遞給實體層,然後進行邏輯判斷。但代碼的表現形式還是不一樣的。
對比四:UI層
c#實現:
<span style="font-size:18px;">private void btnLogin_Click(object sender, EventArgs e) { string userName = txtUserName.Text.Trim(); string password = txtPassword.Text; Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); Login.Model .UserInfo user=mgr.UserLogin(userName, password); MessageBox.Show("登入使用者:" + user.UserName); }</span> VB.NET實現:
<span style="font-size:18px;">Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click Dim userName As String Dim password As String Dim mgr As New loginBLL.LoginMagnager Dim user As LoginEntity.UserInfo userName = txtUserName.Text password = txtPassword.Text user = mgr.UserLogin(userName, password) MessageBox.Show("登入成功!使用者名稱:" + userName) End Sub</span> 對比分析:都是採集使用者的輸入資訊,然後將BLL層的資料傳遞給實體層。從這裡可以看出最大的不同就是,C#邊定義邊使用,而VB.NET每個出現的資料都必須先定義,然後才能使用。
總結:
通過學習這個簡單的登入執行個體,用C#和VB.NET去實現三層。首先,明確掌握了三層結構的應用。其次,又一次感受到了電腦語言的相同性。只有紮實地掌握了一門語言,再學習其它語言那就是照葫蘆畫瓢的事兒了,so easy!
登入執行個體對比-C#和VB.NET實現三層