Em primeiro lugar, exemplos:
Agora há um sistema de pontos, ingresse estudantes em cada tempo de receber 10 pontos de bônus.
Este exemplo é apenas um simples de três de login cada vez que entrar em caso de sucesso, mais 10, e não outras características, é claro, há muitos bug que pode precisam ser otimizados.
1. Projeto tabelas de banco de dados:
2. diagrama de blocos de dados:
leitores cuidadosos certamente vai descobrir que, além da interface do usuário, BLL, DAL três e exist modelo, o modelo não pertence a qualquer um, mas três, a fim de melhor existe link. Esta classe apenas lojas, com mais de três coisas de uso comum. Desempenhar um papel de coordenação. classe de modelo, que é a entidade de classe entidade.
3. vários níveis de relações:
, A análise segundo código fonte
classe Modelo: para dados encapsulados, para a transferência de dados entre as três camadas, sem qualquer referência a uma montagem, mas os outros três todas as referências a ele
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 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; }
}
}
camada de IU: Log
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;//Windows.Froms的命令空间
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
//初始化窗体上的所有控件
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
//获得登录窗体的用户名 Trim去空格操作,注意和VB的形式不一样
string userName = txtUserName.Text.Trim();
//因为密码中可能是空格所以不用去空格操作
string password = txtpassword.Text;
//实例化业务逻辑层的对象mgr,让业务逻辑层去判断输入内容
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
//用户输入的内容通过mgr调用业务逻辑层的UserLogin方法,属于拿来主义。B层会去调用D层
mgr.UserLogin(userName, password);
//和Model 交互,将数据层的信息传入Model
Login.Model.UserInfo user = mgr.UserLogin(userName ,password );
//登录成功提示登录成功
MessageBox.Show("登录用户:"+userName );
}
}
}
Nota: o código de interface (camada B e da camada D também) envolver a interacção com a camada B, e as camadas interage com o modelo, o código é expressa como: pontos Login.BLL.LoginManager e Login.Model.UserInfo, aqui discutidos:
Por que escrever o nome da classe referências + namespace? namespace vêm diretamente você pode usar usando?
A: A introdução de namespace direto é possível, e logo após a introdução do namespace, todas relacionadas a estes dois tipos de objetos, não escreva o seu nome espaço + nome da classe, e , portanto, incorpora a idéia de um reutilizável, nem todos vezes são escritos namespace.
Esta é a interação entre classe e classe, a biblioteca precisa atravessar um problema do caminho quando se olha para a classe, primeiro encontrar o local onde a classe, encontrar um nome de classe. Claro, estamos no mesmo nível (com uma biblioteca), chamar os objetos de diferentes classes, você não ir primeiro caminho (não há necessidade de namespace escrever), é como se encontrar arquivos diferentes no mesmo arquivo, seu caminho tudo a mesma coisa, não precisa de olhar para o caminho.
Camada B:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Login.BLL//业务逻辑层:要与数据访问层交互,去调数据库,从而判断用户输入的账户密码是否数据库中存在
{
public class LoginManager//登录管理
{
//定义一个方法UserLogin,返回值是Login.Model.UserInfo类型的对象
public Login.Model.UserInfo UserLogin(string userName,string password)
{
//先实例化一个D层的对象
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
//通过UI中填写的内容,调用SelectUser方法,返回相应的数据
Login.Model.UserInfo user =uDao.SelectUser(userName ,password );//返回了user,含数据库中的内容
if(user!=null)//登录成功
{
//登录成功,便给此用户加10分,并且返回user
//与D层交互,实例化D层 一个加分对象
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
//调用加分方法,加10分
sDao.UpdateScore(userName, 10);
return user;
}
else //若数据库中没有该用户名,则登录失败
{
throw new Exception("登录失败");
}
}
}
}
Camada D: três categorias:
classe DBUtil: conexão com o servidor para salvar a instrução SQL
classe UserDao: o acesso ao banco de dados - Adicionar Pontuação: instrução de inserção
classe ScoreDAO: o acesso ao banco de dados - Informações sobre o usuário: query
classe DBUtil:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Login.DAL
{
class DbUtil//用于保存 链接服务器的SQL语句
{
public static string ConnString = @"Server=DESKTOP-4LVQ49K;Database=Login;uid=sa;Password=123456";
}
}
Uma pergunta: camada D nesta categoria DBUtil que é o uso? Por que escrever uma categoria separada?
A: Você pode facilmente encontrar: a função desta classe é conseguir uma conexão com o banco de dados, mas a declaração de conexão do banco de dados é muito longo, e classe UserDao e classe ScoreDAO precisa se conectar ao banco de dados, então aqui a declaração para conectar o banco de dados para extrair quando embalado como uma classe, recebendo CONNSTRING um tipo de cadeia objetos, em seguida, amarrado a um banco de dados, só precisa chamar o objeto pode!
classe UserDao:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Login.Model;
using System.Data;
using System.Data.SqlClient;//SqlConnection的命名空间
namespace Login.DAL
{
public class UserDAO//数据访问层---访问用户信息
{
public Login.Model.UserInfo SelectUser(string userName, string password)
{ //using 是为了自动释放()里边的资源
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//实例化了一个连接数据库的对象,类似于一个开数据库的钥匙
{
SqlCommand cmd = conn.CreateCommand();//在现有连接conn的基础上,创建一个命令用以执行SQL指令。
conn.Open();//连接(数据库的)打开
// CommandText:获取或设置要在数据源中执行的 Transact-SQL 语句、表名或存储过程。
cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password";//执行的select语句
//CommandType:获取或设置一个值,该值指示解释 CommandText 属性的方式。
cmd.CommandType = CommandType.Text;//CommandType是一个枚举类型,有三个值:text、StoredProcedure(存储过程)、TableDirect用于表示SqlCommand对象CommandType的执行形式,这里是text
//把用户输入的内容存到Parameters集合中
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter ("@Password",password ));
SqlDataReader reader = cmd.ExecuteReader();//ExecuteReader :尽可能快地对数据库进行查询并得到结果。
//声明一个Login.Model.UserInfo 类型的对象user,只是声明
Login.Model.UserInfo user = null;
while (reader.Read())//把数据库中读到的信息给user对象,返回给B层
{
if (user == null)
{
user = new Login.Model.UserInfo();//实例化user
}
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;
}
}
}
}
classe ScoreDAO:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
namespace Login.DAL
{
public class ScoreDAO
{
public void UpdateScore(string userName, int value)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
SqlCommand cmd = conn.CreateCommand();
conn.Open();
cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";//插入积分
//把用户输入的内容存到Parameters集合中
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Score", value));
//SqlCommand.ExecuteNonQuery()方法:对连接执行SQL语句并返回受影响的行数。
cmd.ExecuteNonQuery();
}
}
}
}
A questão três questões:
✦ um problema: usando () {} Uso:
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
...
}
Para uma explicação detalhada sobre este problema, consulte o próximo blog Xiao Bian:
https://blog.csdn.net/Ginny97/article/details/103943672
✦ Segundo problema: System.data e System.Data.SqlClient namespace:
System.data: isso significa que há uma necessidade de usar o namespace em seus dados, colocar a matriz, o tipo de matriz pode ser usado diretamente, sem a necessidade de adicionar um prefixo.
O local mais comum deve ser camada dados ADO.NET (ou seja, operação classe de base de dados)
System.Data.SQLClient: redistribui ado.net montagens Microsoft lançou o banco de dados SQLServer no seu código, após a introdução, você pode usar o SqlConnection, SqlCommand e outros objetos de banco para banco de dados de acesso SQLServer.
✦ Pergunta três: Compreender de cmd.Parameters.Add () é:
SqlParameter O que é: Representa o parâmetro SqlCommand e um mapeamento opcional para colunas DataSet. Esta classe não pode ser herdada. (SqlCommand: Para representar essa classe não pode ser herdada por instruções Transact-SQL ou procedimentos de banco de dados SQL Server executadas .DataSet armazenado: .. Representa a memória cache de dados)
papel específico e uso, você pode consultar o blog do blogger: graças a sua parte, mas também para aprender uma pequena série: https://blog.csdn.net/hsm_Jasmine/article/details/103339498