如果觉得对你有用,请关注我的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的五大对象及其功能介绍:
Connection(连接对象)
功能:用于建立和管理与数据库的连接。
使用场景:开发者可以使用Connection对象来打开和关闭数据库连接,执行事务操作,以及确保数据库连接的正确性和稳定性。
Command(命令对象)
功能:用于执行SQL查询和命令,以及处理查询结果。
使用场景:开发者可以使用Command对象来构建和执行SQL语句,如查询、插入、更新和删除数据等。此外,Command对象还可以用于执行存储过程和调用数据库中的其他功能。
DataAdapter(数据适配器对象)
功能:用于填充DataSet对象,实现断开模式的数据访问。
使用场景:DataAdapter对象充当DataSet和数据库之间的桥梁。它使用Command对象执行SQL命令,从数据库中检索数据,并将这些数据填充到DataSet对象中。同时,DataAdapter还可以将DataSet中的更改回写到数据库中。
DataReader(数据读取器对象)
功能:提供一种快速、只进、只读的数据访问方式,用于从数据库中检索数据。
使用场景:DataReader非常适合于处理大量数据,因为它占用的内存较少。开发者可以使用DataReader逐行读取数据,并在读取过程中对数据进行处理或存储。
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("用户名或是密码错误"); } }