目录
涉及知识点: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!");
}
}
结果显示:
如有错误,烦请批评指正