.NET编程——利用C#和MySQL实现注册登录(WinForm)

本文将介绍利用C#和MySQL实现注册登录,该功能是后续世界聊天室项目的前置功能。


目录

数据库设计

程序设计


数据库设计

实现步骤

step1 在原有项目中新建数据库

step2 新建基于服务的数据库

step3 添加新表

step4 数据库设计 

step5 修改表名

按照步骤step1至step5操作最终结果如下图所示:

注:

1.表名默认为Table,后续程序设计中的SQL语句中的表应为[Table],同理step5修改表名为User,后续程序设计中的SQL语句中的表为[User];

2.IsOnline的数据类型为nchar,默认值为0表示不在线,1表示用户在线,用户在线时无法登陆。


程序设计

1.程序框架 

Login窗体负责注册登录,Client窗体为世界聊天室,UsersDataBase负责存储注册的用户信息。 

2.窗体设计 

可输入账号密码,点击按键即可注册、登录和重置。

3.控件选择

根据窗体设计选择相应的控件,包含按键、以及标签等。

4.程序设计

step1 连接数据库

获取连接数据库的连接字符串,同时数据库的连接要保持晚开早关,保证数据库安全。

static string connStr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\Code\TCP\Server\UsersDataBase.mdf;Integrated Security=True";  //连接数据库标识
using (SqlConnection conn = new SqlConnection(connStr))  //创建数据库连接类
{
    conn.Open();  //打开数据库连接
    /* 执行内容 */
    conn.Close();  //关闭数据库连接
}

step2 点击注册按键时,将用户账号密码写入数据库中

/* 当时点击注册按键时运行 */
        private void btnSign_Click(object sender, EventArgs e)
        {
            /* 获取控件里的值 */
            string name = nameTextBox.Text;
            string password = passwordTextBox.Text;
            if (name == "" || password == "")
            {
                MessageBox.Show("请输入完整");
                cleanText();  //清空文本
                return;
            }
            try
            {
                string sqlSelect = string.Format("select count(*) from [User] where Name='{0}'", name);  //SQL语句,选择表User中Name为name的行
                /// 创建对象时使用using可以在使用完该对象后,自动释放资源
                using (SqlConnection conn = new SqlConnection(connStr))  //创建数据库连接类
                {
                    using (SqlCommand cmdSelect = new SqlCommand(sqlSelect, conn))  //创建数据库命令类
                    {
                        conn.Open();  //打开数据库连接
                        if ((int)cmdSelect.ExecuteScalar() > 0 || name == "admin")
                        {
                            conn.Close();  //关闭数据库连接
                            MessageBox.Show("用户已存在!");
                            cleanText();  //清空文本
                        }
                        else
                        {
                            string sqlInsert = string.Format("insert into [User] (Name,Password,IsOnline)values('{0}','{1}','{2}')", name, password, 0);  //SQL语句,
                            //SQL语句,将参数Name、Password、IsOnline插入到表User中
                            SqlCommand cmdInsert = new SqlCommand(sqlInsert, conn);
                            cmdInsert.ExecuteNonQuery();  //执行SQL语句
                            conn.Close();  //关闭数据库连接
                            MessageBox.Show("注册成功");
                            cleanText();  //清空文本
                        }
                    }
                }
            }
            catch (Exception ex)  //异常捕获
            {
                MessageBox.Show(ex.ToString());  //显示异常信息
            }
        }

注:

1.输入的账号密码应非空,ClenText为自定义函数,用于清空TextBox控件中的文本;

2.利用关键字using可以降低内存的消耗,在使用完对象后内存会被回收;

3.数据库连接的打开与关闭要晚开早关,用的时候才打开,一用完就关掉是最安全的;

4.账号不得重复注册,若账号已存在会注册失败。

step3 点击登陆按键时,输入的密码与账号密码进行匹配

