exemplos detalhados e código de três Acesso

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:

Aqui Insert Picture Descrição

2. diagrama de blocos de dados:

Aqui Insert Picture Descrição
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:

Aqui Insert Picture Descrição

, 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?
Aqui Insert Picture Descrição
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.
Aqui Insert Picture Descrição
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

Bem, por três pequenas séries de aprendizagem temporária para entender aqui, a próxima parada, sete movimento reconstruído a partir da sala! .◕‿◕.

Publicado 72 artigos originais · ganhou elogios 17 · vê 10000 +

Acho que você gosta

Origin blog.csdn.net/Ginny97/article/details/103985243
Recomendado
Clasificación