带着大家一起实现使用ado.net连接数据库实现用户登录

如果觉得对你有用,请关注我的bilibli帐号,csdn做文档,bilibili做视频

Ado.net五大对像-.net开发的数据库操作灵魂-实现用户登录功能_哔哩哔哩_bilibili

真正的实现一次数据库与wpf的前后台连通-重中之重,会这个那表示你入门了_哔哩哔哩_bilibili

作为.net开发,你是要必会ado.net的,这个也是面试过程中必问的一个问题。因为他是我们数据库操作灵魂,无论你后面做什么orm框架,都离不开他。


[!IMPORTANT]

一、采用ADO.Net最原始的方式实现用户登录

ADO.NET(ActiveX Data Objects .NET)是微软为.NET Framework提供的一个数据库访问框架,它包含了五大核心对象,这些对象在数据库访问和操作中发挥着关键作用。以下是ADO.NET的五大对象及其功能介绍:

  1. Connection(连接对象)

    • 功能:用于建立和管理与数据库的连接。

    • 使用场景:开发者可以使用Connection对象来打开和关闭数据库连接,执行事务操作,以及确保数据库连接的正确性和稳定性。

  2. Command(命令对象)

    • 功能:用于执行SQL查询和命令,以及处理查询结果。

    • 使用场景:开发者可以使用Command对象来构建和执行SQL语句,如查询、插入、更新和删除数据等。此外,Command对象还可以用于执行存储过程和调用数据库中的其他功能。

  3. DataAdapter(数据适配器对象)

    • 功能:用于填充DataSet对象,实现断开模式的数据访问。

    • 使用场景:DataAdapter对象充当DataSet和数据库之间的桥梁。它使用Command对象执行SQL命令,从数据库中检索数据,并将这些数据填充到DataSet对象中。同时,DataAdapter还可以将DataSet中的更改回写到数据库中。

  4. DataReader(数据读取器对象)

    • 功能:提供一种快速、只进、只读的数据访问方式,用于从数据库中检索数据。

    • 使用场景:DataReader非常适合于处理大量数据,因为它占用的内存较少。开发者可以使用DataReader逐行读取数据,并在读取过程中对数据进行处理或存储。

  5. DataSet(数据集对象)

    • 功能:是ADO.NET中的核心组件之一,用于存储从数据库中检索的数据,并提供对数据的行、列、表和其他关系的抽象。

    • 使用场景:DataSet对象可以在不连接数据库的情况下操作数据,这使得开发者可以在应用程序中实现数据缓存和离线操作。此外,DataSet还可以与多个不同的数据源搭配使用,以及用于管理应用程序的本机数据。

综上所述,ADO.NET的五大对象在数据库访问和操作中发挥着各自独特的作用。它们共同构成了ADO.NET的强大功能体系,使得开发者能够方便地进行数据库操作,并实现高效、稳定的数据交互。

二、ADO.NET帮助类

首先,我们要用nuget来安装包,相关的操作请参考视频:

.net面试与工作必须技能-nuget的使用及作用_哔哩哔哩_bilibili

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
using System.Data;
using System.Data.SqlClient;
namespace MyAgvLesson.DB
{
    /// <summary>
    /// 一个简单的ADO.NET帮助类(注意这个类可以很丰富,后台会一直加多)
    /// </summary>
    public static class DbHelper
    {
        // 数据库连接字符串  
        static string connectionString = "Server=.;Database=MyAgvLesson;User Id=sa;Password=123456;";
        public static DataTable? Query(string sql, SqlParameter[]? sqlparameters = null)
        {
        //using引用的所有对像必须继承idisalbled接口,主要是实现资源在使用完之后自动释放
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                SqlCommand cmd = connection.CreateCommand();
                cmd.CommandText = sql;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Clear();
                if (sqlparameters != null)
                {
                    cmd.Parameters.AddRange(sqlparameters);
                }
                SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
                sqlDataAdapter.SelectCommand = cmd;
                DataSet ds = new DataSet();
                sqlDataAdapter.Fill(ds);
                if (ds != null && ds.Tables.Count > 0)
                {
                    return ds.Tables[0];
                }
                else
                {
                    return null;
                }
            }
        }
​
    }
}

三、Respository层代码处理

using MyAgvLesson.DB;
using System.Data.SqlClient;
​
namespace MyAgvLesson.Repository
{
    class UserRepository
    {
        /// <summary>
        /// 用户登录仓储层
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="userPwd"></param>
        /// <returns></returns>
        public System.Data.DataTable? UserLogin(string userName, string userPwd)
        {
            const string sql = "select id,user_name,user_pwd,user_role from tb_user where user_name=@user_name and user_pwd=@user_pwd";
            SqlParameter[] parameters = new SqlParameter[2];
            parameters[0] = new SqlParameter() {  ParameterName="@user_name", Value=userName};
            parameters[1] = new SqlParameter() { ParameterName = "@user_pwd", Value = userPwd };
         System.Data.DataTable? dt=   DbHelper.Query(sql, parameters);
           return dt;
        }
    }
}
​

四、Service层代码

using MyAgvLesson.Repository;
using System.Data;
​
namespace MyAgvLesson.Service
{
    public class UserService
    {
        UserRepository userRepository=new UserRepository();
        /// <summary>
        /// 用户登录服务层
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="userPwd"></param>
        /// <returns></returns>
        public Tuple<int,string,string>? UserLogin(string userName,string userPwd)
        {
            DataTable? res= userRepository.UserLogin(userName,userPwd);
            if (res != null && res.Rows.Count > 0)
            {
                DataRow dr = res.Rows[0];
                return new Tuple<int, string, string>(Convert.ToInt32(dr["id"]), dr["user_name"]+string.Empty, dr["user_role"]+string.Empty);
            }
            else
            {
                return null;
            }
        }
    }
}
​

五、viewmodel层

  private void LoginSave()
  {
      //会从数据库做判断
      MessageBox.Show($"用户名是:{_user?.UserName},密码是:{_user?.Password}");
      if(_user==null||_user.UserName==null||_user.Password==null)
      {
          MessageBox.Show("用户名和密码不能为空");
          return;
      }
      UserService userService = new UserService();
   Tuple<int,string,string>? res=   userService.UserLogin(_user.UserName, _user.Password);
      if(res!=null)
      {
          MessageBox.Show($"用户ID为{res.Item1},用户名为:{res.Item2},用户角色为:{res.Item3}");
          MainWindow main = new MainWindow();
          main.Show();
          //如何在viewmodel里关闭login的这个窗体呢?
          //如何把数据存储,并在其它地方使用呢?
      }
      else
      {
          MessageBox.Show("用户名或是密码错误");
      }
​
  }

点击关注不迷路,你们的关注是我们最大的动力

Ado.net是.net面试中必问的一个问题,大家引起重视。

下一节课:如何在viewmodel中使用事件关闭窗体并打开新窗体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值