• SqlDataAdapter DataSet DataTable 详解


    1.SqlDataAdapter调用存储过程

    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter("GetAllUsers", "server=(local);database=DemoDB;Integrated Security=true;");
    da.SelectCommand.CommandType = CommandType.StoredProcedure;
    da.Fill(ds);
    this.dataGridView1.DataSource = ds.Tables[0];
    

    2.高效的填充DataSet

       Fill()方法执行SelectCommand,会使用查询结果的内容和结构填充数据集中的数据表

       可以通过下列方法提高性能:

       a.DataSet.EnforceConstrains=false

       b.对DataTable对象调用BeginLoadData()方法

    3.BeginLoadData()方法提升性能的原因:

          在填充一个数据集前显示的定义数据结构,数据表,数据列以及数据关联关系在数据载入

          前已经确定,是数据可以更高效的载入

    4.如何显示的定义一个数据集的数据结构

       a.创建一个类型化的数据集类

     b.以编程的方式创建数据表数据列和数据关联等 – 或者以编程的方式创建数据表、数据列和数据关联等对象

    5.每个数据行对象都有一个RowState属性
      – 标识数据集中每一行数据的状态
      – 状态的类型
      • DataRowState.Added 该行已经插入到数据集
      • DataRowState.Deleted 该行已经从数据集中删除
      • DataRowState.Detached 该行已经创建,但未增加到数据集中的DataRowCollection
      • DataRowState.Modified 该行已经更改
      • DataRowState.Unchanged 该行没有发生任何变化
    6.DataSet 跟踪更改的方式
      每个数据集都对每一行数据维护两份拷贝
        – 当前版本DataRowVersion.Current

        if (row.RowState == DataRowState.Added)
          row[ “FieldName ",DataRowVersion.Current ] row[ FieldName ,DataRowVersion.Current]
        – 原始版本 DataRowVersion.Original
        if (row RowState ==DataRowState Deleted) if  (row .RowState== DataRowState.Deleted)
          row[“FieldName",DataRowVersion.Original]
    7.数据更新命令
      • 一个SqlDataAdapter 或OleDbDataAdapter 对象都有一些命令对象可以用来更改数据源的数据
        – InsertCommand
        – UpdateCommand
        – DeleteCommand
      • 语法:对Sql 和OleDb 的数据适配器以及各个命令 q 数据 各个命令对象完全相同
        – public SqlCommand InsertCommand {g et ; set ;} p q {g ; ;}
    8.使用CommandBuilder生成命令 使用CommandBuilder生成命令
      • InsertCommand
        – 在数据源处为表中所有RowState为Added 的行插入一行。插入所有可更新列的值

         (但是不包括标识 表达式或时间戳等列) 所有可更新列的值(但是不包括标识、表达式或时间戳等列)。
      • UpdateCommand
        – 在数据源处更新表中所有RowState为Modified 的行。更新所有 在数据源处更新表中所有RowState为Modified  的行。

          更新所有列的值,不可更新的列除外,例如标识列或表达式列。
        – 更新符合以下条件的所有行:数据源中的列值匹配行的主键列值,并且数据源中的剩余列匹配行的原始值 。
      • DeleteCommand
        – 在数据源处删除表中所有RowState为Deleted  的行。删除符合以下条件的所有行:列值匹配行的主键列值,并且数据源中的剩余列匹配行的原始值。

    9.使用DataSet 对象的GetChanges 方法的时机
      • 当需要将数据更改传给由另一个对象使用的另一个类的时候调用GetChanges()方法
      • 使用GetChanges() 方法得到包含该数据集中所有数据更改的数据集的拷贝
        – 从数据被载入开始
        – 从AcceptChanges() 方法最后一次被调用开始
    10.将更改合并到一个DataSet 对象

      • 使用Merge()方法合并两个数据集:一个原始数据集以及一个仅包含对原始数据集更 始数据集以及 个仅包含对原始数据集更改的数据集
        aDataSet Merge( anotherDataSet) aDataSet. Merge ( anotherDataSet)
      • 被合并的两个数据集要有相同的数据结构
    11.使用DataSet 更新数据源

      • 数据适配器的Update() 方法对指定的数据表中被更新过的每一行调用适当的SQL语句中被更新每行调用句
      • 代码示例
        aDataAdapter.Update ( aDataSet, aDataTable) aDataAdapter.Update ( aDataSet,  aDataTable)
    12.DataSet 接受数据更改的方式

      • 数据集的A cceptChanges()方法提交自数据被载入或自此次调用起所有该数据集的数据更改
      • 可以对整个数据集调用AcceptChanges() 方法,或者对一个DataTable 对象的一个数据行对象调用

    13.发生冲突
      • 非连接环境使用了开放式并发机制
        – 在一步数据操作完成后数据库锁立即被释放
        – 非连接环境使用开放式并发机制保证其他资源对数据库的同步访问
        – 保守式并发机制在整个数据操作过程中保持数据库的锁
      • 在更新数据库时会产生数据冲突
        – 另一个应用或服务可能已经更改了数据
      • 例如
        – 删除已经不存在的行
        – 更新已经被更新的列
    14.检测冲突
      • 数据适配器配置向导可以产生用来监测冲突的SQL语句
      • 当更新数据库时
        – 数据更新命令比较数据库中的当前数据与原始值
        – 任何不同都会抛出一个冲突
    15.解决冲突
      • 使用HasErrors属性来测试错误
        – DataSet.HasErrors
        – DataTable.HasErrors
        – DataRow.HasErrors
      • 选择下列一种策略解决冲突
        – 用数据集中的值覆盖曾经有过的数据操作
      • 适用于管理员系统用来强制将数据覆盖数据源中的数据
        – 保持数据集中冲突行以便后续重新更新数据库
      • 将冲突的数据保存在数据集中以便重试
      • “使用开放式并发”选项的默认策略
      • 拒绝冲突的行并在数据集中回滚到初始值
        – 拒绝在本地数据集中冲突的数据,将数据回滚 拒绝在本地数据集中冲突的数据,将数据回滚到从数据库中加载得到的初始值
        – 对冲突的数据集数据表数据行调用 – 对冲突的数据集、数据表、数据行调用RejectChanges()方法
      • 拒绝冲突的行并从数据库得到最近的数据
        – 调用数据集的Clear()方法,重新从数据库中加载数据

  • 相关阅读:
    poj 1789 Truck History(最小生成树)
    POJ 3096 Surprising Strings(STL map string set vector)
    hdu 1412 (STL list)
    POJ 1552 Doubles (C++ STL set使用)
    poj 水题系列
    洛谷P4859 已经没有什么好害怕的了
    CF1228E Another Filling the Grid
    二项式反演
    AT [ABC177F] I hate Shortest Path Problem
    [NOI2020]制作菜品
  • 原文地址:https://www.cnblogs.com/refactor/p/2527008.html
Copyright © 2020-2023  润新知