/* 当点击登录按键时运行 */
        private void btnLoad_Click(object sender, EventArgs e)
        {
            /* 获取控件里的值 */
            string name = nameTextBox.Text;
            string password = passwordTextBox.Text;
            if (name == "" || password == "")
            {
                MessageBox.Show("请输入完整!");
                cleanText();  //清空文本
                return;
            }
            if (name == "admin")
            {
                MessageBox.Show("管理员账号!请重新输入");
                cleanText();  //清空文本
                return;
            }
            string sqlSelect = string.Format("select Password,IsOnline from [User] where Name='{0}'", name);  //SQL语句,选择passWord和isOnline
            /* 创建对象时使用using可以在使用完该对象后,自动释放资源 */
            using (SqlConnection conn = new SqlConnection(connStr))  //创建数据库连接类
            {
                using (SqlCommand cmdSelect = new SqlCommand(sqlSelect, conn))  //创建数据库命令类
                {
                    conn.Open();  //打开数据库连接
                    SqlDataReader sqlRead = cmdSelect.ExecuteReader(); //遍历数据库
                    //cmdSelect.ExecuteScalar();  //执行SQL语句
                    if (!sqlRead.Read())
                    {
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("账号不存在!请重新输入");
                        cleanText();  //清空文本
                    }
                    else if (sqlRead["IsOnline"].ToString().Trim() == "1")
                    {
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("账号已登录!请重新输入");
                        cleanText();  //清空文本
                    }
                    else if (sqlRead["Password"].ToString().Trim() == password)
                    {
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("登录成功!");
                        string sqlUpdate = string.Format("update [User] set IsOnline='{0}' where Name='{1}'", 1, name);  //SQL语句,更新isOnline为上线状态
                        using (SqlCommand cmdUpdate = new SqlCommand(sqlUpdate, conn))  //创建数据库命令类
                        {
                            conn.Open();  //打开数据库连接
                            //执行非查询命令时使用ExecuteNonQuery,会返回影响的行数
                            cmdUpdate.ExecuteNonQuery();  //执行SQL语句
                            conn.Close();  //关闭数据库连接
                            cleanText();  //清空文本
                            this.Hide();  //隐藏当前窗体
                            ClientForm clientForm = new ClientForm(name);  //创建并初始化客户端窗体实例
                            clientForm.ShowDialog();  //显示客户端窗体
                        }
                    }
                    else
                    {
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("密码错误!请重新输入");
                        cleanText();
                    }
                }
            }
        }

注:

1.输入的账号密码应非空,ClenText为自定义函数,用于清空TextBox控件中的文本;

2.利用关键字using可以降低内存的消耗,在使用完对象后内存会被回收;

3.数据库连接的打开与关闭要晚开早关,用的时候才打开,一用完就关掉是最安全的;

4.利用sqlSelect选择的行列均应该包含在语句中,例如Password用于判断密码是否匹配,IsOnline用于判断用户是否已上线;

5.点击登录按键后,只能隐藏该窗体,不能关闭该窗体,显示的窗体是子窗体,该窗体为主窗体,若关闭主窗体,所有窗口都会被关闭;

step4 输入管理员账号密码,点击重置按键时,将数据库内容清空

        /* 当点击重置按键时运行 */
        private void btnClean_Click(object sender, EventArgs e)
        {
            /* 获取控件里的值 */
            string name = nameTextBox.Text;
            string password = passwordTextBox.Text;
            if (name == "" || password == "")
            {
                MessageBox.Show("请输入管理员账号密码!");
                cleanText();  //清空文本
                return;
            }
            else if (name == "admin" && password == "admin")
            {
                string sqlDelete = "delete from [User]";  //SQL语句,清空User内容
                using (SqlConnection conn = new SqlConnection(connStr))  //创建数据库连接类
                {
                    using (SqlCommand cmdDelete = new SqlCommand(sqlDelete, conn)) //创建数据库命令类
                    {
                        conn.Open();  //打开数据库连接
                        //执行非查询命令时使用ExecuteNonQuery,会返回影响的行数
                        cmdDelete.ExecuteNonQuery();  //执行SQL语句
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("重置成功!");
                        cleanText();  //清空文本
                    }
                }
            }
            else
            {
                MessageBox.Show("管理员账号错误!");
                cleanText();  //清空文本
            }
        }

注:

1.输入的账号密码应非空,ClenText为自定义函数,用于清空TextBox控件中的文本;

2.利用关键字using可以降低内存的消耗,在使用完对象后内存会被回收;

3.数据库连接的打开与关闭要晚开早关,用的时候才打开,一用完就关掉是最安全的;

4.利用sqlDelete清空数据库内容。

按照step1-step4完成程序设计,源码如下:

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;

namespace Client
{
    public partial class LoginForm : Form
    {
        /* 定义变量 */
        static string connStr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\Code\TCP\Server\UsersDataBase.mdf;Integrated Security=True";  //连接数据库标识
        
