ADO.Net中DataSet的应用

一、思维导图

 

二、概述

  DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的。所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。

 

构造函数

Data​Set()

初始化 DataSet 类的新实例。

Data​Set(Serialization​Info,Streaming​Context)

初始化具有给定序列化信息和上下文的 DataSet 类的新实例。

Data​Set(Serialization​Info,Streaming​Context, Boolean)

初始化 DataSet 类的新实例。

Data​Set(String)

用给定名称初始化 DataSet 类的新实例。

 

属性

CaseSensitive

获取或设置一个值,该值指示 DataTable 对象中的字符串比较是否区分大小写。

Container

获取组件的容器。

DataSetName

获取或设置当前 DataSet 的名称。

DefaultViewManager

获取 DataSet 所包含的数据的自定义视图,以允许使用自定义的 DataViewManager 进行筛选、搜索和导航。

DesignMode

获取指示组件当前是否处于设计模式的值。

EnforceConstraints

获取或设置一个值,该值指示在尝试执行任何更新操作时是否遵循约束规则。

Events

获取附加到该组件的事件处理程序的列表。

ExtendedProperties

获取与 DataSet 相关的自定义用户信息的集合。

HasErrors

获取一个值,指示在此 DataTable 中的任何 DataSet 对象中是否存在错误。

IsInitialized

获取一个值,该值指示是否已初始化 DataSet。

Locale

获取或设置用于比较表中字符串的区域设置信息。

Namespace

获取或设置 DataSet 的命名空间。

Prefix

获取或设置一个 XML 前缀,该前缀是 DataSet 的命名空间的别名。

Relations

获取用于将表链接起来并允许从父表浏览到子表的关系的集合。

RemotingFormat

为远程处理期间使用的 SerializationFormat 获取或设置 DataSet

SchemaSerializationMode

获取或设置 SchemaSerializationMode 的 DataSet

Site

获取或设置 DataSet 的 ISite

Tables

获取包含在 DataSet 中的表的集合。

 

方法(常用)

AcceptChanges()

提交自加载此 DataSet 或上次调用 AcceptChanges() 以来对其进行的所有更改。

BeginInit()

开始初始化在窗体上使用或由另一个组件使用的 DataSet。 初始化发生在运行时。

Clear()

通过移除所有表中的所有行来清除任何数据的 DataSet。

Clone()

复制 DataSet 的结构,包括所有 DataTable 架构、关系和约束。不要复制任何数据。 

Copy()

复制该 DataSet 的结构和数据。

CreateDataReader()

为每个 DataTableReader 返回带有一个结果集的 DataTable,顺序与 Tables 集合中表的显示顺序相同。

CreateDataReader(DataTable[])

为每个 DataTableReader 返回带有一个结果集的 DataTable。

GetChanges()

获取 DataSet 的副本,该副本包含自加载以来或自上次调用 AcceptChanges() 以来对该数据集进行的所有更改。

GetChanges(DataRowState)

获取由 DataRowState 筛选的 DataSet 的副本,该副本包含上次加载以来或调用 AcceptChanges() 以来进行的所有更改。

GetDataSetSchema(XmlSchemaSet)

获取数据集的 XmlSchemaSet 的副本。

GetHashCode()

作为默认哈希函数。

GetType()

获取当前实例的 Type。

GetXml()

返回存储在 DataSet 中的数据的 XML 表示形式。

HasChanges()

获取一个值,该值指示 DataSet 是否有更改,包括新增行、已删除的行或已修改的行。

 

事件

Disposed

添加事件处理程序以侦听组件上的 Disposed 事件。

Initialized

初始化 DataSet 后发生。

MergeFailed

当目标和源 DataRow 的主键值相同且 EnforceConstraints 设置为真时发生。

 

三、知识点

DataSet、DataTable、DataRow之间有什么关系?

  DataSet是数据集,DataTable是数据表,DataSet存储多个DataTable。DataSet和DataTable像是专门存储数据的一个容器,在你查询数据库得到一些结果时可以存在里面。DataRow表示DataTable中包含的实际数据,我们可以通过DataRow将数据添加到用DataColumn定义好DataTable中。

 

如何获取DataSet中的数据?

从DataSet中获取数据有两种方式:

1.第一种方式是通过指定DataSet中的具体DataTable的某行某列来获取数据,步骤如下:

  ①通过表名,从DataSet中获取指定的DataTable

  ②通过索引,从DataTable中获取指定的DataRow

  ③通过列名,从DataRow中获取指定列的数据

