ADO.NET知识总结6---SqlDataAdapter桥接器

news/2025/1/11 20:25:43/

目录

7.1 SqlDataAdapter介绍

7.2 SqlDataAdapter创建

7.3 填充数据集

7.4 SqlDataAdapter更新数据

7.5 DataReader与DataAdapter


 

 

7.1 SqlDataAdapter介绍

SqlDataAdapter(桥接器)DataSet数据库 之间用于检索和保存数据的桥梁。

SqlDataAdapter类 —— 填充DataSet以及更新数据源一组数据库命令 和一个数据库连接。是DataSetSQLServer之间的桥接器

它是如何提供桥接的?

—— 1)通过 Fill 方法将数据填充到 DataSet

—— 2)通过Update 方法将更改的数据更新到数据库,使数据保持一致

SqlDataAdapter 对数据的操作也是建立在SqlCommand基础之上的。

它有 4个重要属性

SelectCommand ——查询命令

InsertCommand ——插入命令

UpdateCommand ——更新命令

DeleteCommand —— 删除命令

7.2 SqlDataAdapter创建

1.设置SelectCommand 推荐

// conn连接对象  sql  T-SQL语句或存储过程名     
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(sql, conn);

2.通过一个SqlCommand对象创建adapter 推荐

 SqlCommand cmd = new SqlCommand(sql, conn);SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);

3.通过查询语句连接对象创建adapter (如果是无参查询,经常采用的方式)

SqlDataAdapter adapter2 = new SqlDataAdapter(sql, conn);

4.查询语句连接字符串,也可以创建adapter 不推荐

SqlDataAdapter adapter3 = new SqlDataAdapter(sql, connStr);

7.3 填充数据集

DataAdapter可以填充 DataSetDataTable ======> Fill方法

连接与断开两种方式填充数据的执行机制

断开式 没有显式打开连接 =====> 不用打开数据库连接???? ------>当然不是

DataAdapter来做这件事——打开连接-----获取数据------填充到Ds /dt-----自动关闭连接

断开式给我们的错觉就是:没有与数据库建立连接

