C# 数据适配器之 DataAdapter 对象

01  DataAdapter 对象概述

6764eb34d7f641b1a9d722f01488abc1.png

DataAdapter 对象是一个数据适配器对象,是DataSet 与数据源之间的桥梁。DataAdapter 对像提供了 4 个属性,用于实现与数据源之间的互通。

fbf7084ec616bf5192ff2f4bdd42119b.png   SelectCommand 属性:向数据库发送查询 SQL 语句。 

5c1b15dca8a8ddd183d6e440e0a52e2b.png   DeleteCommand 属性:向数据库发送删除 SQL语句。 

6cf5ebde528ed7df9ac7047487bd9bb2.png   InsertCommand 属性:向数据库发送插入 SQL 语句。

a3e0c07ad97d70c98254b73bb1acea5d.png   UpdateCommand 属性:向数据库发送更新 SQL 语句。

在对数据库进行操作时,只要将这 4 个属性设置成相应的 SQL语向即可。DataAdapter 对象中还有几个主要的方法,具体如下。

(1) Fill 方法用数据填充 DataSet。

语法如下:

public int Fil(DataSet dataSet,string sreTable)

d8b3a0151beef5e2e91b0c25b495824c.png   dataSet:要用记录和架构(如果必要)填充的 DataSet。

fe90e7977faa4ac9de52139a7d3c3a3c.png   srcTable:用于表映射的源表的名称。

36d4426b091ab4958b3de09a46ec92f9.png   返回值:已在 DataSet 中成功添加或刷新的行数,这不包括受不返回行的语句影响的行。

   说明

当创建 DataAdapter 的实例时,将其读/写属性设置为初始值、MissingMappingAction 属性设置为 MissingMappingAction.Passthrough,MissingSchemaActicn 属性设置为 MissingSchemaAction.Add。

(2)Update 方法更新数据库时,DataAdapter 将调用 DeleteCommand、InsertCommand 以及 UpdateCommand 属性。

语法如下:

public int Update(DataTable dataTable)

7212961fca607dd9d69c789c447b9ba6.png   dataTable:用于更新数据源的 DataTable。

fc88d642cdfce53f35b61aec87c35f2e.png   返回值:DataSet 中成功更新的行数。

例如,如果使用 DataAdapter 对象的 Fill 方法从数据源中提取数据并填充到 DataSet 时,就会用到 SelectCommand 属性中设置的命令对象。

02  填充 DataSet 数据集

通过 DataAdapter 对象的 Fill 方法填充 DataSet 数据集,Fill 方法使用 Select 语句从数据源中检索数据。与 Select 命令关联的 Connection 对象必须有效,但不需要将其打开。

注意

DataSet 和 DataTable 对象从 MarshalByValueComponent(实现 IComponent 并提供可选程控制的组件的基实现)继承而来,并支持用于远程处理 ISerializable 接口。

例1

创建一个 Windows 应用程序,向窗体中添加一个 Button 控件和一个 DataGridView 控件,分别用于执行数据绑定以及显示数据表中的数据。当单击 Button 控件后,程序首先连接数据库,然后创建一个 SqIDataAdapter 对象,使用该对象的 Fill 方法填充 DataSet 数据集,最后设置 DataGridView 控件的数据源,显示查询的数据。

代码如下:

SqlConnection conn;
private void button1_Click(object sender, EventArgs e)
{//实例化 SqlConnection 变量 connconn = new SqlConnection("server=.;database=db_15;uid=sa;pwd=");//创建一个 SqlCommand 对象SqlCommand cmd=new SqICommand("select * from tb_command",conn);//创建一个 SqlDataAdapter 对象SqlDataAdapter sda = new SqlDataAdapter();//设置 SqlDataAdapter 对象的 SelectCommand 属性为 cmd sda.SelectCommand = cmd;//创建一个 DataSet 对象DataSet ds = new DataSet();//使用 SqlDataAdapter 对象的 Fill 方法填充 DataSet 数据集 sda.Fill(ds,"cs");//设置 dataGridView1 控件的数据源dataGridView1.DataSource = ds.Tables[0];
}

程序的运行结果如图1  所示。

43b845ccbbb49ca5712cb8e3d80b0759.png

          图1 使用 Fill 方法填充 DataSet 数据集

03  更新数据源

使用 DataAdapter 对象的 Update 方法,可以将 DataSet 中修改过的数据及时地更新到数据库中,在调用 Update 方法之前,要实例化一个 CommandBuilder  类,它能自动根据 DataAdapter 的 SelectCommand 的 SQL 语句判断其他的 InsertCommand、UpdateCommand和 DeleteCommand。这样,就不用设置 DataAdapter 的 InsertCommand、UpdateCommand 和 DeleteCommand 属性,直接使用 DataAdapter 的 Update 方法来更新 DataSet、DataTable 或 DataRow 数组即可。

例2

