前言:
最近刚刚敲了三层的代码,里面的代码有部分因为小编才疏学浅,故而未曾与之相识。今小编特意总结了一下这些简单的代码,给大家提供一个温习旧知识点的好机会。如有纰漏,敬请斧正。
正文:
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);
}
}