• ADO.NET之DataSet类


    DataSet相当于一个小型数据库,通过它可以管理数据和关系

    1.将sql代码的返回结果填充到该类中,然后从该类中读取,显示。(类似于Sqldatareader类)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string source = "server=(local) \SQLEXPRESS;integrated security=true;database=Student;";//integrated security为true时,将使用当前的Windows帐户凭据进行身份验证。 可识别的值为true、false、yes、no以及与true等效的sspi
                SqlConnection con = new SqlConnection(source);//using System.Data.SqlClient
                con.Open();
                if (con.State == ConnectionState.Open)//using System.Data;
                    Console.WriteLine("数据库已连接!");
                string select = "select * from customers";
                SqlDataAdapter sda = new SqlDataAdapter(select, con);//DataAdapter对象在DataSet与数据之间起桥梁作用,用于填充DataSet类
                DataSet ds=new DataSet();
                createdatatable(ds);//自定义方法   重新生成架构(架构包括主键,约束等)
                sda.Fill(ds,"a");//把查询到的结果填充到ds(DataSet类)中,并且DataSet中自定义表名“a”,“a”与数据库中的“Customers”相映射
                foreach (DataRow row in ds.Tables["a"].Rows)//DataSet中的Tables属性为表的集合,利用索引查找到表"a","a"相当于一个DataTable,DataTable的Rows属性为表中行的集合,然后利用foreach循环遍历每一行并且保存在Datarow(row)中,在利用索引输出row中的每一列
                    Console.WriteLine("phone:{0},name:{1},id:{2}", row[0], row[1], row[2]);
                foreach (DataRow row in ds.Tables["a"].Rows)
                {
                    Console.WriteLine("________________________________");
                    foreach (DataColumn column in ds.Tables["a"].Columns)
                    {
                        row[0] = "110";//更改原来的值
    
                        Console.WriteLine("{0} 的当前值为:{1}", column.ColumnName, row[column, DataRowVersion.Current]);//DataRow类中的DataRowVersion.Current代表该行的当前值
                        Console.WriteLine("{0} 的原先值为:{1}", column.ColumnName, row[column, DataRowVersion.Original]);//DataRow类中的DataRowVersion.Original代表该行的原先值,第一次的赋值
                        Console.WriteLine("{0} 的默认值为:{1}", column.ColumnName, row[column, DataRowVersion.Default]);//DataRow类中的DataRowVersion.Default代表该行的默认值
                    }
                }
                con.Close();
            }
            private static void createdatatable(DataSet ds)
            {
                DataTable table = new DataTable("a");//定义一个名为“a”的表,它和存储查询结果的表是同一个
                table.Columns.Add(new DataColumn("Phone", typeof(string)));//向该表中添加一个新列
                ds.Tables.Add(table);//把该表添加到ds(DataSet)中
            }
        }
    }

    2.自己建立数据表和主外键约束,填充到DataSet类中,显示在终端上

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataSet ds = new DataSet();
                ds.Tables.Add(createbuildingtable());
                ds.Tables.Add(createroomtable());
                //定义外键约束
                DataColumn child = ds.Tables["room"].Columns["buildingid"];
                DataColumn parent=ds.Tables["building"].Columns["buildingid"];
                ForeignKeyConstraint fc = new ForeignKeyConstraint("fc", parent, child);//主(building)表从(room)表之间建立外键关联对象fc,约束名为fc
                ds.Tables["room"].Constraints.Add(fc);//必须添加到子表中的约束集合(Constraints)中
                ////申明基类数组,存放表中的数据
                object[] dt1=new object[2];
                object[] dt2 = new object[3];
                //为基类数组赋值
                dt1[0] = 1;
                dt1[1] = "如家";
                dt2[0] = 206;
                dt2[1] = "翰墨轩";
                dt2[2] = 1;
                ////将数据加到表的行中去
                ds.Tables["building"].Rows.Add(dt1);
                ds.Tables["room"].Rows.Add(dt2);
                //打印两个表中的数据
                foreach(DataRow x in ds.Tables["building"].Rows)
                    foreach (DataColumn y in ds.Tables["building"].Columns)
                    {
                        Console.WriteLine("{0}:{1}", y.ColumnName, x[y]);
                    }
                foreach (DataRow x in ds.Tables["room"].Rows)
                    foreach (DataColumn y in ds.Tables["room"].Columns)
                    {
                        Console.WriteLine("{0}:{1}", y.ColumnName, x[y]);
                    }
                ds.Relations.Add("rooms", ds.Tables["building"].Columns["buildingid"], ds.Tables["room"].Columns["buildingid"]);//Relations:用于将表链接起来并允许从父表浏览到子表的关系的集合
                Console.WriteLine("________________________");
                foreach (DataRow building in ds.Tables["building"].Rows)
                {
                    DataRow[] children = building.GetChildRows("rooms");//使用 关系集合 的指定 关系名称RelationName(rooms),取得 DataRow 的子資料列
                    int count = children.Length;
                    Console.WriteLine("building{0} contains {1} room{2}", building["name"], count, count > 1 ? "s" : "");
                    foreach (DataRow row in children)
                        Console.WriteLine("room:{0}", row["name"]);
                }
            }
    
            private static DataTable createroomtable()
            {
                DataTable room = new DataTable("room");//申请一个内存表
                //为内存表添加列
                room.Columns.Add(new DataColumn("roomid", typeof(int)));
                room.Columns.Add(new DataColumn("name", typeof(string)));
                room.Columns.Add(new DataColumn("buildingid", typeof(int)));
                //设置主键约束的另一种方法,使用UniqueConstraint
                //room.Constraints.Add(new UniqueConstraint(room.Columns["roomid"]));//room.Constraints:由该表维护的约束的集合
                DataColumn[] a = new DataColumn[1];//定义datacolumn对象的数组
                a[0] = room.Columns["roomid"];
                room.PrimaryKey = a;//定义主键 PrimaryKey:获取或设置充当数据表主键的列的数组,他的类型为datacolumn对象的数组
                return room;
            }
    
            private static DataTable createbuildingtable()
            {
                DataTable building = new DataTable("building");
                building.Columns.Add(new DataColumn("buildingid", typeof(int)));
                building.Columns.Add(new DataColumn("name", typeof(string)));
                DataColumn[] a = new DataColumn[1];//定义datacolumn对象的数组
                a[0] = building.Columns["buildingid"];
                building.PrimaryKey =a;//定义主键 PrimaryKey:获取或设置充当数据表主键的列的数组,他的类型为datacolumn对象的数组
                return building;
            }
        }
    }
  • 相关阅读:
    分层图(了解一下,下一道比较好做)
    图论---The Captain
    数论
    NOIp复习计划
    20201116 Day4 卢卡斯定理
    20201113 Day3 斜率优化
    20201110Day2 分块
    20201030 day50 复习13:逆元、裴蜀定理
    20201030day50 模板全掌握
    20201029 day49 模拟(十八)
  • 原文地址:https://www.cnblogs.com/runninglzw/p/3856078.html
Copyright © 2020-2023  润新知