热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#中实现登录功能的完整步骤

这篇文章主要给大家介绍了关于C#中实现登录功能的相关资料,我们在使用C#做项目的时候,基本上都需要制作登录界面,

1. 准备工作

新建一个数据库StudentDB

-- 使用master 数据库
use master
go
if exists(select *from sysdatabases where name="StudentDB")
drop database StudentDB
go
create database StudentDB
go

在StudentDB中新建三张表

use StudentDB
go

-- 新建学生表
if exists (select *from sysobjects where name="Student")
drop table Student
go
create table Student
(
stuId   int primary key identity(2000,1),
stuName varchar(30) not null,
stuSex  char(2) not null,
stuAge  int not null,
stuTel  varchar(11) not null,
stuPWd  varchar(30) not null
)

-- 添加学生表的数据
insert into Student (stuName,stuSex,stuAge,stuTel,stuPWd)values("张三","男",21,"12345678543","123456")
insert into Student (stuName,stuSex,stuAge,stuTel,stuPWd)values("赵六","男",21,"12345678543","123456")
insert into Student (stuName,stuSex,stuAge,stuTel,stuPWd)values("韩菲","女",20,"12345678543","123456")


 -- 新建教师表
if exists (select *from sysobjects where name="Teacher")
drop table Teacher
go
create table Teacher
(
tId   int primary key identity(4000,1),
tName varchar(30) not null,
tSex  char(2) not null,
tAge  int not null,
tTel  varchar(11) not null,
tTitle varchar(20),
tPwd   varchar(30) not null    
)
--添加教师表
insert into Teacher(tName,tSex,tAge,tTel,tTitle,tPwd)values("xx","男",32,"12345678901","副教授","123456")

 -- 新建管理员
if exists (select *from sysobjects where name="Admin")
drop table Admin
go
create table Admin
(
adminId   int primary key identity(4000,1),
adminName varchar(30) not null,
adminPWd  varchar(30) not null
)
-- 添加管理员表
insert into Admin(adminName,adminPwd) values("admin","123456")


新建一个winform 项目,修改文本框name 为,txtUserName,txtPwd;登录按钮name 为btnLogin、btnExit。

2.实现登录

功能实现分析

  1. 当用户点击登录的时候,程序首先判断用户名、密码是否为空,然后再根据单选按钮的值,去判断是哪一个角色进行登录。
  2. 上面的事情做好以后,我们要去把用户名和密码拿到数据库进行比较。先使用用户名当作查询条件,返回一个用户对象(管理员、学生、教师,根据具体情况而定,因为我们是用主键当作用户名,主键可以区分一个用户,所以使用用户名查询只返回一条数据)。判断对象是否为null,如果为null则说明用户不存在。否则就判断密码是否正确。

准备实体类

在项目中新建三个类,类名和表名一致,字段名和表里面的字段名一致。

添加类,选中项目->添加->类

管理员类

 public  class Admin
  {
        public int adminId { get; set; }
        public String adminName { get; set; }
        public String adminPwd { get; set; }
  }

学生类

public class Student
    {
        public int stuId { get; set; }
        public string stuName { get; set; }
        public string stuSex { get; set; }
        public int stuAge { get; set; }
        public string stuTel { get; set; }
        public string stuPwd { get; set; }


    }

教师类

 public class Teacher
 {
        public int tId { get; set; }
        public string tName { get; set; }
        public string tSex { get; set; }
        public int tAge { get; set; }
        public string tTel { get; set; }
        public string tTitle { get; set; }
        public string tPWd { get; set; }
 }

准备DBHelper类

