ADO.NET系列之DataAdapter对象
我们前两篇文章介绍了ADO.NET的概念,以及介绍了Connection和Command对象,基本的增删改查操作都能够实现了,本节再介绍一个强大的DataAdapter对象。
我们先来看看DataAdapter对象的工作原理如下图所示:

DataAdapter首先将构造一个SelectCommand实例(本质就一个Command对象),然后检查是否打开连接,如果没有打开连接则打开连接,紧接着调用DataReader接口检索数据,最后根据维护的映射关系,将检索到得数据库填充到本地的DataSet或者DataTable中。同理,我们需要更新数据源时,DataAdatper则将本地修改的数据,跟据映射关系,构造InsertCommand,UpdateCommnad,DeleteCommand对象,然后执行相应的命令。
为什么说DataAdapter对象强大呢?首先DataAdapter对象可以执行查询操作,严格意义上也不是执行,而是可以填充DataSet,DataTable对象,再一个DataAdapter对象可以进行批量更新和批量删除,至于批量添加我们有SqlBulkCopy对象,后面文章会介绍SqlBulkCopy对象。
DataAdapter.Net提供了四种Connection 对象:
- 针对Sql Server的SqlDataAdapter,位于命名空间System.Data.SqlClient下
- 针对Oledb链接的OledbDataAdapter,位于命名空间System.Data.Oledb下
- 针对MySql的MySqlDataAdapter,位于命名空间System.Data.MySqlClient下(需要引用MySql.Data.dll)
- 针对Oracle的OracleDataAdapter,位于命名空间Oracle.ManagedDataAccess.Client(需引用Oracle.ManagedDataAccess.dll)
我们先来看看DataAdapter对象填充DataSet,DataTable对象的示例:
string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
using (SqlConnection con = new SqlConnection(connectionString))
{
string sql = "select * from eftest where id=@id";
SqlParameter para = new SqlParameter("@id", );
using (SqlCommand com = new SqlCommand(sql, con))
{
DataSet ds = new DataSet();
try
{
com.Parameters.Add(para);
con.Open();
SqlDataAdapter adapter = new SqlDataAdapter(com);
adapter.Fill(ds);
foreach (DataRow s in ds.Tables[].Rows)
{
Console.WriteLine("ID:"+s["id"].ToString());
Console.WriteLine("Name:" + s["name"].ToString());
}
}
catch (Exception ex)
{ }
}
}
DataAdapter对象实现批量修改
string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
using (SqlConnection con = new SqlConnection(connectionString))
{
string sql = "select * from eftest ";
DataSet ds = new DataSet();
try
{
con.Open();
SqlDataAdapter adapter = new SqlDataAdapter(sql, con);
adapter.Fill(ds);//填充ds
for (int k = ; k < ds.Tables[].Rows.Count; k++)
{
Console.WriteLine(ds.Tables[].Rows[k].RowState);//RowState:Unchanged
Console.WriteLine(ds.Tables[].Rows[k][]);
ds.Tables[].Rows[k][] = "abc";//每一行的第二列都修改为abc
Console.WriteLine(ds.Tables[].Rows[k][]);
Console.WriteLine(ds.Tables[].Rows[k].RowState);//RowState:Modified
}
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapter);//这行不能缺少,除非自定义Command赋值给adapter.UpdateCommand
Console.WriteLine("生成的Update语句:{0}", cmdBuilder.GetUpdateCommand().CommandText);
adapter.Update(ds);//更新到数据源中
ds.AcceptChanges();//提交到DataTable中 提交后DataRow.RowState会修改为Unchanged
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
根据上代码,我们先要介绍下DataRow.RowState属性,DataRowState是一个枚举类型:
//
// 摘要:
// 该行已被创建,但不属于任何 System.Data.DataRowCollection。System.Data.DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。
Detached = ,
//
// 摘要:
// 该行自上次调用 System.Data.DataRow.AcceptChanges 以来尚未更改。
Unchanged = ,
//
// 摘要:
// 该行已添加到 System.Data.DataRowCollection 中,System.Data.DataRow.AcceptChanges 尚未调用。
Added = ,
//
// 摘要:
// 该行已通过 System.Data.DataRow 的 System.Data.DataRow.Delete 方法被删除。
Deleted = ,
//
// 摘要:
// 该行已被修改,System.Data.DataRow.AcceptChanges 尚未调用。
Modified =
我们可以根据RowState属性可以很清楚的知道DataTable中的每一行数据是新增的?修改过?删除了?还是未曾改变! 其实adapter.Update(ds)更新数据也是根据这个属性批量向数据源更新的。
DataAdapter实现批量添加和批量删除都是大同小异,只是操作DataTable添加或者删除就行了。
ADO.NET系列之DataAdapter对象的更多相关文章
- ADO.NET系列之Connection对象
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 ADO.NET概念 ADO ...
- ADO.NET系列之Command对象
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 上一篇<ADO.NE ...
- ADO.NET系列之事务和调用存储过程
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 前几篇我们介绍了Conne ...
- ADO.net中常用的对象介绍
ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation. DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表 ...
- ADO.NET笔记——使用DataAdapter执行增删改操作
相关知识: DataSet中的数据一旦从数据库下载下来,便不再与数据库保持联系.如果修改了DataSet中的数据,需要重新建立连接,并且通过SQL命令将修改更新到数据库去 编写SQL命令往往比较繁琐和 ...
- C#开发学习——ADO.NET几个重要对象
ADO.NET包括多个对象模型,有Connection/Command/DataReader/DataAdapter/DataSet/DataTable/DataView等. 命名空间System.D ...
- C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例
DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...
- C#与数据库访问技术总结(十四)之DataAdapter对象
DataAdapter对象 DataAdapter对象主要用来承接Connection和DataSet对象. DataSet对象只关心访问操作数据,而不关心自身包含的数据信息来自哪个Connectio ...
- ADO.NET详解----核心对象的使用
一.Connection对象 指定某个具体数据源以及提供登陆方式及用户名与密码. Connection对象的主要成员: 1.ConnectionString属性:连接字符串,指定要操作的数据库以及登录 ...
随机推荐
- configparser模块 logging模块
configparser模块 固定格式的配置文件 有一个对应的模块去帮你做这个文件的字符串处理 config = configparser.Configparser() config.read(“ex ...
- PAT L3-004 肿瘤诊断(三维广搜)
在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积. 输入格式: 输入第一行给出4个正整数:M.N.L.T,其中M和N是每张切片的尺寸(即每张切片 ...
- c++流操作
非缓冲标准出错流对象cerr和缓冲标准出错流对象clog,它们都是来自于ostream类的对象,用于输出错信息.cerr和clog之间的不同之处在于cerr是不经过缓冲区直接向显示器输出有关信息,而c ...
- maven不存在jar包解决
win7环境 下载:https://maven.apache.org/download.cgi 提取文件,并cmd 转到bin目录 假设要添加的jar包是jbarcode-0.2.8.jar, 可执行 ...
- linux系统挂载ISO文件
1 上传iso文件使用xftp上传系统oracleLinux7.3.iso光盘镜像到/toolsPackage 为方便使用,重命名光盘镜像文件[root@rhel64 software]# mv rh ...
- ubuntu 开机自动挂载nfs服务器上的home分区
通过‘fstab’也可以配置 NFS 和 SMB 的共享目录.由于涉及到的可选项很重要,并且需要了解一些协议的工作情况,您得先阅读 Samba 和 NFS . 基本语法和本地介质相差不是很多.条目中的 ...
- python编辑excel
转: http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html
- 一款APP的交互文档从撰写到交付
我第一份工作的设计总监是前百度设计师,34岁,一线设计12年:今年聊天说转了产品总监,如今39岁还活跃在行业中…… 我第二份工作的部门总监是前腾讯工程师,38岁,一线开发14年:2年前在Q群里跟我们说 ...
- const当做标记的函数重载,但是仅仅是限于类里面的成员函数
(1)我们知道函数的重载时根据函数的参数类型以及函数参数个数来重载的,不能用函数返回值来重载函数.但是有时候函数参数个数和函数参数类型重载函数会和默认参数发生冲突: int fun(int i,cha ...
- MyEclipse配置Maven插件
一.工具环境 1.jdk-7u80-windows-x64 2.apache-tomcat-7.0.70 3.apache-maven-3.3.9 4.MyEclipse 10.7 5.windows ...