        public LoginForm()
        {
            InitializeComponent();
        }
        /* 当打开窗体时运行 */
        private void LoginForm_Load(object sender, EventArgs e)
        {
            //Control.CheckForIllegalCrossThreadCalls = false;  //取消对跨线程访问的检查
        }
        /* 当时点击注册按键时运行 */
        private void btnSign_Click(object sender, EventArgs e)
        {
            /* 获取控件里的值 */
            string name = nameTextBox.Text;
            string password = passwordTextBox.Text;
            if (name == "" || password == "")
            {
                MessageBox.Show("请输入完整");
                cleanText();  //清空文本
                return;
            }
            try
            {
                string sqlSelect = string.Format("select count(*) from [User] where Name='{0}'", name);  //SQL语句,选择表User中Name为name的行
                /// 创建对象时使用using可以在使用完该对象后,自动释放资源
                using (SqlConnection conn = new SqlConnection(connStr))  //创建数据库连接类
                {
                    using (SqlCommand cmdSelect = new SqlCommand(sqlSelect, conn))  //创建数据库命令类
                    {
                        conn.Open();  //打开数据库连接
                        if ((int)cmdSelect.ExecuteScalar() > 0 || name == "admin")
                        {
                            conn.Close();  //关闭数据库连接
                            MessageBox.Show("用户已存在!");
                            cleanText();  //清空文本
                        }
                        else
                        {
                            string sqlInsert = string.Format("insert into [User] (Name,Password,IsOnline)values('{0}','{1}','{2}')", name, password, 0);  //SQL语句,
                            //SQL语句,将参数Name、Password、IsOnline插入到表User中
                            SqlCommand cmdInsert = new SqlCommand(sqlInsert, conn);
                            cmdInsert.ExecuteNonQuery();  //执行SQL语句
                            conn.Close();  //关闭数据库连接
                            MessageBox.Show("注册成功");
                            cleanText();  //清空文本
                        }
                    }
                }
            }
            catch (Exception ex)  //异常捕获
            {
                MessageBox.Show(ex.ToString());  //显示异常信息
            }
        }
        /* 当点击登录按键时运行 */
        private void btnLoad_Click(object sender, EventArgs e)
        {
            /* 获取控件里的值 */
            string name = nameTextBox.Text;
            string password = passwordTextBox.Text;
            if (name == "" || password == "")
            {
                MessageBox.Show("请输入完整!");
                cleanText();  //清空文本
                return;
            }
            if (name == "admin")
            {
                MessageBox.Show("管理员账号!请重新输入");
                cleanText();  //清空文本
                return;
            }
            string sqlSelect = string.Format("select Password,IsOnline from [User] where Name='{0}'", name);  //SQL语句,选择passWord和isOnline
            /* 创建对象时使用using可以在使用完该对象后,自动释放资源 */
            using (SqlConnection conn = new SqlConnection(connStr))  //创建数据库连接类
            {
                using (SqlCommand cmdSelect = new SqlCommand(sqlSelect, conn))  //创建数据库命令类
                {
                    conn.Open();  //打开数据库连接
                    SqlDataReader sqlRead = cmdSelect.ExecuteReader(); //遍历数据库
                    //cmdSelect.ExecuteScalar();  //执行SQL语句
                    if (!sqlRead.Read())
                    {
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("账号不存在!请重新输入");
                        cleanText();  //清空文本
                    }
                    else if (sqlRead["IsOnline"].ToString().Trim() == "1")
                    {
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("账号已登录!请重新输入");
                        cleanText();  //清空文本
                    }
                    else if (sqlRead["Password"].ToString().Trim() == password)
                    {
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("登录成功!");
                        string sqlUpdate = string.Format("update [User] set IsOnline='{0}' where Name='{1}'", 1, name);  //SQL语句,更新isOnline为上线状态
                        using (SqlCommand cmdUpdate = new SqlCommand(sqlUpdate, conn))  //创建数据库命令类
                        {
                            conn.Open();  //打开数据库连接
                            //执行非查询命令时使用ExecuteNonQuery,会返回影响的行数
                            cmdUpdate.ExecuteNonQuery();  //执行SQL语句
                            conn.Close();  //关闭数据库连接
                            cleanText();  //清空文本
                            this.Hide();  //隐藏当前窗体
                            ClientForm clientForm = new ClientForm(name);  //创建并初始化客户端窗体实例
                            clientForm.ShowDialog();  //显示客户端窗体
                        }
                    }
                    else
                    {
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("密码错误!请重新输入");
                        cleanText();
                    }
                }
            }
        }
        /* 清空控件内容 */
        private void cleanText()
        {
            nameTextBox.Text = "";
            passwordTextBox.Text = "";
        }
        /* 当点击重置按键时运行 */
        private void btnClean_Click(object sender, EventArgs e)
        {
            /* 获取控件里的值 */
            string name = nameTextBox.Text;
            string password = passwordTextBox.Text;
            if (name == "" || password == "")
            {
                MessageBox.Show("请输入管理员账号密码!");
                cleanText();
                return;
            }
            else if (name == "admin" && password == "admin")
            {
                string sqlDelete = "delete from [User]";  //SQL语句,清空User内容
                using (SqlConnection conn = new SqlConnection(connStr))  //创建数据库连接类
                {
                    using (SqlCommand cmdDelete = new SqlCommand(sqlDelete, conn)) //创建数据库命令类
                    {
                        conn.Open();  //打开数据库连接
                        //执行非查询命令时使用ExecuteNonQuery,会返回影响的行数
                        cmdDelete.ExecuteNonQuery();  //执行SQL语句
                        conn.Close();  //关闭数据库连接
                        MessageBox.Show("重置成功!");
                        cleanText();
                    }
                }
            }
            else
            {
                MessageBox.Show("管理员账号错误!");
                cleanText();
            }
        }
    }
}

