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

1.DataAdapter对象

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

Code
public 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[1];  // 使用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 = 0; 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(连接模式访问)

    ado.net框架支持两种模式的数据访问: 连接模式(Connected)和非连接模式(disconnected).这一节介绍如何使用连接模式访问数据库中的数据,利用ADO.NET中的Connecti ...

  2. asp.net学习笔记异常处理001---.framework4.0中asp.net页面ValidateRequest=false 无效的问题

    在做牛腩新闻发布系统的时候,部分同学可能会遇到这样的情况: 从客户端(ContentPlaceHolder1_m_ContentPlaceHolder_ftbContent="<P&g ...

  3. ASP.Net学习笔记015--ASP.Net中使用Cookie

    ASP.Net学习笔记015--ASP.Net中使用Cookie 表单数据欺骗: 原理跟收到欺骗短信一样,移动信号塔[基站],伪装的移动信号塔会屏蔽移动信号,并且 在信号范围内的手机会自动切换为接收伪 ...

  4. 学习使用ADO.NET Data Services (ADO.NET 数据服务框架) - Part 1

    学习使用ADO.NET Data Services (ADO.NET 数据服务框架) ADO.NET Data Services Framework是在.NET Framework 3.5 SP1新推 ...

  5. ASP.net 学习路线(详细)

    ASP.net 学习路线(详细) 浏览:5632 | 更新:2013-12-13 16:33 | 标签: asp.net 百度经验:jingyan.baidu.com .net学习路线 入门篇1.   ...

  6. Asp.net学习心得

    ASP.NET是一种强大而流行的网站开发框架,由微软公司开发和维护.它提供了一种可靠且高效的方式来构建动态和交互性的网页应用程序.ASP.NET结合了服务器端脚本.HTML和CSS,并支持多种编程语言 ...

  7. ASP.NETCore学习记录(一)

    ASP.NETCore学习记录(一) asp.net core介绍  Startup.cs  ConfigureServices  Configure  0. ASP.NETCore 介绍 ASP.N ...

  8. jQuery框架学习第二天:jQuery中万能的选择器

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  9. asp.net学习资源汇总

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

  10. asp.net学习之再论sqlDataSource

    asp.net学习之再论sqlDataSource 原文:asp.net学习之再论sqlDataSource 本节从上一节没有阐述的几个方面,再讨论一下SqlDataSource的用法及注意的事项. ...

最新文章

  1. mybatis 动态传入表名 注解_Mybatis动态sql的动态表名问题
  2. 报名倒计时 | TeaTalk 深圳站邀您共话安全云世界
  3. 套接字初始化失败问题
  4. STM32工作笔记0012---认识老化试验
  5. 读《About Face 4 交互设计精髓》10
  6. Samba服务------SMB协议
  7. JavaScript 设计模式核核心原理与应⽤实践(一)原则于核心思想
  8. 计算机第二课堂教学计划,第二课堂教学计划
  9. 【微信小程序】实现简单轮播图效果
  10. python学习面向对象_Python小白必学的面向对象
  11. eclipse的web项目中index.jsp文件出现The superclass was not found on the java build path
  12. hibernate对oracle的文本字段按拼音排序
  13. Transact-SQL(T-SQL)编程
  14. PLC控制系统的接地设计
  15. mysql是什么数据库
  16. C语言ctime函数
  17. MySQL数据库引擎和索引
  18. (超详细)强大的grid布局
  19. repo init详解
  20. 地磅称重管理系统智能称重——称重软件必备的10大功能

热门文章

  1. 安装hadoop中启动namenode、datanode有警告
  2. java double 存储_Java语言中:float、double在内存中存储方式
  3. 力扣-58 最后一个单词的长度
  4. ubuntu jdk1.7升级到1.8
  5. 虚拟机vmware vmnet8 未识别(转)
  6. python中的__new__、__init__和__del__
  7. Python3.6全栈开发实例[022]
  8. ERROR: Could not create or update '/usr/local/nagios/var/nagios.configtest'
  9. request.GetResponse()超时的解决办法
  10. openstack排错