数据库设计相当简单,就一个数据库然后又张存着用户名和密码的表。
数据库设计:
数据库名称:threeLayer
表: users
列:1.username 账号 2.password 密码
数据库创建表的脚本如下:
[sql]
view plain
copy
- CREATE TABLE [dbo].[users](
- [id] [int] IDENTITY(1,1) NOT NULL,
- [username] [varchar](50) NULL,
- [password] [varchar](50) NULL,
- CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED
- (
- [id] ASC
- )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
- ) ON [PRIMARY]
- GO
- SET ANSI_PADDING OFF
- GO
- SET IDENTITY_INSERT [dbo].[users] ON
- INSERT [dbo].[users] ([id], [username], [password]) VALUES (1, N'admin', N'admin')
- INSERT [dbo].[users] ([id], [username], [password]) VALUES (2, N'user1', N'user1')
- INSERT [dbo].[users] ([id], [username], [password]) VALUES (3, N'user2', N'user2')
- INSERT [dbo].[users] ([id], [username], [password]) VALUES (4, N'user3', N'user3')
- SET IDENTITY_INSERT [dbo].[users] OFF
三层数据传递整体思路:
用户输入账号密码->点击登录->进入BLL层进行输入与数据的逻辑处理->进入DAL层将BAL层的逻辑进行实现(用户输入的账号的密码与数据库匹配),返回结果
其中数据的传递用model实体类属性来传递
步骤:
- 新建一个windows 窗体应用程序项目并命名为threeLayerText,路径自己选吧,可以选择回收站
- 在自动新建的窗体项目中,双击Form1.cs,打开窗体设计。
- 在窗体中添加两个label,两个TextBox分别命名为textBoxAccount、textBoxtextBoxPsw和一个button 命名为 butLogin。这里命名指的是控件name属性
- 为窗体添加一个应用配置文件:右键窗体项目文件-添加-新建项-应用程序配置文件
- 在配置文件<configuration>节点中添加数据库连接语句
- 根据数据库配置Initial Catalog 为数据库名称,User ID 为登录数据库账户,Password 为改账号密码
添加后app.config完整内容如下
[html] view plain copy- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <connectionStrings>
- <add name="dbConnection" connectionString="Data Source=.;Initial Catalog=threeLayer;Persist Security Info=True;User ID=sa;Password=123"
- providerName="SQLClient" />
- </connectionStrings>
- </configuration>
- 添加类库:右键项目解决方案-添加-新建项目-类库,命名,确定
- 分别添加DAL、BLL、Model三个类库
- 分别添加DAL、BLL、Model三个类库
- 在Model类库中添加userInfo类,用于在各个层之间传递数据
- 在类库中新建一个用户类 userInfo:右键Model类库-添加-类(或者选中model类库,使用shift+alt+c快捷键)
- 在userInfo类中添加属性
[csharp] view plain copy- private string _username;
- private string _psw;
- public string username
- {
- set { _username = value; }
- get { return _username; }
- }
- public string psw
- {
- set { _psw = value; }
- get { return _psw; }
- }
- Model类完整代码如下:
[csharp] view plain copy- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Model
- {
- public class userInfo
- {
- private string _username;
- private string _psw;
- public string username
- {
- set { _username = value; }
- get { return _username; }
- }
- public string psw
- {
- set { _psw = value; }
- get { return _psw; }
- }
- }
- }
- 在DAL层中添加数据连接、查询操作类和方法
- 添加system.configuration引用,使类可以读取配置文件节点,读取配置文件中连接数据库语句;右键引用-添加引用-选择程序集-勾选-确定
- 添加 DBbase类(右键DAL项目-添加-新建项-命名好-确定) 用于连接数据库,添加System.Data 和 System.Data.SqlClient 命名空间,别问我用来干吗,其实我也不知道用来干吗的。
创建一个基本的查询方法用于查询并返回记录条数。DBbase类完整代码如下:
[csharp] view plain copy- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data;
- using System.Data.SqlClient;
- namespace DAL
- {
- public class DBbase
- {
- //读取配置文件 连接数据库语句
- public static string strCon = System.Configuration.ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString;
- //public static string strCon = "Data Source=.;Initial Catalog=threeLayer;Persist Security Info=True;User ID=sa;Password=123";
- //实例化连接对象 con
- SqlConnection con = new SqlConnection(strCon);
- //检测连接是否打开
- public void chkConnection()
- {
- if (this.con.State == ConnectionState.Closed)
- {
- this.con.Open();
- }
- }
- //执行语句,返回该语句查询的数据行的总数
- public int returnRowCount(string strSQL)
- {
- chkConnection();
- try
- {
- SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
- DataSet ds = new DataSet();
- da.Fill(ds);
- return ds.Tables[0].Rows.Count;
- }
- catch
- {
- return 0;
- }
- }
- }
- }
- 添加 userAccess类(右键DAL项目-添加-新建项-命名好-确定) 用执行查询语句查找用户输入账号密码在数据库中存在记录条数
userAccess类完整代码如下:
[csharp] view plain copy- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace DAL
- {
- public class userAccess
- {
- //实例化DBbase 对象
- DBbase db = new DBbase();
- //用户登录的方法
- public int userLogin(string name, string psw)
- {
- string strsql = "select * from users where username = '" + name + "' and password = '" + psw + "'";
- return db.returnRowCount(strsql);
- }
- }
- }
- 添加system.configuration引用,使类可以读取配置文件节点,读取配置文件中连接数据库语句;右键引用-添加引用-选择程序集-勾选-确定
- 在BLL层中添加用户输入数据与数据库匹配的逻辑代码
- 添加Model、DAL类库引用:右键BLL类库中引用文件夹,右键-添加引用-选择解决方案-项目-选中Model、DAL-确定
- 实例化DAL.userAccess 类,并新建一个方法调用DAL.userAccess方法,参数为Model实体类中的useInfo类,完整代码如下:
[csharp] view plain copy- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace BLL
- {
- public class userAccess
- {
- DAL.userAccess d_userAccess = new DAL.userAccess();
- public int userLogin(Model.userInfo m_userInfo)
- {
- return d_userAccess.userLogin(m_userInfo.username, m_userInfo.psw);
- }
- }
- }
- 回到窗体设计中,添加用户输入处理与调用BLL层方法
- 添加Model、DAL类库引用:右键threeLayerText项目中引用文件夹,右键-添加引用-选择解决方案-项目-选中Model、BLL-确定
- 打开窗体后台代码,实例化Model.userInfo 、BLL.userAccess。代码如下
[csharp] view plain copy- //实例化model层中 userInfo类用于传递数据
- Model.userInfo m_userInfo = new Model.userInfo();
- //实例化BLL层中 userAccess方法衔接用户输入与数据库匹配
- BLL.userAccess b_userAccess = new BLL.userAccess();
- 双击登录按钮,添加点击事件。代码如下
[csharp] view plain copy- //将用户输入的账号密码 赋值给userInfo类 username、psw属性
- m_userInfo.username = textBoxAccount.Text.Trim().ToString();
- m_userInfo.psw = textBoxPsw.Text.Trim().ToString();
- //如果BLL层中 useLogin调用返回记录条数 大于1 则账号密码正确
- if (b_userAccess.userLogin(m_userInfo) > 0)
- {
- MessageBox.Show("登录成功");
- }
- else
- {
- MessageBox.Show("登录失败");
- }
- 完整Form1.cs 代码如下
[csharp] view plain copy- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace threeLayerText
- {
- public partial class Form1 : Form
- {
- //实例化model层中 userInfo类用于传递数据
- Model.userInfo m_userInfo = new Model.userInfo();
- //实例化BLL层中 userAccess方法衔接用户输入与数据库匹配
- BLL.userAccess b_userAccess = new BLL.userAccess();
- public Form1()
- {
- InitializeComponent();
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- }
- //登录按钮 事件
- private void butLogin_Click(object sender, EventArgs e)
- {
- //将用户输入的账号密码 赋值给userInfo类 username、psw属性
- m_userInfo.username = textBoxAccount.Text.Trim().ToString();
- m_userInfo.psw = textBoxPsw.Text.Trim().ToString();
- //如果BLL层中 useLogin调用返回记录条数 大于1 则账号密码正确
- if (b_userAccess.userLogin(m_userInfo) > 0)
- {
- MessageBox.Show("登录成功");
- }
- else
- {
- MessageBox.Show("登录失败");
- }
- }
- }
- }
- 添加Model、DAL类库引用:右键threeLayerText项目中引用文件夹,右键-添加引用-选择解决方案-项目-选中Model、BLL-确定
- 保存,可以调试了。
Model 又叫实体类,这个东西,大家可能觉得不好分层。我是这样理解的:UI<-->Model<-->BLL<-->Model<-->DAL,如此则认为Model在各层之间起到了一个数据传输的桥梁作用。不过在这里,我们不是把事情想简单,而是想复杂了。