2.第二种方式是将DataSet中的数据直接绑定到数据展示控件上。

 

  以构建科室-医生的树形结构为例,讲解如何运用DataSet创建树形结构,以下为部分重要关键步骤的讲解:

  ①指定SQL命令的命令文本;该命令分别按要求进行查询,查询结果将返回多张表;

  ②将SQL数据适配器的查询命令属性指向SQL命令;

  ③声明并实例化数据集(DataSet),用于保存查得的多张表;

  ④打开SQL连接;SQL数据适配器读取数据,并填充数据集;关闭SQL连接。

  ⑤声明科室数据表,对应数据集的表集合中的第1张数据表;(即Tables[0])

    声明医生数据表,对应数据集的表集合中的第2张数据表;(即Tables[1])

  ⑥声明数据关系数组DataRelation[]

    实例化数据关系,实现科室表、医生表之间的层次关系;

    数据关系名称;(如KeShi-Doctor);

    父表的被参照列为科室表的编号列;

    子表的参照列为医生表的科室编号列;

    不创建约束(父列上的唯一约束、子列上的外键约束);

    (若还有下一层关系,可再次执行实例化数据关系及以下步骤)

  ⑦将数据关系数组批量加入数据集的关系集合(dataSet.Relations.AddRange (dataRelations))中;

  ⑧树形视图的节点集合清空;

  ⑨遍历院系数据表中的每一数据行;

    声明并实例化科室节点,该节点对应当前某个科室;

    科室节点的文本设为当前科室的名称;KeShiNode.Text = KeShiRow["Name"].ToString();

    将科室节点加入树形视图的(根)节点集合;(this.trv_EducationUnit.Nodes.Add(KeShi)

    借助先前定义的数据关系,遍历当前科室所在数据行的子行,即下属所有医生;

   

    声明并实例化医生节点,该节点对应当前某个医生;

    医生节点的文本设为当前医生的名称;

    医生节点的标签(Tag)设为当前班级的编号;

    医生节点加入当前科室节点的节点集合,成为第1级节点之一;departmentNode.Nodes.Add(Doctor);

   (若还有下一级节点,则借助先前定义的xx关系,遍历当前xx所在数据行的子行,即下属所有xx;然后可再次执行声明并实例化该节点及以下部分)

四、示例代码

 private void 手术申请管理_Load(object sender, EventArgs e)
        {
            SqlConnection sqlConnection = new SqlConnection();                                            
            sqlConnection.ConnectionString =
                "Server=DESKTOP-VKS7HLB;Database=手术麻醉系统;Integrated Security=sspi";                             
            SqlCommand sqlCommand = new SqlCommand();                                                       
            sqlCommand.Connection = sqlConnection;                                                        
            sqlCommand.CommandText =                                                                       
                "SELECT * FROM tb_KeShi ;"                                                              
                + "SELECT * FROM tb_Docter;"
                + "SELECT * FROM tb_Nurse;"
                +"SELECT* FROM tb_MzDocter";
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();                                           
            sqlDataAdapter.SelectCommand = sqlCommand;                                                      
            DataSet dataSet = new DataSet();                                                                
            sqlConnection.Open();                                                                          
            sqlDataAdapter.Fill(dataSet);                                                                 
            sqlConnection.Close();                                                                          
            DataTable KeshiTable = dataSet.Tables[0];                                                
            DataTable DocterTable = dataSet.Tables[1];                                                      
            DataTable NurseTable = dataSet.Tables[2];
            DataTable MzDocterTable = dataSet.Tables[3];
            DataRelation[] dataRelations =                                                                  
            {
                new DataRelation                                                                           
                    ("Keshi_Docter"                                                                   
                    , KeshiTable.Columns["KSID"]                                                         
                    , DocterTable.Columns["KSID"]                                                    
                    , false)                                                                                
                                                                                            
            };
            dataSet.Relations.AddRange(dataRelations);                                                    
            this.trv_shoushu.Nodes.Clear ();
            foreach (DataRow KeshiRow in KeshiTable.Rows)                                        
            {
                TreeNode KeshiNode = new TreeNode();                                                   
                KeshiNode.Text = KeshiRow["KSName"].ToString();                                     
                this.trv_shoushu.Nodes.Add(KeshiNode);                                          
                foreach (DataRow DocterRow in KeshiRow.GetChildRows("Keshi_Docter"))                
                {
                    TreeNode DocterNode = new TreeNode();                                                  
                    DocterNode.Text = DocterRow["DOCName"].ToString();                                           
                    KeshiNode.Nodes.Add(DocterNode);
                    DocterNode.Tag = DocterRow["DOCID"];
                   
                }
            }
        }

五、效果截图

转载于:https://www.cnblogs.com/CTHK/p/9973156.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值