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