我们前两篇文章介绍了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. 删除Eclipse已有的SVN资源库位置

    点击Eclipse菜单栏的[Window]->[Show View]->[Other],在弹出的对话框中,选择[SVN]->[SVN资源库],然后点击[OK]. 接着,在Eclips ...

  2. 149. Max Points on a Line (Array; Greedy)

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  3. Linux SSH基于密钥交换的自动登陆原理简介及配置说明

    一.原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密 ...

  4. 18-从n个数中选m个

    #include <iostream>using namespace std; int f(int n, int m){        if(n < m)         //这个条 ...

  5. jquery datatables api

    原文地址 学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/ ...

  6. Golang之Mysql事务

    Mysql事务 )原子性 )一致性 )隔离性 )持久性 示例代码 package main import ( "fmt" _ "github.com/go-sql-dri ...

  7. NGS的duplicate的问题

    NGS的duplicate的问题   duplicate的三个问题: 一.什么是duplicate? 二.duplicate来源? 三.既然PCR将1个reads复制得到成百上千copies,那为什么 ...

  8. 老板说你的UI设计的不高级?你肯定没用这7个技巧...

    对于每个网页设计师而言,在设计过程中总会碰到需要作出设计决策的时候.也许你的公司并没有全职设计师,而需求上则要求设计出全新的UI:又或者你正在制作一个你自己的个人项目,而你希望它比 Bootstrap ...

  9. Tomcat连接池配置

    今日做了个小网站,数据量不大,但当发布到虚拟主机上之后,接连不断的遇到各种问题. 被折磨了数日后,在网上查了大量的相关资料,现总结如下. 一.项目在上传到远程服务器的过程中,有可能丢失文件,或文件内容 ...

  10. MVC各层应该要实现的代码

    1.C 在设计良好的应用中,控制器很精练,包含的操作代码简短: 如果你的控制器很复杂,通常意味着需要重构,转移一些代码到其他类中. 归纳起来,控制器 可访问 请求 数据; 可根据请求数据调用 模型 的 ...