자세한 예제 및 코드 셋 명 로그인

첫째, 예 :

지금 포인트 시스템, 학생들이 각 시간에 로그인 10 보너스 포인트가 수신입니다.

이 예는 단지 간단한 3 로그인은 물론 성공 플러스 (10), 그리고 기타 기능에 로그인 할 때마다입니다 최적화해야 할 수 많은 버그가 있습니다.

1. 디자인 데이터베이스 테이블 :

그림 삽입 설명 여기

2. 데이터 블록 다이어그램 :

그림 삽입 설명 여기
주의 깊은 독자라면 확실히 UI, BLL, DAL 세와 모델의 존재 외에도 모델 중 하나에 속하지 않는 것을 발견하지만, 링크가 존재하는 더 나은을 위해 세 것입니다. 일반적으로 사용되는 개 이상의 것들로이 클래스는 저장. 코디 역할을한다. 엔티티 클래스 법인 인 모델 클래스.

관계 3. 여러 수준 :

그림 삽입 설명 여기

둘째, 소스 코드 분석

모델 클래스 : 어셈블리에 대한 참조없이 세 계층 사이의 데이터 전송을위한 캡슐화 된 데이터,하지만 그에게 다른 세 모든 참조에

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

    }
}

UI 층 : 로그인

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

        }
    }
} 

주 : UI 코드 Login.BLL.LoginManager 및 Login.Model.UserInfo, 여기서 설명하는 점 (층 B와 같은 층 D)가 B 층과 상호 작용하고, 모델 층 상호 작용을 포함하는이 코드는 다음과 같이 표현된다 :
왜 + 네임 스페이스? 네임 스페이스 참조가 직접 와서 사용 사용할 수있는 클래스 이름을 쓰기?
그림 삽입 설명 여기
A : 직접 네임 스페이스의 도입이 가능하고, 직접 네임 스페이스의 모든 이름 + 클래스 이름 공간을 작성하지 않는 개체의 두 가지 유형에 관한, 그리고 도입 후 이렇게하지 모든 재사용의 아이디어를 구체화 시간은 네임 스페이스를 기록됩니다.

이것은 클래스와 클래스 사이의 상호 작용, 라이브러리 클래스를 찾을 때 먼저 클래스, 클래스 이름을 찾을 위치를 찾아 경로 문제를 통과해야합니다. 물론, 우리는 (라이브러리와) 같은 수준, 먼저 경로 (쓰기 네임 스페이스에 대한 필요가 없습니다)를하지 않는, 다른 클래스의 객체를 호출에있다 우리가 동일한 파일에 다른 파일을 찾을처럼, 그것은 자신의 경로입니다 모두 같은, 우리는 경로를 찾을 필요가 없습니다.
그림 삽입 설명 여기
레이어 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("登录失败");
            }
        }
    }
}

D를 레이어 : 세 가지 범주를 :

클래스 DbUtil : SQL 문 저장하는 서버에 연결
클래스 UserDAO를 : 데이터베이스에 액세스 - 추가 점수 : 삽입 문
클래스 ScoreDAO : 데이터베이스에 액세스 - 사용자 정보 : 쿼리

클래스 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";

    }
}

질문 :이 카테고리의 D 층 DbUtil 사용은 무엇인가? 왜 별도의 카테고리를 쓰기?

A는이 클래스의 기능은 데이터베이스에 대한 연결을 달성하는 것입니다 만, 데이터베이스 연결 문은 매우 긴, 그리고 UserDAO 클래스와 ScoreDAO 클래스를 추출하기 위해 데이터베이스를 연결하는, 그래서 여기에 데이터베이스에 문을 연결하는 데 필요한 : 당신은 쉽게 찾을 수 있습니다 문자열 형식의 개체를 ConnString 수신하는 클래스로 포장 할 때, 다음 데이터베이스에 연결 만 객체 캔을 호출해야합니다!

클래스 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;
            }
            

        }
    }
}

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

    }
   
}

질문 세 가지 문제 :
✦ 문제 :} {() 사용을 사용하여 :

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

이 문제에 대한 자세한 설명은 다음 블로그 샤오 총통 참조
https://blog.csdn.net/Ginny97/article/details/103943672을

✦ 두 번째 문제 : System.data과의 System.Data.SQLClient 네임 스페이스 :

System.data : 거기, 데이터의 네임 스페이스를 사용하여 배열을 배치 할 필요가있다, 배열 유형이 접두사를 추가 할 필요없이 직접 사용할 수 있다는 것을 의미한다.
가장 일반적인 장소는 ADO.NET 데이터 층되어야한다 (즉, 데이터베이스의 클래스 운영)

의 System.Data.SQLClient : 재분배 ado.net 어셈블리 마이크로 소프트는 코드에서 SQLSERVER 데이터베이스를 발표 도입 후에는 액세스 SQLSERVER 데이터베이스에도록 SqlConnection, SqlCommand를 다른 데이터베이스 개체를 사용할 수 있습니다.

✦ 질문 세 가지 : (cmd.Parameters.Add의 이해)입니다 :
SqlParameter에 무엇 : 그것은 SqlCommand를 매개 변수 및 데이터 집합 열에 옵션 매핑을 나타냅니다. 이 클래스는 상속 될 수 없습니다. (SqlCommand를이 클래스를 표현하기가 SQL Server 데이터베이스 .DataSet 실행 절차를 거래-SQL 문에 대한 상속 또는 저장할 수 없습니다 .. 데이터 캐시 메모리를 나타냅니다)

그녀의 공유에 감사뿐만 아니라 작은 시리즈 배우 : 특정 역할과 사용, 당신은 블로거의 블로그를 참조 할 수 있습니다 https://blog.csdn.net/hsm_Jasmine/article/details/103339498을

음, 일시적인 학습의 세 개의 작은 시리즈는 여기 이해하기 위해, 다음 정거장, 방에서 일곱 재구성 이동! .◕‿◕.

게시 72 개 원래 기사 · 원 찬양 17 ·은 10000 +를 볼

추천

출처blog.csdn.net/Ginny97/article/details/103985243