UI的作用:向用户展现特定业务数据;采集用户的输入信息和操作——拿来主义
private void btnLogin_Click(object sender, EventArgs e) //登录按钮
{
//有了三层结构,显示层绝对不跟数据源打交道。因此需要有业务逻辑层的支持
try
{
//获取用户界面的数据
string userName = txtUserName.Text.Trim();
string password = txtPassword.Text;//后面不加 Trim(),密码可能包含空格
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
Login.Model.UserInfo user = mgr.UserLogin(userName, password);
MessageBox.Show("登录用户:" +user.UserName);
}
catch (Exception ex) //如果登录异常,则登录失败
{
MessageBox.Show(ex.Message);
}
}
BLL的作用:从DAL中获取数据,以供 UI 显示用;
从 UI 中获取用户指令和数据,执行业务逻辑;
namespace Login.BLL 引用 LoginDAL LoginModel
{
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("登录失败");
}
}
}
DAL——数据访问层——与数据源打交道
DAL的作用:从数据源加载数据(select);向数据源写入数据(insert/update);从数据源删除数据(delete)
Using system data;
using System.Data.SqlClient;
namespace Login.DAL 引用 LoginModel
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName,string password)
{
using(SqlConnection conn=new SqlConnection(DbUtil.ConnString)) //关键字using ,connection 可自动关闭连接
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID, UserName, Password, Email
FROM [User] WHERE UserName=@UserName AND Password=@Password";
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;
}
}
}
class DbUtil
{
public static string ConnString = @"Server=HFF;Database=Login;User ID=sa;Password=123456";
}
}
//业务数据模型
namespace Login.Model//封装数据,为了在三层间传输数据,独立于其他三个层,不知道谁去调用它
{//Login.Model不引用任何一个程序集,而其他三个层分别添加引用Login.Model
//实体类,用于保存信息
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
}
哈哈,三层登录就如上所述了。再多的理论都不如一个实战,加油!