创建一个 Windows 应用程序,查询 tb_command 表中的所有数据并将其显示在 DataGridView 控件中,单击某条数据,会显示其详细信息。当对某条数据进行修改后,单击“修改”按钮,使用 DataAdapter 对象的 Update 方法更新数据源。

代码如下:

SqlConnection conn;                                //声明一个 SqlConnection 变量
DataSet ds;                                        //声明一个 DataSet 变量
SqlDataAdapter sda;                                //声明一个 SqlDataAdapter 变量
private void Form1_Load(object sender, EventArgs e)
{//实例化 SqlConnection 变量 conn,连接数据库conn = new SqlConnection("server=.;database=db_15;uid=sa; pwd=");//创建一个 SqlCommand 对象SqlCommand cmd = new SqlCommand("select * from tb_command",conn);//实例化 SqlDataAdapter 对象 sda = new SqlDataAdapter();//设置 SqlDataAdapter 对象的 SelectCommand 属性为 cmd sda.SelectCommand = cmd; //实例化 DataSet ds = new DataSet();//使用 SqlDataAdapter 对象的 Fill 方法填充 DataSet sda.Fill(ds,"cs");//设置 dataGridView1 控件的数据源dataGridView1.DataSource = ds.Tables[0];
}
private void button1_Click(object sender, EventArgs e)
{DataTable dt = ds.Tables["cs"];               //创建一个 DataTablesda.FillSchema(dt, SchemaType.Mapped);        //把表结构加载到 tb_command 表中DataRow dr = dt.Rows.Find(txtNo.Text);        //创建一个 DataRow//设置 DetaRow 中的值dr["姓名"] = txtName.Text.Trim();dr["性别"] = this.txtSex.Text.Trim();dr["年龄"] = this.txtAge.Text.Trim();dr["奖金"] = this.txtJJ.Text.Trim();  //实例化一个 SqLCommandBuilderSqlCommandBuilder cmdbuilder = new SqlCommandBuilder(sda);//调用其 Update 方法将 DataTable 更新到数据库中sda.Update(dt);
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{//在 dataGridView1 控件的 CellClick 事件中实现单击某条数据显示详细信息txtNo.Text= dataGridView1.SelectedCells[0].Value.ToString();txtName.Text = dateGridView1.SelectedCells[1].Value.ToString(); txtSex.Text = dataGridView1.SelectedCells[2].Value.ToString();txtAge.Text = dataGridView1.SelectedCells[3].Value.ToString(); txtJJ.Text = dataGridView1.SelectedCells[4].Value.ToString();
}

程序的运行结果如图2 所示 。

a7210209547a2412f9123f897b4107cd.png

                           图2  更新数据源

注意

在 DataTable 对象上可以多次使用 Fill 方法,如果主键存在,则传入行会与已有的匹配行合并;如果主键不存在,则传入行会追加到 DataTable 中。

往期推荐

  •   C#  分部类                   

  •   C#  类型转换

  •   C#  迭代器

  •   C#  线程的基本操作(一)

  •   C#  线程的基本操作(二)

  •   C#  线程的基本操作(三)

8672356637a91eba3eb5268001f398d2.png

Love life,love yourself

关注小编不迷路呦~

代码如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295482.shtml

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

相关文章

express 4 简单实现自动注册路由功能

为什么80%的码农都做不了架构师?>>> ##实现 在express,模块的lib/router/index.js 的 proto.route 方法定义附件添加代码,实现自动注册路由方法: var fs require("fs"); var Path require("path&quo…

速战速决?你不会是不行吧......

1 真服了!!▼2 同猫不同命......▼3 无锡:??▼4 还是黄金好?▼5 你会不会是不行??▼6 爸爸:那也太惊喜了...▼7 倒是毫无违和感?▼8 皇上您说的对&…

mysql普通标转分区表_MySQL分区表到普通表互转

由于最近总有人抱怨,数据迁移后执行SQL变慢,经过查看原来是分区导致的问题。原分区根据按月设置RANGE分区,看到这图的时候也许有人就会发现问题.......业务查询SQL:从SQL上看 执行计划确实是走了分区,但为什么没有命中…

C# 用IrisSkin4.dll美化你的WinForm

1. 将IrisSkin4.dll动态文件导入当前项目引用中。具体操作为:解决方案资源管理器->当前项目->引用->右键->添加引用,找到IrisSkin4.dll文件,然后加入即可。建议,最好把IrisSkin4.dll文件放在当前项目\bin\Debug文件中…

全球最大油田、金矿、煤矿、铁矿、铜矿,究竟哪个最值钱?

全世界只有3.14 % 的人关注了爆炸吧知识1世界上最大油田:沙特加瓦尔油田(Ghawar Oil field)加瓦尔油田位于沙特阿拉伯东部,首都利雅得以东约500km处,它探明的石油可采储量为114.8亿吨,天然气储量9240亿立方…

MVC3快速搭建Web应用(二)

easyui与mvc的结合 上一篇文章发布后,自己又仔细读了数遍,感觉一是文笔太差,二是描述逻辑比较混乱,客观原因是涉及到东西其实蛮多的,那三个步骤不可能在一篇短短的文章中就可以描述清楚。此篇笔者将尽量更加详尽一些。…

这个发热鞋垫厉害了,有它冬天再也不怕脚冷

▲ 点击查看冬天一到,小爆发现身边的“抖友”又开始上线了!至于为什么会抖脚?有盆友说,当然不是真的想抖,而是因为脚太冷冷冷了!有时候穿了棉袜厚鞋,脚都是冷冰冰的,感觉就像踩在冰窟…

.NET 6新特性试用 | 热重载

前言在以前的开发模式下,我们修改代码后必须重新编译、重新运行才能看到效果。而热重载提供了这样一种特性,它允许你在项目正在运行时修改代码,并将代码更改立即应用于正在运行的应用程序上。热重载的目的是尽可能节省编辑之间的应用重启次数…

加速你的Hibernate引擎(上)

为什么80%的码农都做不了架构师?>>> 1.引言 Hibernate是最流行的对象关系映射(ORM)引擎之一,它提供了数据持久化和查询服务。 在你的项目中引入Hibernate并让它跑起来是很容易的。但是,要让它跑得好却是需…

Spring MVC 中 HandlerInterceptorAdapter过滤器的使用

一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。 Spring为我们提供了org.springframework.web.s…

7部必看的纪录片,每一部都堪称经典,让人叹为观止!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片的一大重要意义,就在于它能将我们的视野和脚步,引向我们无法企及的地方和领域,又能让那些我们曾经到过的地方、经历过的人事,变得更有深意。今天,就给大家分享7部顶级纪录…

通过SQL Server操作MySQL的步骤和方法

在多种数据库环境下,经常会遇见在不同数据库之间转换数据和互相进行操作的情况。以下简要介绍下用SQL Server操作MySQL的步骤和方法。 1 操作前的准备 1.1 安装MySQL驱动 想要在SQL Server中操作MySQL,首先要在SQL Server所在的服务器上安装MySQL的驱动。…

ubuntu 新增mysql用户_Ubuntu中给mysql添加新用户并分配权限

一.Ubuntu下启动mysql方法:/etc/init.d/sudo mysqld二.用户添加bingt;mysql -u rootmysqlgt; grant 权限1,权限2,...权限n on一.Ubuntu下启动mysql方法:/etc/init.d/sudo mysqld二.用户添加bin>mysql -u rootmysql> grant 权限1,权限2,...权限n on…

ABP Framework 5.0 RC.1 新特性和变更说明

.Net 6.0 发布之后,ABP Framework 也在第一时间进行了升级,并在一个多星期后(2021-11-16)发布了 5.0 RC.1 ,新功能和重要变更基本已经确定。5.0版本新特性5.0版本新特性列表:•静态 C# 和 JavaScript 客户端…

土木工程到底有多惨?哭了哭了......

1 那我要去女寝当宿管!(素材来源网络,侵删)▼2 别说了快哭了▼3 今夜我们都是尾款人▼4 童叟无欺,与图片完全一致▼5 好样的,兄弟!▼6 土木工程有多惨?(素材来源网络…

Easy UI中dategrid的getSelections方法只能获取一个id的解决办法

解决方案:检查idField属性值是否与json数据中的id相同(区分大小写) 实在不行就 去掉 idField属性 也可以解决问题 具体效果请看图: 转载于:https://www.cnblogs.com/hanfeng1949/archive/2013/05/28/3104288.html

.NET 6新特性试用 | Controller支持IAsyncDisposable

前言在.NET中,拥有非托管资源的类通常会实现IDisposable接口,以提供一种同步释放非托管资源的机制。但是,在某些情况下,需要提供一种异步机制来释放非托管资源,这时候可以实现IAsyncDisposable接口。在实现此接口后&am…

ngnix之rewrite

2019独角兽企业重金招聘Python工程师标准>>> REWITE重写[rootlocalhost nginx]# cd conf[rootlocalhost conf]# lsfastcgi.conf koi-win scgi_paramsfastcgi.conf.default mime.types scgi_params.defaultfastcgi_params …

清华博士生放弃科研,跑去当中学教师,值得吗?

全世界只有3.14 % 的人关注了爆炸吧知识本文来源:科学网博客 作者:程代展原清华大学程代展教授数年前发表博文《昨夜无眠,为了一个学生》,叙述一个亲传徒弟转行的事情。该文曾激起对科研有兴趣的网友的关注,也引发了人…

C# 中如何一次 catch 多个异常?

咨询区 Michael Stum:在项目开发中当抛出异常时,我会简单的用 System.Exception,但这种会捕获所有的异常,我不希望大一统,我只想捕获我预知的几个异常,然后在这里处理一些特定的业务逻辑。目前我只能这么实…