public class DbHelper
    {
        /// 
        /// 获取连接对象
        /// 
        /// 
        public static SqlConnection GetConnection()
        {

            SqlConnection cOnn= null;
            try
            {
                //可能发生错误的代码
                if (cOnn== null)
                {
                    cOnn= new SqlConnection();
                    conn.COnnectionString= ConfigurationManager.ConnectionStrings["connString"].ToString();
                    conn.Open();
                    conn.Close();
                }
                return conn;
            }
            catch (Exception ex)
            {
                //发生异常以后要做的事情
                throw ex; // 把问题抛出,让程序员知道那里出了错误
            }
        }

        /// 
        /// 执行增删改
        /// 
        /// 
        /// 
        public static int GetExcuet(string sql)
        {
            // 1. 获取连接对象
            SqlConnection cOnn= GetConnection();
            try
            {
                // 2.打开链接
                conn.Open();
                //3.创建SqlCommand对象,sql语句,连接对象
                SqlCommand cmd = new SqlCommand(sql, conn);
                // 4.执行SQL,并返回受影响的行数
                return cmd.ExecuteNonQuery(); ;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
                conn.Dispose();
            }
        }

        /// 
        /// 返回执行查询的结果
        /// 
        /// 
        public static DataTable GetDataSet(String sql)
        {
            try
            {
                // 1.获取链接对象
                SqlConnection cOnn= GetConnection();
                //2.创建适配器对象
                SqlDataAdapter da = new SqlDataAdapter(sql, conn);
                //3.创建DataSet 对象
                DataSet ds = new DataSet();
                da.Fill(ds);
                return ds.Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
       
      
    }

在App.config中添加 数据库连接字符串,在configuration标签下进行添加


    
  

实现点击事件

当用户点击时候我们就去执行登录事件

根据我们分析,我们首先要判断用户和密码是否正确

           //获取用户名和密码
            string username = txtUserName.Text.Trim();
            string pwd = txtPwd.Text.Trim();
            //当用户名为空的时候就不往下面执行了
            if (username.Equals(""))
            {
                MessageBox.Show("用户名不能为空");
                return;
            }
            if (pwd.Equals(""))
            {
                MessageBox.Show("密码不能为空");
                return;
            }

在判断完所有的公共问题以后,接下来我们就要去判断是哪一个用户进行的登录的,我们可以通过单选按钮的checked属性,进行判断,然后分别去调用他们进行登录的方法。

           //管理员登录
            if (radAdmin.Checked)
            {
                AdminLogin(username);
            }
            //学生登录
            if (radStudent.Checked)
            {
               StudentLogin();
            }
            //教师登录
            if (radTeacher.Checked)
            {
                TeacherLogin();
            }

管理员登录方法实现,根据管理员的用户名进行查询,判断返回表的行数,如果行数小于1,那么表示改用户不存在,返回null,否则返回一个管理员对象。其他的类似

  private Admin AdminLogin(String username)
        {

            string sql = string.Format("select *from Admin where adminId={0}",username);
            DataTable table=  DbHelper.GetDataSet(sql);
            //判断表的行数,大于等于1表示有数据,用户存在,否则返回null
            if (table.Rows.Count <1) return null;

            //新建一个admin对象
            Admin admin = new Admin();
            admin.adminId = Convert.ToInt32(table.Rows[0]["adminId"]);
            admin.adminName = table.Rows[0]["adminName"].ToString();
            admin.adminPwd = table.Rows[0]["adminPwd"].ToString();
            return admin;
        }

学生的登录方法

 private Student StudentLogin(string username)
        {
            string sql = string.Format("select *from Student where stuId={0}", username);
            DataTable table = DbHelper.GetDataSet(sql);
            //判断表的行数,大于等于1表示有数据,用户存在,否则返回null
            if (table.Rows.Count <1) return null;

            /*新建一个student对象 ,这里只给了三个字段进行了赋值,
             * 因为我们登录的时候,只用到了id和密码,
             * 其他时候根据需求进行赋值
            */
            Student student = new Student();
            student.stuId = Convert.ToInt32(table.Rows[0]["stuId"]);
            student.stuName = table.Rows[0]["stuName"].ToString();
            student.stuPwd = table.Rows[0]["stuPwd"].ToString();
            return student;
        }

教师的登录方法

  private Teacher TeacherLogin(string username)
        {
            string sql = string.Format("select *from Teacher where tId={0}", username);
            DataTable table = DbHelper.GetDataSet(sql);
            //判断表的行数,大于等于1表示有数据,用户存在,否则返回null
            if (table.Rows.Count <1) return null;

            /*新建一个student对象 ,这里只给了三个字段进行了赋值,
             * 因为我们登录的时候,只用到了id和密码,
             * 其他时候根据需求进行赋值
            */
            Teacher teacher = new Teacher();
            teacher.tId = Convert.ToInt32(table.Rows[0]["tId"]);
            teacher.tName = table.Rows[0]["tName"].ToString();
            teacher.tPWd = table.Rows[0]["tPWd"].ToString();
            return teacher;
        }

登录方法完成以后,我要对返回来的结果进行处理。首先判断对象是否为null,为null就说用户不存在。反之对象的密码进行比较,密码正确就弹出登录成功,密码不正确就提示密码不正确。

 private void btnLogin_Click(object sender, EventArgs e)
   {
       //获取用户名和密码
       string username = txtUserName.Text.Trim();
       string pwd = txtPwd.Text.Trim();
       if (username.Equals(""))
       {
           MessageBox.Show("用户名不能为空");
           return;
       }
       if (pwd.Equals(""))
       {
           MessageBox.Show("密码不能为空");
           return;
       }
       //管理员登录
       if (radAdmin.Checked)
       {
           /*为什么要返回来,因为以后处理逻辑可能在不同类里面,
            * 这里只是模拟进行分层操作*/
          Admin admin=  AdminLogin(username);
          if (admin == null)
          {
               MessageBox.Show("用户不存在");
               return;
           }
          if (!admin.adminPwd.Equals(pwd))
          {
               MessageBox.Show("密码错误");
               return;
          }
     
       }
       //学生登录
       if (radStudent.Checked)
       {
           Student  student= StudentLogin(username);
           if (student == null)
           {
               MessageBox.Show("用户不存在");
               return;
           }
           if (!student.stuPwd.Equals(pwd))
           {
               MessageBox.Show("密码错误");
               return;
           }
       }
       //教师登录
       if (radTeacher.Checked)
       {
           Teacher teacher=  TeacherLogin(username);

           if (teacher == null)
           {
               MessageBox.Show("用户不存在");
               return;
           }
           if (!teacher.tPWd.Equals(pwd))
           {
               MessageBox.Show("密码错误");
               return;
           }
       }

       MessageBox.Show("登录成功");
   }

总结

  1. 在登录中,我们首先先判断公共的条件,比如说用户名、密码为空等情况,巧用return ,让整个代码的逻辑变得简单。
  2. 在判断完公共的条件以后,在针对每一个具体的角色进行判判断。
  3. 使用使用用户名进行查询,判断返回表的行数,如果行数小于1那么,用户不存在,否则实例一个对象,并给对象赋值
  4. 判断返回对象的是否为空,如果为空则用户不存在,否则用户存在
  5. 最后对密码进行判断,如果密码正确则执行登录成功的操作,如果密码不正确则弹出密码不正确的提示。
  6. 项目下载地址:点击这里

到此这篇关于C#中实现登录功能的文章就介绍到这了,更多相关C#登录功能内容请搜索编程笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程笔记!


推荐阅读
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
author-avatar
yoyo_jiawen43
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有