最后,提供的源码打开了客户端窗体并把用户的账号通过窗口间传值的方式传递给客户端程序中,关闭客户端窗体时候,应该更新用户的在线状态,示例代码如下,读者可自行补充完成修改。

/* 当关闭窗体时运行 */
        private void ClientForm_Closing(object sender, FormClosingEventArgs e)
        {
            string sqlUpdate = string.Format("update [User] set IsOnline='{0}' where Name='{1}'", 0, name);  //SQL语句,更新isOnline为下线状态
            /* 创建对象时使用using可以在使用完该对象后,自动释放资源 */
            using (SqlConnection conn = new SqlConnection(connStr))  //创建数据库连接类
            {
                using (SqlCommand cmdUpdate = new SqlCommand(sqlUpdate, conn))  //创建数据库命令类
                {
                    conn.Open();  //打开连接
                    //执行非查询命令时使用ExecuteNonQuery,会返回影响的行数
                    cmdUpdate.ExecuteNonQuery();  //执行SQL语句
                    conn.Close();  //关闭数据库连接
                    this.Hide();
                }
            }
        }
  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
软件是基于.net framework 4.7.2 开发,数据库为 Mysql8.0.24 软件基于 Socket 编程,C/S 架构风格开发。客户端通过发送指令得到服务器的返回信息。 主要功能: (1) 用户注册:用户可以申请注册账号并设置密码,然后应用将其信息存入到数据库中。而管理者的账号和密码由开发者统一分配。二者存储在同一数据库中,并设置标志标记此账号信息是普通用户还是管理者账户。 (2) 用户登录:用户或者管理者登录时输入账户和密码,然后和数据库中的信息作对比,如果对比成功就显示登录成功进入主界面,否则将提示账号不存在或者密码错误。 (3) 禁言违规用户:由于存在发表引战言论、谩骂攻击以及其他违法乱纪行为的用户,管理员需要对该用户进行禁言。禁言的方式为根据违法言论者的套接字找到对应的用户,标记该用户为禁言。 (4) 创建聊天室:每一个聊天室需要一个服务器的端口进行监听信息,因此每次创建一个聊天室都需要查找并打开服务器中的空闲端口进行监听。此外,新建聊天室后,将聊天室的信息存储到数据库中。 (5) 删除违规聊天室:在数据库中查找到违规聊天室 id 对应的聊天室信息,得到该聊天室的服务器端口后,将该聊天室信息移除出数据库,最后释放该聊天室的端口。 (6) 消息提醒:客户端在监听捕获来自服务端的消息后,对用户进行提醒。 (7) 查看消息记录:客户端监听到的信息会被自动存储到本地数据库以方便用户查看,通过聊天室的 id 可以查询到信息的发送用户和发送时间。
.NET C#是一种面向对象的编程语言,它是微软公司推出的一种多平台开发框架。基于.NET C#的开发平台可以支持Windows、Linux和macOS系统,能够开发桌面应用程序、web应用程序和移动应用程序等。 .NET C#具有很多优点。首先,它具有强大的跨平台能力,可以在不同的操作系统上运行,大大提升了开发的灵活性和效率。其次,C#语言本身具有简单易学的特点,语法规则清晰,对于初学者来说比较容易上手。同时,它也拥有许多强大的库和工具,可以大大减少开发的复杂性。此外,C#还支持其他语言相关的功能,如异步编程、LINQ等,使开发更加简洁高效。 基于.NET C#的开发框架也是非常强大的。它提供了丰富的类库和API,可以快速开发出高质量、可扩展的应用程序。对于数据库操作、网络通信、图形界面开发等常用功能,都有相应的库和工具来支持。同时,它还提供了一套灵活的开发模型和丰富的设计模式,可以满足不同项目的需求。 .NET C#还有一个优点是它具有良好的安全性和稳定性。在开发过程中,C#会自动进行内存管理,减少内存泄漏和垃圾回收问题。而且,C#还提供了一些强大的安全特性,如类型安全、代码访问安全等,可以保证应用程序的安全性。 总之,基于.NET C#的开发平台是一种强大、灵活和高效的工具,可以帮助开发人员快速开发出高质量的应用程序。无论是开发桌面应用程序还是web应用程序,都可以选择.NET C#作为开发语言,来实现各种需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值