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

news2025/1/11 1:13:00

目录

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.coloradmin.cn/o/2274628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【非常详细】TCP/IP协议详解

一、TCP/IP简介 TCP/IP(传输控制协议/互联网协议)是一种用于连接网络设备的协议族,广泛应用于互联网和局域网中。它提供了在不同类型的网络上进行通信的标准和方法。 二、TCP/IP模型 TCP/IP在数据包设计上采用封装和分用的策略,…

Nginx代理同域名前后端分离项目的完整步骤

前后端分离项目,前后端共用一个域名。通过域名后的 url 前缀来区别前后端项目。 以 vue php 项目为例。直接上 server 模块的 nginx 配置。 server{ listen 80; #listen [::]:80 default_server ipv6onlyon; server_name demo.com;#二配置项目域名 index index.ht…

C++中的表达式

文章目录 算数操作符位操作符bitset对象或整型值的使用将位移操作符用作IO 赋值操作符赋值操作符的右结合性赋值操作具有低优先级 自增和自减操作符条件操作符sizeof操作符优先级new和delete表达式类型转换何时发生隐式转换显示转换旧式强制类型转换 C中的表达式由一个或多个操…

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议,可以做到数据的实时推送,可适用于广泛的工作环境,例如客服系统、物联网数据传输系统, 基础介绍 我们平常接触最多的是 http 协议的接口,http 协议是请求与响应的模式&…

海外招聘丨 弗拉瑞克商学院—博士研究员:智能家居技术业务和能源管理中的数据分析和人工智能

雇主简介 Vlerick 是一所领先的国际商学院……与众不同。是的,我们提供完全认可的世界一流教育课程,将理论知识和实践见解完美结合。是的,我们是一家领先的学术机构,拥有创新和独立研究的悠久传统。是的,我们拥有国际…

NUTTX移植到STM32

STM32移植NUTTX 1. Ubuntu下搭建开发环境1.1 先决条件1.2 下载 NuttX1.3 使用Make 进行编译1.4 烧录运行 2.通过NUTTX点亮LED2.1 部署操作系统2.2 修改配置文件2.3 编译运行程序 开发板:DshanMCUF407 官方开发文档:安装 — NuttX latest 文档 参考文档&…

Redis 优化秒杀(异步秒杀)

目录 为什么需要异步秒杀 异步优化的核心逻辑是什么? 阻塞队列的特点是什么? Lua脚本在这里的作用是什么? 异步调用创建订单的具体逻辑是什么? 为什么要用代理对象proxy调用createVoucherOrder方法? 对于代码的详细…

Python 中的错误处理与调试技巧

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

关于腾讯4K算法搭建使用

准备国内服务器一台,轻量服务器请尽量开全端口安装linux,centos7.6-7.9系统,记住纯净系统,然后安装宝塔宝塔安装环境为nginx1.24,7.2(PHP版本没有要求),Mysql5.7(没有要求) 准备活动完毕!!! 上传…

工艺参数优化、工程设计优化!GRNN神经网络+NSGAII多目标优化算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GRNN神经网络NSGAII多目标优化算法,工艺参数优化、工程设计优化(Matlab完整源码和数据) 多目标优化是指在优化问题中同时考虑多个目标的优化过程。在多目标优化中,通…

【Rust自学】11.6. 控制测试运行:并行和串行(连续执行)测试

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.6.1. 控制测试的运行方式 cargo test和cargo run一样,cargo test也会编译代…

nginx负载均衡-基于端口的负载均衡(一)

注意: (1) 做负载均衡技术至少需要三台服务器:一台独立的负载均衡器,两台web服务器做集群 一、nginx分别代理后端web1 和 web2的三台虚拟主机 1、web1(nginx-10.0.0.7)配置基于端口的虚拟主机 [rootOldboy extra]# …

DDcGAN_多分辨率图像融合的双鉴别条件生成对抗网络_y译文马佳义

摘要: 在本文中,我们提出了一种新的端到端模型,称为双鉴别条件生成对抗网络(DDcGAN),用于融合不同分辨率的红外和可见光图像。我们的方法建立了一个生成器和两个鉴别器之间的对抗博弈。生成器的目的是基于特…

【C++/控制台】2048小游戏

源代码&#xff1a; #include <iostream> #include <windows.h> #include <stdio.h> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h>// #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)…

【Rust自学】11.5. 在测试中使用Result<T, E>

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.5.1. 测试函数返回值为Result枚举 到目前为止&#xff0c;测试运行失败的原因都是因为触…

最新版IDEA新建web项目--小白也能看懂

引言&#xff1a; 此方法适用于 IntelliJ IDEA 2024.1.4 最新版本。 我最初使用的是 Tomcat 8.0.23 版本&#xff0c;搭配 JDK 17。由于 Tomcat 8.0.23 使用了已经被弃用的 JVM 参数&#xff0c;故将 Tomcat 版本更换为 10.1.1。 如果你使用 JDK 17&#xff0c;建议使用 Tom…

ue5玩家角色添加武器。切换武器位置,手上武器放到背上。演示一下人体插槽和武器的连接。仅仅演示,实际项目不是这么用的

把第一人称资源包导进来 这就是我们枪的骨骼网格体 我们找到这个骨骼 右手添加插槽 取个名字 因为武器上也有动画&#xff0c;所有武器单独写个蓝图类 新建一个蓝图类 BP_Weapon 把枪的蓝图拖到人的静态网格体下&#xff0c;成为一个部分 选中BP_Weapon的父类套接字…

微信小程序防止重复点击事件

直接写在app.wpy里面&#xff0c;全局可以调用 // 防止重复点击事件preventActive(fn) {const self this;if (this.globalData.PageActive) {this.globalData.PageActive false;if (fn) fn();setTimeout(() > {self.globalData.PageActive true;}, 3000); //设置该时间内…

Docker入门之docker基本命令

Docker入门之docker基本命令 官方网站&#xff1a;https://www.docker.com/ 1. 拉取官方镜像并创建容器&#xff08;以redis为例&#xff09; 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令&#xff0c;如需要&#xff0c;直接看第二步 docker r…

SQL Server中可以通过扩展事件来自动抓取阻塞

在SQL Server中可以通过扩展事件来自动抓取阻塞&#xff0c;以下是详细流程&#xff1a; 开启阻塞跟踪配置&#xff1a; • 执行以下SQL语句来启用相关配置&#xff1a; EXEC sp_configureshow advanced options, 1; RECONFIGURE; EXEC sp_configure blocked process thresh…