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

目录

[7.1 SqlDataAdapter介绍](#7.1 SqlDataAdapter介绍)

[7.2 SqlDataAdapter创建](#7.2 SqlDataAdapter创建)

[7.3 填充数据集](#7.3 填充数据集)

[7.4 SqlDataAdapter更新数据](#7.4 SqlDataAdapter更新数据)

[7.5 DataReader与DataAdapter](#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 推荐

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

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

cs 复制代码
 SqlCommand cmd = new SqlCommand(sql, conn);
 SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);

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

cs 复制代码
SqlDataAdapter adapter2 = new SqlDataAdapter(sql, conn);

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

cs 复制代码
SqlDataAdapter adapter3 = new SqlDataAdapter(sql, connStr);

7.3 填充数据集

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

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

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

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

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

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

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

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

cs 复制代码
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配置相关的命令

cs 复制代码
 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命令

cs 复制代码
 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 特点: 灵活性大,占用内存大、不用一直占用连接

相关推荐
灵哎惹,凌沃敏13 分钟前
华为C语言编程规范总结
c语言·开发语言
计算机毕设指导626 分钟前
基于Springboot的景区民宿预约系统【附源码】
java·开发语言·spring boot·后端·mysql·spring·intellij idea
pumpkin8451434 分钟前
什么是 LuaJIT?
开发语言
云端 架构师1 小时前
Lua语言的语法
开发语言·后端·golang
AI向前看1 小时前
Objective-C语言的网络编程
开发语言·后端·golang
梦想的初衷~1 小时前
AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表
开发语言·人工智能·r语言
霜雪殇璃1 小时前
c++对结构体的扩充以及类的介绍
开发语言·c++·笔记·学习
编程小筑1 小时前
Clojure语言的并发编程
开发语言·后端·golang
心向阳光的天域1 小时前
黑马跟学.苍穹外卖.Day03
java·开发语言·spring boot
雪芽蓝域zzs1 小时前
JavaWeb开发(九)JSP技术
java·开发语言