原文:asp.net学习之ado.net(无连接模式中的DataAdapter)

在非连接模式下,主要讨论以下对象:DataAdapter。
    DataAdpater的作用是在物理存储模式的数据和内存之间进行数据传递。DataTable是用在内存中表示数据库表。DataSet是内存中表示数据库(表、表关系的集合)。DataView是用于在内存中表示数据库视图。 
    DataAdapter对象在后台使用DataReader对象从数据库中获取数据;DataView对象来对数据进行过滤和排序;DataTable对象可以用来跟踪数据记录的改变情况,并决定是否接受或者拒绝这些改变。

1.DataAdapter对象

DataAdapter对象在物理数据库和内存数据表之间起桥梁的作用。一般用DataAdapter对象从数据库获取数据并装入DataTable对象中,也通过DataAdapter对象将DataTable对象中数据的修改写回到物理数据库。
例1: 一个简单的DataAdapter对象的使用
=== App_Code\DawnDataObject.cs ===

Codepublic class Movie_Disconnect{    private static readonly string  _connectionstring;    static Movie_Disconnect()    {        _connectionstring = WebConfigurationManager.ConnectionStrings["DawnEnterpriseDBConnectionString"].            ConnectionString.ToString();    }    public DataTable GetAll()    {        // 初始化DataAdapter        SqlDataAdapter dad = new SqlDataAdapter("Select Id,Title,Director from Movies", _connectionstring);        // 初始化Table        DataTable dt = new DataTable();        dad.Fill(dt);        return dt;    }} 

=== showMovies.aspx

Code<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1"></asp:GridView><asp:ObjectDataSource ID="ObjectDataSource1" TypeName="DawnDataObject.Movie_Disconnect" SelectMethod="GetAll" runat="server"></asp:ObjectDataSource> 

2.DataAdapter的构造

在例1中,我们看到了如何构造一个SqlDataAdapter对象,并且使用Fill方法把数据表填到一个DataTable中。它看起来是像下面这样子的:

SqlDataAdapter dad = new SqlDataAdapter("Select Id,Title,Director from Movies", _connectionstring);DataTable dt = new DataTable();dad.Fill(dt); 

在以上的例子中,看不到SqlConnection,SqlCommand对象的出象,其实,它们还是隐含存在的,这些对象被SqlDataAdapter对象调用了而已,就连SqlConnection对象的Open()方法的调用也由SqlDataAdapter对象来代劳了。
    如果要显式使用SqlConnection,SqlCommand对象,可以像以下代码这样:
例2: SqlAdapter对象的另外构造方法

public DataTable GetAll(){    DataTable dt = new DataTable();    using(SqlConnection conn = new SqlConnection(_connectionstring)) {        SqlCommand command = new SqlCommand("Select Id,Title,Director from Movies", conn);        SqlDataAdapter dad = new SqlDataAdapter(command);        // 初始化Table        dad.Fill(dt);    }    return dt;} 

以上,可以看出,SqlDataAdapter构造函数可以传入一个SqlCommand对象。在ADO.Net中SqlDataAdapter构造函数可以使用以下几种方法进行构造
     ● SqlDataAdapter(): 无参数,构造后,可以给SqlDataAdapter对象的SelectCommand属性分配一个SqlCommand对象。
         作为补充,SqlDataAdapter还有UpdateCommand、DeleteCommand、InsertCommand属性,这些属性在后面会提到。
     ● SqlDataAdapter(string commandText, SqlConnection connection): 第一个参数为T-SQL语句,第二个参数为一个SqlConnection对象。
        使用这个构造函数时,不需要显式声明SqlCommand对象。
     ● SqlDataAdapter(string commandText, string connectionString): 例1使用的方法,不需要显式声明SqlConnection与SqlCommand对象
     ● SqlDataAdapter(SqlCommand command): 例2使用的方法。

3. SqlDataAdapter的Fill/FillSchema方法

DataAdapter对象的Fill方法,该方法不止可以传入DataTable作为参数,也可以传入DataSet作为参数。
     DataAdapter对象的FillSchema方法,可以向DataSet/DataTable参数添加现有的数据库约束。
     3.1 赋值到DataSet
         因为DataSet是DataTable的集合,所以可以Fill多张表到DataSet对象中。
例3: Fill多张数据表到DataSet对象

private void buttonFillData_Click(object sender, EventArgs e){    DataSet userData = new DataSet();    using (SqlConnection testConnection = new SqlConnection(connectionString))  {        SqlCommand testCommand = testConnection.CreateCommand();        testCommand.CommandText = "Select FirstName, LastName from userTable; Select PermissionType from PermissionsTable";        SqlDataAdapter dataAdapter = new SqlDataAdapter(testCommand);        dataAdapter.Fill(userData);    } // testConnection.Dispose called automatically.} 

3.2 Fill方法的重载
       默认的,当调用SqlDataAdapter.Fill(DataSet)时,并没有指定Table名,所以,要想取得DataSet中的DataTable对象,需要使用Index序号。
       也可以指定当Fill进DataSet时,相应表的TableName属性,当需要指定TableName属性时,调用以下Fill方法:
        public int Fill(DataSet dataSet, string srcTable);
      以下的例子是它们之间的区别:
例4: 调用Fill方法填充到DataSet时,指定TableName属性

    protected void Page_Load(object sender, EventArgs e)    {        if (!IsPostBack)        {            string _connectionstring = WebConfigurationManager.ConnectionStrings["DawnEnterpriseDBConnectionString"].            ConnectionString.ToString();            DataSet ds = new DataSet();            using (SqlConnection conn = new SqlConnection(_connectionstring))            {                SqlCommand command = new SqlCommand("Select Id,Title,Director from Movies", conn);                SqlDataAdapter dad = new SqlDataAdapter(command);                dad.Fill(ds, "Movies");  // 调用Fill方法时,使用TableName                dad.SelectCommand = new SqlCommand("select Id,name from MovieCategories", conn);                dad.Fill(ds);   // 为使用TableName                GridView1.DataSource = ds.Tables["Movies"]; // 使用TableName进行指定                GridView1.DataBind();                GridView2.DataSource = ds.Tables[];  // 使用inde进行指定                GridView2.DataBind();            }        }    } 

Fill被重载的方法有很多,具体可以查看:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldataadapter.fill.aspx

    3.3 DataAdapter的FillSchema方法
       SqlDataAdapter 类提供 FillFillSchema 两种方法,这对于加载这些数据很关键。这两种方法均可将信息加载到 DataSet 中。Fill 加载数据本身,而 FillSchema 加载有关特定表的所有可用的元数据(如列名、主键和约束)。处理数据加载的正确方式是先运行 FillSchema,后运行 Fill。例如:
daAuthors.FillSchema(dsPubs,SchemaType.Source, "Authors");
daAuthors.Fill(dsPubs,"Authors");
        具体的参照以下几篇文章:
        http://msdn.microsoft.com/zh-cn/library/49z48hxc.aspx
        http://support.microsoft.com/kb/314145/zh-cn 
        例5:调用FillSchema方法:
//一般先用FillSchema来填入详细的元数据信息,再用Fill来填充数据,例如:

sqlDataAdapter1.FillSchema(dataSet1,SchemaType.Source,"authors");sqlDataAdapter1.Fill(dataSet1,"authors");DataColumn[] colArr;colArr = dataSet1.Tables["authors"].PrimaryKey;MessageBox.Show("Column Count: " + colArr.Length.ToString());for(int i = ; i < colArr.Length; i++){    MessageBox.Show(colArr[i].ColumnName + "   " + colArr[i].DataType.ToString());}

在上例中,如果不调用FillSchema, 缺省情况下不会填如PrimaryKey信息。
    另外,DataAdapter还有一个MissingSchemaAction属性,该属性可以接受以下Enum值:
      ● Add---在添加新行时向DataTable中添加必须的附加列(默认值)
      ● AddWithKey---在添加新行时向DataTAble中添加所有必须的列。
      ● Error---在添加新行时,如果此行不匹配现在的DataTable,就引发一个错误。
      ● Ignore---在添加新行时,如果此行中包含DataTable中没有的列,那么忽略多余的列。
    ds.MissingSchemaAction = MissingSchemaAction.AddWithkey

asp.net学习之ado.net(无连接模式中的DataAdapter)的更多相关文章

  1. asp.net学习之ado.net(连接模式访问)

    原文:asp.net学习之ado.net(连接模式访问)    ado.net框架支持两种模式的数据访问: 连接模式(Connected)和非连接模式(disconnected).这一节介绍如何使用连 ...

  2. <原>ASP.NET 学习笔记之HTML helper中参数何时会是路由参数,何时又会是query string?

    HTML helper中参数何时会是路由参数,何时又会是query string?   @Html.ActionLink("Edit", "Edit", new ...

  3. 第八周学习笔记-ADO.Net中DataTable的应用

    ADO.Net中DataTable的应用  一.知识点描述 1.概述:DataTable是一个临时保存数据的网格虚拟表(表示内存中数据的一个表),是ADO.Net库中的核心对象. 2.DataTabl ...

  4. asp.net学习之SqlDataSource

    原文:asp.net学习之SqlDataSource 通过 SqlDataSource 控件,可以使用 Web 服务器控件访问位于关系数据库中的数据.其中可以包括 Microsoft SQL Serv ...

  5. asp.net学习之Repeater控件

    asp.net学习之Repeater控件 文章摘自:http://www.cnblogs.com/shipfi/archive/2009/10/19/1585703.html Repeater控件和D ...

  6. asp.net学习资源汇总

    名称:快速入门地址:http://chs.gotdotnet.com/quickstart/描述:本站点是微软.NET技术的快速入门网站,我们不必再安装.NET Framework中的快速入门示例程序 ...

  7. asp.net学习之DataList控件

    asp.net学习之DataList控件   DataList控件与Repeater控件一样由模板驱动,与Repeater控件不同的是: DataList控件默认输出是一个HTML表格.DataLis ...

  8. asp.net学习之 数据绑定控件--List数据绑定控件

    原文:asp.net学习之 数据绑定控件--List数据绑定控件 List控件(如 CheckBoxList.DropDownList.ListBox 和 RadioButtonList 类)继承自L ...

  9. asp.net学习之数据绑定控件、数据源控件概述

    原文:asp.net学习之数据绑定控件.数据源控件概述 1.asp.net数据绑定控件分为三大类,每个类分别进行详细:      ● 列表式数据绑定控件: 列表式数据绑定控件常用来在一个表格内的一个字 ...

随机推荐

  1. lock订单号

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  2. R三星463无线网卡驱动,声音驱动程序,FN快捷键驱动,Easy_Display_Manager

    http://download.csdn.net/detail/u012120447/7568369 当我们重装系统,该卡不能使用,您需要使用快捷键无法使用时, Easy_Display_Manage ...

  3. Thanks

    今天,突然有一种爽的感觉.是做题做到爽的感觉,晚上就不是非常强烈了,脖子疼,要断了. 中午.妈妈给我打了电话,后来才知道爸爸的嗓子都哑了.说不出话来了都,哎,这都快一个月没有下雨了.地都干得要命了.好 ...

  4. Libgdx Box2D现实------这缓释微丸(一个:项目介绍)

    它花了两个星期的假写物理游戏,在几次课逃逸,是大学,因为大部分时间点!今天,我基本上一直每节课的点1-3有时它,哎,这似乎是不再逃跑.不知道值没有值得,仅仅是简单地想做自己喜欢的事情,而不是跟老师大眼 ...

  5. 在投票系统方法的原则刷票(突破ip限制刷票PHP版)

    让我谈一点:事实上,没有一个突破ip限制,因为实际上,,这项限制server结束,client牛逼,不能突破..只要是能够始终重复刷票罢了 一个朋友突然来了个网站,让我帮她投票..我是一个更好的人说话 ...

  6. Apple Watch 1.0 开发介绍 1.4 简介 使用iOS技术

    WatchKit extension可以使用iOS app同样的技术,但是由于他是extension,使用有些技术的时候会有限制,有些不推荐使用.下面是一些介绍以及什么时候使用什么技术: 有些需要权限 ...

  7. web引用和服务引用

    原文:web引用和服务引用 在VS2010环境下开发C#的winform程序或者WPF时,会碰到调用web引用的问题. 1.添加一个服务引用时,会在app.config里生成basicHttpBind ...

  8. 如何在 Swift 中优雅地处理 JSON

    阅读目录 在Swift中使用JSON的问题 开始 基础用法 枚举(Enumeration) 下标(Subscripts) 打印 调试与错误处理 后记   因为Swift对于类型有非常严格的控制,它在处 ...

  9. charles抓包

    charles使用教程指南 charles使用教程指南 前言 移动APP抓包 PC端抓包 查看模式 其他功能 问题汇总 1. 前言: Charles是一款抓包修改工具,相比起burp,charles具 ...

  10. 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域

    上一次看了第6章,面向对象.这里接着看第7章. 第7章:函数表达式 定义函数有两种方式:函数声明.函数表达式 //函数声明 function functionName(arg0,arg1,arg2){ ...