Ejemplos detallados y el código de tres Login

En primer lugar, ejemplos:

Ahora hay un sistema de puntos, los estudiantes inician una sesión cada vez que reciben un 10 puntos de bonificación.

Este ejemplo es sólo un sencillo de tres a iniciar sesión cada vez que se conecte el éxito más 10, y no otras características, por supuesto, hay muchos bug que puede necesitar ser optimizado.

1. Diseñar tablas de bases de datos:

Aquí Insertar imagen Descripción

2. Datos diagrama de bloques:

Aquí Insertar imagen Descripción
Los lectores cuidadosos seguro que encontrará que, además de la interfaz de usuario, BLL, DAL tres y un modelo existir, no lo hace el modelo pertenecen a cualquiera, pero tres con el fin de mejor existe enlace. Esta clase sólo las tiendas, con más de tres cosas de uso común. Juega un papel de coordinación. clase del modelo, que es la clase de entidad Entidad.

3. varios niveles de relaciones:

Aquí Insertar imagen Descripción

En segundo lugar, el análisis de código fuente

clase del modelo: a los datos encapsulados, para la transferencia de datos entre las tres capas, sin ninguna referencia a un conjunto, pero los otros tres todas las referencias a él

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; }

    }
}

capa de interfaz de usuario: 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: el código de la interfaz de usuario (la capa B y la capa D también) implican la interacción con la capa B, y las interactúa capa con el Modelo, el código se expresa como: puntos Login.BLL.LoginManager y Login.Model.UserInfo, aquí discutidos:
¿Por qué escribir el nombre de clase + referencias de espacio de nombres? espacio de nombres que vienen directamente pueden utilizar usando?
Aquí Insertar imagen Descripción
A: La introducción del espacio de nombres directa es posible, y directamente después de la introducción del espacio de nombres, todos ellos relacionados con estos dos tipos de objetos, no escriba su nombre de espacio + nombre de la clase, y por lo tanto encarna la idea de un reutilizable, no todas las los tiempos están escritos espacio de nombres.

Esta es la interacción entre clase y clase, la biblioteca tiene que cruzar un problema del camino en la búsqueda de la clase, en primer lugar encontrar la ubicación en la clase, encontrar un nombre de clase. Por supuesto, estamos en el mismo nivel (con una biblioteca), llamar a los objetos de diferentes clases, que no van primer camino (sin necesidad de espacio de nombres de escritura), que es como nos encontramos con diferentes archivos en el mismo archivo, a su paso de todos modos, no necesitamos buscar la ruta.
Aquí Insertar imagen Descripción
Capa 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("登录失败");
            }
        }
    }
}

Capa D: tres categorías:

DBUtil clase: Conectar con el servidor para guardar la instrucción SQL
clase UserDAO: el acceso a la base de datos - Agregar Puntuación: instrucción de inserción
clase ScoreDAO: el acceso a la base de datos - Información del usuario: consulta

DBUtil clase:

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";

    }
}

Una pregunta: ¿la capa D de esta categoría DBUtil ¿para qué sirve? ¿Por qué escribir una categoría separada?

A: Usted puede encontrar fácilmente: la función de esta clase es lograr una conexión con la base de datos, pero la declaración de conexión de base de datos es muy larga, y la clase UserDAO y la clase ScoreDAO necesita conectarse a la base de datos, de modo que aquí la declaración para conectar la base de datos para el extracto cuando se envasa como una clase, recibiendo cONNSTRING un tipo de cadena objetos, entonces atado a una base de datos, sólo tiene que llamar al objeto puede!

UserDAO clase:

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;
            }
            

        }
    }
}

ScoreDAO clase:

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();
            }
        }

    }
   
}

Una pregunta tres cuestiones:
✦ un problema: el uso de () {} Uso:

using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
...
}

Para una explicación detallada de este tema, véase el próximo blog Xiao Bian:
https://blog.csdn.net/Ginny97/article/details/103943672

✦ Segundo problema: System.data y System.Data.SQLClient espacio de nombres:

System.data: significa que existe la necesidad de utilizar el espacio de nombres en sus datos, colocar la matriz, el tipo de matriz se puede utilizar directamente, sin la necesidad de añadir un prefijo.
El lugar más común debe ser capa de datos ADO.NET (es decir, operación de clase de la base de datos)

System.Data.SQLClient: redistribuye ado.net asambleas de base de datos Microsoft SQL Server liberado en el código, después de la introducción, se puede utilizar el SqlConnection, SqlCommand y otros objetos de la base a la base de datos de acceso sqlserver.

✦ Pregunta tres: La comprensión de cmd.Parameters.Add () es:
SqlParameter Qué es: Representa el parámetro SqlCommand, y una asignación opcional de columnas conjunto de datos. Esta clase no se puede heredar. (SqlCommand: Para representar esta clase no puede ser heredada por instrucciones de Transact-SQL o procedimientos de base de datos SQL Server ejecuta .DataSet almacena: .. Representa la memoria caché de datos)

papel específico y el uso, puede hacer referencia al blog del blogger: gracias a su acción, sino también para aprender una pequeña serie: https://blog.csdn.net/hsm_Jasmine/article/details/103339498

Así, por tres pequeñas series de temporal de aprendizaje para comprender aquí, la siguiente parada, siete ir reconstruida a partir habitación! .◕‿◕.

Publicado 72 artículos originales · ganado elogios 17 · Vistas a 10000 +

Supongo que te gusta

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