Loading... ## 概述 **概述:** ADO.NET是一组公开数据访问服务的类,可以对数据源进行连接,对数据进行增、删、改、查等操作。ADO.NET为创建分布式数据共享应用程序提供了一组发放的组件。 **特点:** 与数据源断开连接后也可以使用数据 ## ADO.NET核心组件 **DataSet**(数据集):独立于数据源的数据访问,DataSet是一个内存中的缓存,用于在应用程序中保存从数据库中检索的数据。它可以包含多个DataTable对象,关系和约束,可以方便地在应用程序中进行数据处理。 **.NET 数据提供程序** <div class="tip inlineBlock success simple small"> 1️⃣直接对数据源进行操作 2️⃣连接数据源、执行命令和检索结果 3️⃣实现数据操作和对数据的快速、只进只读访问 </div> .NET 数据提供程序中的4大核心对象 <div class="tip inlineBlock info simple small"> 1️⃣Connection:用于开启程序和数据库之间的连接,它是连接数据库的关键组件,可以打开和关闭与数据库的连接。通过Connection对象,你可以指定数据库的位置、凭据、连接超时等参数。 2️⃣Command:用于对数据库发出一些操作指令,它允许你执行SQL语句(例如SELECT、INSERT、UPDATE、DELETE等),并从数据库中检索数据或修改数据。Command对象也可以执行存储过程。 3️⃣DataAdapter:在数据源和DataSet之间执行数据传输工作,DataAdapter是用于填充DataSet(数据集)和更新数据库的桥梁。它可以从数据库中检索数据,并将其填充到DataSet中的DataTable对象中。同样,它也可以从DataSet中获取更改,并将这些更改更新回数据库。 4️⃣DataReader:DataReader是一种只进只读的数据访问方式。当你执行查询并希望逐行读取结果时,DataReader非常有用。它比DataSet更轻量级,对于大型数据集来说,性能更好,因为它不需要将整个结果集加载到内存中。 </div> ![ADO.NET结构分析](https://www.jbea.cn/usr/uploads/2023/10/1495813281.png) ### Connection连接对象 **语法:`SqlConnection connection = new Sqlconnection(String ConnectionString);`** **Connection对象常用属性和方法:** | 属性🔨 / 方法📦 | 说 明 | | -------------------- | --------------------------------------- | | 🔨 ConnectionString | 设置/获取应用程序连接数据库的连接字符串 | | 📦 void Open() | 用于打开与指定数据库的连接 | | 📦 void Close() | 关闭与数据库的连接 | **使用案例演示:** ```csharp // 第一步: 定义链接字符串 private string constr constr = @"server=数据库服务引擎IP地址或主机名称;database=数据库名称;user=用户名;pwd=密码"; /* 数据库链接字符串拼接方式有很多种 * 例如: * Data Source=服务器名称或IP地址;Initial Catalog=数据库名;User Id=用户名;pwd=密码; * Data Source=服务器名称或IP地址;Initial Catalog=数据库名;Integrated Security=True; //Windows集成验证 */ // 第二步: 创建连接对象,此处演示案例为连接SQL Server数据库 SqlConnection connection = new Sqlconnection(constr); //在创建连接对象时,需要提供连接字符串 // 第三步: 打开或关闭连接对象 connection.Open(); //打开连接。如需关闭,请使用Close()方法 ``` <div class="tip inlineBlock error simple small"> **⚠注意** 在.NET Core 框架下,不会自动添加System.Data和System.Data.SqlClient的引用,需要在菜单栏,选择"工具(T)" >"NuGet包管理器(N)"; ![NuGet包管理器(N)](https://www.jbea.cn/usr/uploads/2023/10/1573132248.png) 在“NuGget – 解决方案”窗口“浏览”选项卡的搜索框中输入“System.Data.SqlClient”关键字; 点中搜索列表中匹配的条目,勾选项需要添加引用的项目,点击安装 ![安装SqlClient包](https://www.jbea.cn/usr/uploads/2023/10/1851984366.png) </div> <div class="tip inlineBlock success simple small"> 💬提示:在进行数据库连接或操作数据库时,请在代码中添加合理的try-catch-finally异常处理语句 ```csharp try{ //可能会出现异常的代码 }catch(Exception ex){ //出现异常后进行的处理代码 }finally{ //不管是否出现异常都需要执行的代码 } ``` </div> ### Command命令对象 **功能:** 执行返回单条记录的SELECT语句,例如聚合函数SUM、AVG等 执行返回具有多条记录的SELECT语句 执行DML语句,例如修改、插入、删除记录等 执行DDL语句,如创建表 **语法:**`SqlCommand command=new SqlCommand(String sql,SqlConnection conn);` **Command对象常用属性和方法:** | 属性🔨 / 方法📦 | 说 明 | | --------------------------------- | -------------------------------------------------------------------------------------------------- | | 🔨 Connection | Command对象使用的数据库连接 | | 🔨 CommandText | 要执行的SQL语句 | | 📦 SqlDataReader ExecuteReader() | 执行查询命令,返回DataReader对象 | | 📦 Object ExecuteScalar() | 执行查询返回单一值,例如执行COUNT(*)<br />✔执行返回单个值的select语句,如聚合函数SUM、AVG等 | | 📦 int ExecuteNonQuery() | 用于执行非查询类操作, 返回的值是本次操作所影响的行数<br />✔执行DML语句,如修改、插入、删除记录等 | **演示案例-使用Command对象查找BookDB数据库用户表中是否存在指定用户:** 新建数据库帮助类DBHelper: ```csharp using System; using System.Data.SqlClient; namespace Demo { /// <summary> /// 数据库帮助类 /// </summary> public class DBHelper { // 定义数据库连接字符串 private const string constr = @"server=.;database=BookDB;user=sa;pwd=123123"; /// <summary> /// 执行SQL语句,返回数据结果集中的第一行的第一列的值 /// </summary> /// <param name="sql">需要执行的SQL语句</param> /// <returns>返回数据结果集中的第一行的第一列的值,会返回NULL</returns> public object ExecuteScalar(string sql) { // 创建数据库连接对象并提供数据库连接字符串凭证 SqlConnection con = new SqlConnection(constr); // 创建命令对象,提供数据库连接对象以及需要执行的SQL语句 SqlCommand cmd = new SqlCommand(sql, con); // 使用异常处理 try { con.Open(); return cmd.ExecuteScalar(); } catch (Exception ex) { Console.WriteLine($"数据库访问异常,错误信息:{ex.Message}"); } finally { con.Close(); } return null; } } } ``` 测试类Program: ```csharp using System; namespace Demo { class Program { static void Main(string[] args) { // 提示用户输入用户名与登录密码 Console.Write("请输入您的用户名:"); string name = Console.ReadLine(); Console.Write("请输入您的登录密码:"); string pwd = Console.ReadLine(); // 拼接SQL语句,判断该用户是否存在 string checkUserInfo = $"SELECT COUNT(0) FROM UserInfo WHERE Name = '{name}' AND Password = '{pwd}'"; // 创建DBHelper对象 DBHelper db = new DBHelper(); // 调用该方法 int res = Convert.ToInt32(db.ExecuteScalar(checkUserInfo)); // 判断执行结果 if (res == 1) { Console.WriteLine("用户登录成功!"); } else { Console.WriteLine("您输入的账号或密码不存在,请稍后再试!"); } } } } ``` ### DataReader数据读取对象 **功能:** 从数据源中检索只读、只进的数据流 每次读取一行数据 **DataReader对象常用属性和方法:** | 属性🔨 / 方法📦 | 说 明 | | --------------- | --------------------------------------------------------------------------------------- | | 🔨 FieldCount | 获取当前行的列数 | | 🔨 HasRows | 属性获取一个值,该值指示SqlDataReader是否包含一行或多行,如果是则返回true,否则返回false; | | 🔨 IsClosed | 判断当前对象是否已关闭。若值为true,则表示当前对象已关闭;否则,值为false | | 📦 Read() | 前进到下一行记录。若读到一条记录,则返回true;否则,返回false | | 📦 Close() | 关闭DataReader对象 | **演示案例:** ```csharp // 调用DBHelper类中的查询一行的方法 ... SqlDataReader reader = db.ExecuteReader(sql); while (reader != null && reader.HasRows && reader.Read()){ //循环读取数据行 string name = reader["UserName"].ToString(); //...省略其他代码 } // 循环读取结束后,关闭读取器 if(reader != null) { reader.Close(); //关闭DataReader } ``` ### DataAdapter数据适配器对象 **功能:** 表示一组SQL命令和一个数据库连接,它们用于填充DataSet和更新数据源 创建DataAdapter对象: ```csharp //创建Connection对象 //... con.Open(); SqlDataAdapter adapter = new SqlDataAdapter("查询SQL语句", con); ``` 创建DataSet对象,调用DataAdapter对象提供的Fill()方法,将数据从数据源加载到DataSet中: ```csharp // 创建数据集对象 DataSet ds=new DataSet(); // 填充数据集 adapter.Fill(ds); ``` ## DataSet简介 **概述:** 是数据的脱机容器,是临时存储数据的仓库 不包含数据库连接的概念(数据可以来自数据库也可以来自其他类型的文件) DataSet 由一组数据表组成,每个表又由数据列和数据行组成 ![DataSet结构图](https://www.jbea.cn/usr/uploads/2023/10/513956096.png) ## 总结 ![总结-1](https://www.jbea.cn/usr/uploads/2023/10/2918469133.png) ![总结-2](https://www.jbea.cn/usr/uploads/2023/10/2574036441.png) 最后修改:2023 年 10 月 13 日 © 允许规范转载 赞 3 都滑到这里了,不点赞再走!?