DataSet 内存中的数据库

本文介绍了DataSet作为内存中的数据库,详细讲解了DataSet、DataTable的概念,以及如何进行实战操作,包括删除列和父子表查询案例。强调了DataSet的独立性和在提高数据访问速度、安全性方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、前期准备

二、DataSet概念

三、实战语句

四、父子表查询案例


涉及知识点:C#中DataTable建立 -- 父子表查询

一、前期准备

using System;
using System.Data;

二、DataSet概念

概念:  DataSet    -- 内存中的数据库
          DataTable -- DataSet中的一个表

成员: 由一组DataTable组成, DataRelation 相互关联

应用: 结合DataAdapter使用
          1、DataAdapter将数据填充到DataSet中
          2、DataAdapter将DataSet更改提交到数据库
          3、XML文档或文本加载到DataSet中

作用: DataSet将数据加载到内存中执行,提高了数据访问速度,提高硬盘数据的安全性,程序运行的速度和稳定性

特性:独立性,不依赖任何数据库,离线和连接,操作灵活

创建:DataSet()  DataSet(名称)

常用属性:
               DataSetName  -- 名称
               Tables              -- DataTable集合
               DataRelation    -- 数据关系

方法:
         ds.AcceptChanges();        -- 提交
         ds.RejectChanges();         -- 回滚
         ds.Clear();                         -- 清除所有表中的行数据,保留表结构
         ds.Copy();                         -- 复制结构和数据
         ds.Clone();                        -- 只复制结构
         ds.Merge(rows/DataTable/DataSet)  -- 合并
         ds.Reset();                        -- 回归最初
         ds.Load(IDataReader);     --  加载数据

表之间的关系: 
             一对一  一个表列数太多,拆分成两张表
              一对多   父--子关系
             多对多   中间表建立   权限分配

三、实战语句

问:删除DataSet中的指定列

答:   ds.Tables["xxxx"].Columns.Remove("xxxx");  //根据字符串删除
        ds.Tables["xxxx"].Columns.RemoveAt(3);         //根据下标删除

四、父子表查询案例

   internal class Program
    {
        /// <summary>
        /// 关系: 
        ///      一对一  一个表列数太多,拆分成两张表
        ///       一对多   父--子关系
        ///       多对多   中间表建立   权限分配
        /// </summary>
        static void Main(string[] args)
        {
            DataSet ds = new DataSet("ds");
            DataTable dt1 = new DataTable("tb_user");
            DataTable dt2 = new DataTable("tb_dept");
            ds.Tables.Add(dt1);
            ds.Tables.Add(dt2);

            //-------------------创建表架构--------------------------
            dt1.Columns.Add("userId", typeof(int));
            dt1.Columns.Add("userName", typeof(string));
            dt1.Columns.Add("userAge", typeof(int));
            dt1.Columns.Add("deptId", typeof(int));

            dt2.Columns.Add("deptId", typeof(int));
            dt2.Columns.Add("deptName", typeof(string));

            //-------------------创建表信息--------------------------
            dt1.Rows.Add(1, "小白", 22, 1);
            dt1.Rows.Add(2, "小王", 24, 3);
            dt1.Rows.Add(3, "小兰", 18, 2);
            dt1.Rows.Add(4, "小红", 19, 2);

            dt2.Rows.Add(1, "财务部");
            dt2.Rows.Add(2, "技术部");
            dt2.Rows.Add(3, "老板");

            //---------------------关系配置---------------------------
            ////主键设置
            //dt1.PrimaryKey = new DataColumn[] { dt1.Columns["userId"] };
            ////唯一主键设置
            //dt2.Constraints.Add(new UniqueConstraint("uc", dt2.Columns["deptName"]));
            ////外键设置
            //dt1.Constraints.Add(new ForeignKeyConstraint("fk", dt2.Columns["deptId"], dt1.Columns["deptId"]));
            ////以下一条 等同于 上述三条

            DataRelation relation = new DataRelation("relation1", dt2.Columns["deptId"], dt1.Columns["deptId"], true);
            ds.Relations.Add(relation); //关系添加
            //使用关系-- 显示效果  根据父查询子表
            DataRow[] rows = dt2.Rows[1].GetChildRows(relation);
            Console.WriteLine("------根据父表(dept) 查询子表(user)------");
            foreach (DataRow row in rows)
            {
                Console.WriteLine($"userId:{row["userId"].ToString()} " +
                                        $"userName:{row["userName"].ToString()}" +
                                        $"userAge:{row["userAge"].ToString()}" +
                                        $"deptId:{row["deptId"].ToString()}");
            }
            //根据子查询父表
            DataRow row1 = dt1.Rows[1].GetParentRow(relation);
            Console.WriteLine("\n\n------根据子表(user) 查询父表(dept)------");
            Console.WriteLine($"deptId:{row1["deptId"].ToString()} " +
                                    $"deptName:{row1["deptName"].ToString()}");

            Console.WriteLine("Hello World!");
        }
    }

 结果显示:


如有错误,烦请批评指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值