其实不是,只是这个过程都由DataAdapter来完成.

 using (SqlConnection conn = new SqlConnection(connStr)){SqlDataAdapter da = new SqlDataAdapter(sql, conn);//conn Closed状态da.Fill(dt); //da 打开连接,获取数据,填充到dt中,断开连接//conn Closed状态}

连接式 显式打开连接 ,显式关闭连接

using (SqlConnection conn = new SqlConnection(connStr)){SqlDataAdapter da = new SqlDataAdapter(sql, conn);conn.Open();//conn是Open状态da.Fill(dt); //填充到dt中  //conn仍然是Open状态conn.Close();}

区别速度上,连接式的速度肯定要比断开式 要快

7.4 SqlDataAdapter更新数据

SqlDataAdapter还可以将DataSet或DataTable中更改的数据更新到数据源

更新方式 Update(ds/dt/Rows)

由于DataRow行有个RowState属性 ---行状态: Added 已添加 Modified 已修改 Deleted 已删除

DataTable中新加的行,行状态是:Added

DataTable中行修改了信息,行状态是:Modified

DataTable中删除的行,行状态是:Deleted

SqlDataAdapter更新数据,就是利用DataSet或DataTable中行的状态来完成的。

当然,SqlDataAdapter实现更新功能,还需要配置对应的命令

配置对应命令有2种方式:

1.使用SqlCommandBuilder类 ---自动为DataAdapter配置相关的命令

 using (SqlConnection conn = new SqlConnection(connStr)){SqlDataAdapter da = new SqlDataAdapter(sql, conn);SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);da.Update(dt);} 

2.手动配置SqlCommand

Modified---已修改的---配置UpdateCommand命令;

Added---已添加的----配置InsertCommand
命令;

Deleted---已删除的----配置DeleteCommand命令

 using (SqlConnection conn = new SqlConnection(connStr)){SqlDataAdapter da = new SqlDataAdapter(sqlCards, conn);//配置新增命令SqlCommand insertCmd = new SqlCommand("insert into CardTypeInfos(CTypeName,Remark) values (@typeName,@remark)", conn);SqlParameter[] parasInsert ={new SqlParameter("@typeName",SqlDbType.NVarChar,20,"CTypeName"),new SqlParameter("@remark",SqlDbType.NVarChar,500,"Remark")};insertCmd.Parameters.AddRange(parasInsert);da.InsertCommand = insertCmd;//配置修改命令SqlCommand updateCmd = new SqlCommand("update CardTypeInfos set CTypeName=@typeName,Remark=@remark where CTypeId=@typeId", conn);SqlParameter[] parasUpdate ={new SqlParameter("@typeName",SqlDbType.NVarChar,20,"CTypeName"),new SqlParameter("@remark",SqlDbType.NVarChar,500,"Remark"),new SqlParameter("@typeId",SqlDbType.Int,4,"CTypeId")};updateCmd.Parameters.AddRange(parasUpdate);da.UpdateCommand = updateCmd;//配置删除命令SqlCommand delCmd = new SqlCommand("delete from  CardTypeInfos where CTypeId=@typeId", conn);SqlParameter[] parasDelete ={new SqlParameter("@typeId",SqlDbType.Int,4,"CTypeId")};delCmd.Parameters.AddRange(parasDelete);da.DeleteCommand = delCmd;//然后调用更新方法即可da.Update(dt);}

7.5 DataReader与DataAdapter

1.相同点 : 执行查询,将数据读取出来,返回一个或多个结果集

SqlDataReader : 提供一种从数据库中读取数据的流的方式

SqlDataAdapter :DataSet与数据库之间的一个桥接器. Fill方法填充数据

2.性能对比:从速度、占用内存、连接状态、适用数据量、读取方式、是否可读 几方面比较。

DataReader

DataAdapter

速度

(数据小 速度不明显)

数据量

内存

连接

一直占用

断开与连接

读取方式

从头读到尾、一条一条读、只进不退

任意读取

灵活度

不灵活

灵活

是否读写

只读,不能修改

可读可写

使用选择

1.不要求随意读取,不修改,数据量小的情况下
——SqlDataReader 特点: 速度快,占用内存小

2.可以随意读取,可以修改,数据量大的情况
——SqlDataAdapter 特点: 灵活性大,占用内存大、不用一直占用连接


http://www.ppmy.cn/news/1562320.html

相关文章

【集成学习】Bootstrap抽样

在机器学习中,集成学习(Ensemble Learning)是一种通过组合多个模型来提高预测性能的技术。常见的集成学习方法包括Bagging、Boosting、Stacking等。而Bootstrap抽样(Bootstrap Sampling)是集成学习中非常重要的一种技术…

STM32裸机开发转FreeRTOS教程

目录 1. 简介2. RTOS设置(1)分配内存(2)查看任务剩余空间(3)使用osDelay 3. 队列的使用(1)创建队列(1)直接传值和指针传值(2)发送/接收…

车载音频开发(二):对音频数据作音量调节

通过前一个章节打下的基础车载音频开发(一):从看懂wav开始https://blog.csdn.net/Hellomino_/article/details/140873133?fromshareblogdetail&sharetypeblogdetail&sharerId140873133&sharereferPC&sharesourceHellomino_&…

Redis 性能优化 18招

前言 Redis在我们的日常开发工作中,使用频率非常高,已经变成了必不可少的技术之一。 Redis的使用场景也很多。 比如:保存用户登录态,做限流,做分布式锁,做缓存提升数据访问速度等等。 那么问题来了&…

TON 生态增长实战四城巡回压轴站—— 深圳站即将启动

2024 年,TON 生态迎来了前所未有的突破与成长,成为区块链领域不可忽视的力量。这一年,TON 的用户数增长至 1337 万,月活跃钱包数量达到 1240 万,生态总锁仓量(TVL)从年初的 53.7 万美元跃升至 7…

Linux-蓝牙协议

SPP (Serial Port Profile): 串口协议(SPP)是一个蓝牙配置文件,允许设备通过蓝牙模拟传统的串行端口通信。它通常用于无线串口连接,允许设备如计算机和外设(例如打印机或条形码扫描器)之间进行数据传输。A…

[Unity]发包前遇到的坑之GridLayoutGroup

发包前禁用了UI上面一个调试页面A后,发现无法正确获取某一个用了GridLayoutGroup组件的所有子物体的世界坐标。 一顿研究之后发现,在Start的时候想要正确获取其坐标,需要强制刷新一次布局,方法如下: UnityEngine.U…

培训机构Day27

今天看老师给我们实现了登录功能前后端实现,在不借助成熟框架来实现对于初学者来说难度确实很大。需要大量时间练习。 知识点: 设计模式:面向对象的语言。对某个特定领域特定场景问题的最佳解决方案。 1.单例模式。singleton。单个实例&…