我们前两篇文章介绍了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 对象:

  1. 针对Sql Server的SqlDataAdapter,位于命名空间System.Data.SqlClient下
  2. 针对Oledb链接的OledbDataAdapter,位于命名空间System.Data.Oledb下
  3. 针对MySql的MySqlDataAdapter,位于命名空间System.Data.MySqlClient下(需要引用MySql.Data.dll)
  4. 针对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对象的更多相关文章

  1. ADO.NET系列之Connection对象

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 ADO.NET概念 ADO ...

  2. ADO.NET系列之Command对象

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 上一篇<ADO.NE ...

  3. ADO.NET系列之事务和调用存储过程

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 前几篇我们介绍了Conne ...

  4. ADO.net中常用的对象介绍

    ADO.NET的对象主要包括:DataSet,DataTable,DataColumn,DataRow,和DataRelation. DataSet:这个对象是一个集合对象,它可以包含任意数量的数据表 ...

  5. ADO.NET笔记——使用DataAdapter执行增删改操作

    相关知识: DataSet中的数据一旦从数据库下载下来,便不再与数据库保持联系.如果修改了DataSet中的数据,需要重新建立连接,并且通过SQL命令将修改更新到数据库去 编写SQL命令往往比较繁琐和 ...

  6. C#开发学习——ADO.NET几个重要对象

    ADO.NET包括多个对象模型,有Connection/Command/DataReader/DataAdapter/DataSet/DataTable/DataView等. 命名空间System.D ...

  7. C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例

    DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...

  8. C#与数据库访问技术总结(十四)之DataAdapter对象

    DataAdapter对象 DataAdapter对象主要用来承接Connection和DataSet对象. DataSet对象只关心访问操作数据,而不关心自身包含的数据信息来自哪个Connectio ...

  9. ADO.NET详解----核心对象的使用

    一.Connection对象 指定某个具体数据源以及提供登陆方式及用户名与密码. Connection对象的主要成员: 1.ConnectionString属性:连接字符串,指定要操作的数据库以及登录 ...

随机推荐

  1. Asp.net 后台调用js方法

    购物车实现逻辑简单.代码量也很少,具体细节就不说了,使用的时候,只要把MockDB类稍微改改,因为它是商品数据入口,为实现分布式部署,实际应用时可以更改为从服务调用,如:Web Service.WCF ...

  2. 8-组成n的1的个数

    /*                                             ones时间限制:1000 ms  |  内存限制:65535 KB难度:3 描述    Given a ...

  3. 【SQL模板】一.修改/新增存储过程TSQL

    ---Name: 创建存储过程模板.sql ---Purpose: 用于创建 数据库中 新的存储过程 ---Author: xx ---Time: 2015-12-18 10:26:06 ---Rem ...

  4. Photoshop和Halcon中的极坐标变换

    极坐标想必学过高中数学的人都听过,一般的坐标系中用(x, y)值来描述一个点的位置,而在极坐标系中,则使用到原点的距离ρ和夹角θ来描述该点的位置. 我很早就接触了Photoshop,知道Photosh ...

  5. IIS 6.0/7.0/7.5、Nginx、Apache 等服务器解析漏洞总结

    IIS 6.0 1.目录解析:/xx.asp/xx.jpg  xx.jpg可替换为任意文本文件(e.g. xx.txt),文本内容为后门代码 IIS6.0 会将 xx.jpg 解析为 asp 文件. ...

  6. SqlServer中批量update

    现在我有两张表分别是S_PERSON,S_USER S_PERSON S_USER 我现在想把S_USER表中的ACCOUNT批量修改成S_PERSON的ACCOUNT 我们可以发现S_USER表中有 ...

  7. 【Linux】SVN的安装和配置

    SVN SVN:SVN是Subversion的简称,是一种开放代码的版本控制系统,相比较RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制器服务已从CVS迁移到Su ...

  8. 2018.10.15 NOIP训练 百事世界杯之旅(期望dp)

    传送门 期望题. 其实跟dpdpdp关系并不大. 考虑f[i]f[i]f[i]表示已经凑出了iii个需要的次数. 显然有:f[i]=ni∗f[i]+nn−i∗f[i+1]+1f[i]=\frac {n ...

  9. Django入门与实践-第21章:迁移(完结)

    http://127.0.0.1:8000/boards/1/ python manage.py migrate #boards/models.py class Topic(models.Model) ...

  10. 数据库面试sql

    问题一:.有三张表,学生表S,课程表C,学生课程表SC 01:写出建表语句 答: create table s(id integer primary key,name varchar(20)); cr ...