三層之必懂常識

前言:

最近剛剛敲了三層的代碼,裏面的代碼有部分因爲小編才疏學淺,故而未曾與之相識。今小編特意總結了一下這些簡單的代碼,給大家提供一個溫習舊知識點的好機會。如有紕漏,敬請斧正。

正文:

using System.Data.SqlClient;//引用命名空間

Using System.Data.SqlClient 意爲引用名稱爲System.Data.SqlClient 的命名空間。

using是C#語言中定義的一個訪問,將在此範圍之外釋放一個或多個對象。

命名空間是用來組織和重用代碼的。命名空間是唯一標識的名稱,在不同的命名空間下,類名可以相同。

System.Data.SqlClient 這一命名空間下包含很多類,在三層中,我們會使用到的類有以下幾種:

SqlConnection-----------表示到SQL sever數據庫的連接

SqlCommand------------表示要對SQL sever數據庫執行的一個Transact-SQL語句或存儲過程。

SqlDataReader--------提供一種從SQL sever數據庫中讀取只進的形流方式(這是一種讀取單向只讀數據的最快方法)。

SqlParameter----------表示SqlCommand的參數,或者其與DataSet列的映射。

namespace Login.DAL
{
    public class ScoreDAO
    {
        public void UpdateScore(string userName, int value)
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"INSERT INTO SCORES (UserName, Score) Values(@UserName,@Score)";
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Score", value));

                conn.Open();
                cmd.ExecuteNonQuery();

            }
        }
    }
}

防SQL注入方法

參數化SQL是指在設計與數據庫鏈接並訪問數據時,在需要填入數值或數據的地方,使用參數(Parameter)來給值,用@來表示參數。

在使用參數化查詢的情況下,數據庫服務器不會將參數內容視爲SQL指令處理,而僅僅當做一個值進行處理,所以就可以防止SQL注入。

public void UpdateScore(string userName, int value)
            //寫一個增加積分的方法,從B層獲取數據
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"INSERT INTO SCORES (UserName, Score) Values(@UserName,@Score)";
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Score", value));

                conn.Open();
                cmd.ExecuteNonQuery();

            }
        }

“ @ ” 的作用

① 忽略轉義字符

eg:

//使用@前
string fileName = "D:\\文本文件\\text.txt";

//使用@後
string fileName = @"D:\文本文件\text.txt";

② 讓字符串跨行

eg:

//使用@前
cmd.CommandText = "SELECT ID,UserName,Password,Email"
                  + "FROM USERS WHERE UserName=@UserName" 
                  + "AND Password=@Password"; 


//使用@後
cmd.CommandText = @"SELECT ID,UserName,Password,Email
                   FROM USERS WHERE UserName=@UserName
                   AND Password=@Password"; 

③ 在標識符中使用

可以在已定義的變量中,通過在關鍵字前加@,可以將這個關鍵字當做標識符(類名,變量名,方法名等)使用。

 

Throw new exception 異常處理

這可是三層中悄無聲息埋伏的一個大坑,敲完三層後,賬號密碼輸入正確------登陸成功,就沒有再針對賬號密碼登陸錯誤而進行測試了,於是就導致如圖所示錯誤。

出現這個錯誤的原因在於throw這個關鍵字,這個主要是用於拋出異常的,它是需要在UI層中使用try.......catch去接收異常的,否則就會報錯。

故而代碼書寫如下:

        private void BTLogin_Click(object sender, EventArgs e)
        {
            
            try
            //對try塊代碼進行異常捕捉,
            //如無異常則進行直try塊結束,
            //如有異常則跳轉進入catch塊。
            {
                string userName = txtUserName.Text.Trim();
                string password = txtPassword.Text;
                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
                //將用戶輸入的數據傳給BLL,在下面一句的使用中,就直接從BLL調用數據
                Login.Model.UserInfo user = mgr.UserLogin(userName, password);
                //在這裏就可以返回model裏的userinfo
                MessageBox.Show("登陸用戶:" + user.UserName);
            }

            catch (Exception ex)
            //處理異常。如下進行處理
            {
                MessageBox.Show(ex.Message);
            }
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章