首页 > 其他分享 >DataSet & DataTable &DataRow 深入浅出

DataSet & DataTable &DataRow 深入浅出

时间:2022-10-25 10:01:17浏览次数:48  
标签:Console DataSet DataRow WriteLine new dt DataTable

https://www.cnblogs.com/wangbaicheng1477865665/archive/2018/01/10/8213917.html

1.概念

  DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关、与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。我们可以把DataSet当成内存数据库,DataSet里面可以存储多个表(DataTable);我们称DataSet为数据集对象。

  DataTable是一个临时保存数据的网格虚拟表(表示内存中数据的一个表。)。DataTable是ADO dot net 库中的核心对象。它可以被应用在 VB 和 ASP 上。它无须代码就可以简单的绑定数据库。它具有微软风格的用户界面。 其他使用DataTable的对象包括DataSet和DataView,DataTable中存放的是一行行的数据,这一行行的数据就是DataRow 的数组(Array);我们称DataTable 为数据表对象。         DataRow是DataTable中的数据行,他内部有包含多个数据列,每个列可以存储不同类型的值。

2.DataSet 的常见使用 

在C# 中 DataSet 存在于 System.Data 命名空间下,类似于java中包的路径。DataSet 有两种事列方式,代码如下

DataSet 常用的属性就一个,Tables ,这里就不过多解释了,如下列出DataSet .Tables 如下常用属性:

// ds.Tables.Count;//获取数据集中存在的表的个数
// ds.Tables.Add(new DataTable());//添加一个表(DataTable)到数据集

//DataTable[] array = { new DataTable(), new DataTable(), new DataTable() };
//ds.Tables.AddRange(array);//添加一个表(DataTable)的数组(Array)到数据集

//ds.Tables.Remove();//删除一个表
//ds.Tables.RemoveAt();//按照表的索引从数据集删除一个表
//ds.WriteXml()//将xml 文件写入到DataSet 数据集中
//ds.ReadXml()//将一个xml 文件读取到数据集中
//ds.Tables.CanRemove()//验证是否可以删除一个集合中的对象。

 

3.DataTable 的常见使用

 DataTable 和DataSet 命名空间一样,实例化的方式有三种,但是常用的就两种,第三种指定了表空间;这里不过多解释,现在我们来看下两种常用实例方式;

实例化1                               DataTable dt0 = new DataTable();//没有指定表名,默认表名为 NewDataTable
实例化2                               DataTable dt1 = new DataTable("User");//指定表名

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 using System; using System.Data;   namespace testData {     class Program     {         static void Main(string[] args)         {             DataSet ds = new DataSet("Set");             DataTable dt = new DataTable("User");             ds.Tables.Add(dt);//把一个表加入到数据集中             Console.WriteLine(ds.Tables.Count);             Console.WriteLine(ds.Tables[0].TableName);             Console.Read();         }     } }

  通过上面的代码,我们可以看出,我们使用DataSet 的Add方法将一个DataTable 加入数据集。

在前文概述中,我们就说了DataTable 是一个数据表,数据表就要有表头,那么如果创建一个表头呢,上代码

复制代码
 DataSet ds = new DataSet("Set");
            DataTable dt = new DataTable("User");
            dt.Columns.Add(new DataColumn("ID", typeof(int)));//设定表头ID
            dt.Columns.Add("Name", typeof(string));//设定表头Name
            dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]);
                
            }
            foreach (var item in dt.Columns)
            {
                Console.WriteLine("遍历表头方式2~~~" + item);
            }
            ds.Tables.Add(dt);//把一个表加入到数据集中
            Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表   ");
            Console.WriteLine("当前数据集的表名   " + ds.Tables[0].TableName);
            Console.Read();
复制代码

 这样一张空的表格,我们就有了,下边就是我们如何添加一个数据行了,别急,我们先来看下DataRow的使用。关于创建一个数据行我们会在高级部分分解。

这里简要说明下DataTable 的其他用法

1 DataTable的复制和数组复制是一样的使用,就是完全Copy 一个方法。

2.DataTable 的克隆,克隆指的是克隆表结构,含主键列

3.我们使用Merge 合并连个表

下列出上诉简要代码

复制代码
static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.AddRange(
                    new DataColumn[]
                    {
                        new DataColumn("ID",typeof(int)),
                        new DataColumn("UserName",typeof(string)),
                        new DataColumn("Age",typeof(int))
                    }
                );
            dt.Rows.Add(1, "xiaoli", 33);
            dt.PrimaryKey = new DataColumn[] { dt.Columns[0] };//给哪一列设置主键
            DataTable dtCopy = dt.Copy();//复制表,连数据和表结构一起复制
            DataTable dtClone = dt.Clone();//克隆一个表的结构,不包含数据
            DataRow dr= dtClone.NewRow();
            dr[0] = 2;
            dr[1] = "xiaomei";
            dr[2] = 23;
            dtClone.Rows.Add(dr);
            dt.Merge(dtClone);//当主键不同的时候,就会出现合并到一起,如果相同以被合并的表为主,表结构不一致也可以合并,这里就不掩饰了
            Console.WriteLine(dt.Rows.Count);
            Console.Read();
;        }
复制代码

 

 4.DataRow 的常见使用

DataRow 的创建方式,只有一种,因为我们net 中设定了DataRow不允许实例化,只能通过 DataTable.NewRow()来创建,如 DataRow dr = dt.NewRow();这样我们就得到了一个空行对象。

4.1 如何给DataTable 增加行数据呢??看如下代码

复制代码
using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds = new DataSet("Set");
            DataTable dt = new DataTable("User");
            dt.Columns.Add(new DataColumn("ID", typeof(int)));//设定表头ID
            dt.Columns.Add("Name", typeof(string));//设定表头Name
            dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]);
                
            }
            foreach (var item in dt.Columns)
            {
                Console.WriteLine("遍历表头方式2~~~" + item);
            }
            DataRow dr = dt.NewRow();
            dr["ID"] = 1;
            dr["Name"] = "xiaomeng";
            dr["age"] = 21;
            dt.Rows.Add(dr);
            ds.Tables.Add(dt);//把一个表加入到数据集中
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow item= dt.Rows[i];
                Console.WriteLine(item["name"]+"今年"+item["age"]+"岁了");
            }
            Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表   ");
            Console.WriteLine("当前数据集的表名   " + ds.Tables[0].TableName);
            Console.Read();
        }
    }
}
复制代码

我们很多程序员在开发的时候,都会认为这就把一个数据行添加到DataTable 里面了,其实不是这样的?具体看高级部分

 

5.综合应用之CRUD(增删改查)

5.1新增 

我们在DataRow中是有一个属性叫RowState 叫做行状态,行状态主要有如下值:“UnChange”(无变化),“Added”(新增过后的数据),“Modified”(修改之后的数据),“Deleted” 删除中的数据,如下图,下图为上面添加行数据的代码,断点调试。

通过上诉分析,我们会发现,添加的数据,并没有提交到内存上,只是程序临时存储的。那么我们怎么提交呢,看如下代码。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 using System; using System.Data;   namespace testData {     class Program     {         static void Main(string[] args)         {             DataSet ds = new DataSet("Set");             DataTable dt = new DataTable("User");             dt.Columns.Add(new DataColumn("ID"typeof(int)));//设定表头ID             dt.Columns.Add("Name"typeof(string));//设定表头Name             dt.Columns.Add("Age", Type.GetType("System.Int32"));//设定表头Name             for (int i = 0; i < dt.Columns.Count; i++)             {                 Console.WriteLine("遍历表头方式1_____"+dt.Columns[i]);                               }             foreach (var item in dt.Columns)             {                 Console.WriteLine("遍历表头方式2~~~" + item);             }             DataRow dr = dt.NewRow();             dr["ID"] = 1;             dr["Name"] = "xiaomeng";             dr["age"] = 21;             dt.Rows.Add(dr);             dt.AcceptChanges();//提交数据             ds.Tables.Add(dt);//把一个表加入到数据集中             for (int i = 0; i < dt.Rows.Count; i++)             {                 DataRow item= dt.Rows[i];                 Console.WriteLine(item["name"]+"今年"+item["age"]+"岁了");             }             Console.WriteLine("当前数据集中有“"+ ds.Tables.Count + "”个表   ");             Console.WriteLine("当前数据集的表名   " + ds.Tables[0].TableName);             Console.Read();         }     } }

  

 

 提交代码DataTable.AcceptChanges();那么有内存的提交是不是也应当有内存的回滚,这里不过多介绍了,我们来看下

DataTable 新增行数据的时候状态 为 Added ,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。

DataTable 修改行数据的时候状态 为 Modified ,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。

DataTable 删除行数据的时候状态 为 Deleted,这个时候可以使用DataTable的 .AcceptChanges()方法进行提交,可以使用RejectChanges()函数进行回滚。

下面来看下增删改的代码

复制代码
using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            DataColumn[] arrayColumn = {
                new DataColumn("id", typeof(int)),
                new DataColumn("name", typeof(string)),
                new DataColumn("age", typeof(int)),
                new DataColumn("sex", typeof(string))
            };  
            dt.Columns.AddRange(arrayColumn);
            Console.WriteLine("---------------------------新增---------------------------");
            DataRow dr0 = null;
            for (int i = 0; i < 5; i++)
            {
                dr0 = dt.NewRow();
                dr0[0] = i;
                dr0[1] = "xiaoming"+i;
                dr0[2] = 20+i+new Random().Next(1,10);
                dr0[3] = new Random().Next(i, 200)%3==0?"男":"女";
               
                dt.Rows.Add(dr0);
            }
            Console.WriteLine("新增没有提交打印");
            Print(dt);
            Console.WriteLine("状态==================" + dr0.RowState);
            dt.AcceptChanges();//新增提交
            Console.WriteLine("新增提交后打印");
            Print(dt);
            Console.WriteLine("状态==================" + dr0.RowState);
            Console.WriteLine("---------------------------修改---------------------------");
            DataRow dr1 = dt.Rows[0];
            dr1["name"] = "wbcsky";
            Console.WriteLine("修改没有提交打印");
            Print(dt);
            Console.WriteLine("状态==================" + dr1.RowState);
            dt.AcceptChanges();//新增提交
            Console.WriteLine("修改提交后打印");
            Print(dt);
            Console.WriteLine("状态==================" + dr1.RowState);
            Console.WriteLine("---------------------------删除---------------------------");
            DataRow dr2=dt.Rows[0]  ;//删除第一条
            dr2.Delete();//这里没有使用dt.rmove 和dt.rmoveat,因为这两个方法直接提交了
            Console.WriteLine("删除没有提交打印");
            Print(dt);
            Console.WriteLine("状态==================" + dr2.RowState);
            dt.AcceptChanges();//新增提交
            Console.WriteLine("删除提交后打印");
            Print(dt);
            Console.WriteLine("状态==================" + dr2.RowState);
            Console.Read();
        }

        private static void Print(DataTable dt)
        {
            foreach (DataRow item in dt.Rows)
            {
                string msg = "";
                try
                {
                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";
                }
                catch (Exception e)
                {
                     msg =e.Message;
                   
                }
              
                Console.WriteLine(msg);
            }
        }
    }
}
复制代码

执行结果如下图

6.综合应用之筛选排序

我们如果想给上面的表排序,要怎么排序呢?????,其实排序我们使用DataTable.Select 方法就可以,我们看下怎么使用

我们会看到select 方法有四个重载,我们只用一个参数的和连个参数的,其中一个参数的是筛选,两个参数的第一个参数为筛选,第二个为排序

复制代码
using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            DataColumn[] arrayColumn = {
                new DataColumn("id", typeof(int)),
                new DataColumn("name", typeof(string)),
                new DataColumn("age", typeof(int)),
                new DataColumn("sex", typeof(string))
            };  
            dt.Columns.AddRange(arrayColumn);
           
            DataRow dr0 = null;
            for (int i = 0; i < 5; i++)
            {
                dr0 = dt.NewRow();
                dr0[0] = i;
                dr0[1] = "xiaoming"+i;
                dr0[2] = 20+i+new Random().Next(1,5);
                dr0[3] = new Random().Next(i, 200)%3==0?"男":"女";
               
                dt.Rows.Add(dr0);
            }
            Console.WriteLine("---------------------------筛选之前---------------------------");
            Print(dt);
            DataRow[] rowArr=   dt.Select("age >25", " age desc");
            Console.WriteLine("---------------------------筛选之后按年龄排序---------------------------");
            PrintRow(rowArr);
            Console.Read();
        }
        private static void PrintRow(DataRow[] rowArr)
        {
            foreach (DataRow item in rowArr)
            {
                string msg = "";
                try
                {
                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";
                }
                catch (Exception e)
                {
                    msg = e.Message;

                }

                Console.WriteLine(msg);
            }
        }
        private static void Print(DataTable dt)
        {
            foreach (DataRow item in dt.Rows)
            {
                string msg = "";
                try
                {
                    msg = $"id={ item[0]},name={item[1]},age={item[2]},sex={item[3]}";
                }
                catch (Exception e)
                {
                     msg =e.Message;
                   
                }
              
                Console.WriteLine(msg);
            }
        }
    }
}
 

标签:Console,DataSet,DataRow,WriteLine,new,dt,DataTable
From: https://www.cnblogs.com/Dongmy/p/16823893.html

相关文章

  • C# DataTable.Select() 筛选数据
    https://blog.csdn.net/qq_26640897/article/details/81161883有时候我们需要对数据表进行筛选,微软为我们封装了一个公共方法, DataTable.Select(),其用法如下:Select()Se......
  • ADO.NET读取MySQL数据库的三种方式:DataReader、DataSet、DataView
    ADO.NET读取MySQL数据库有多种方式:DataReader、DataSet、DataView。Command对象的ExecuteScalar方法查询数据库获取某个单个值,但是如果获取多行、多列可以用ExcecuteReader......
  • C# 将JArray转换为datatable
    ///<summary>///将JArray转换为datatable///</summary>///<paramname="dataArr"></param>///<returns></returns>......
  • DataSet与DataLoaders使用教程
    title:DataSet与DataLoaders使用教程mathjax:truedate:2022-10-0409:13:43tags:DataSetDataLoaderDataSet与DataLoaders使用教程4、PyTorch的Dataset与Data......
  • C#DataTable(转List /JSON/字典 互转)【工具类】
    #region数据表DataTable转键值对集合List///<summary>///数据表DataTable转键值对集合List///把DataTable转成List集合,存每一行......
  • DDD20 End-to-End Event Camera Driving Dataset: Fusing Frames and Events with Dee
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!AcceptedinThe23rdIEEEInternationalConferenceonIntelligentTransportationSystems(SpecialSession:......
  • DataTable使用方法
    DataTable使用方法: usingSystem.Data;namespaceAdoNetCourseDataTable{classProgram{staticvoidMain(string[]args){......
  • 嵌套Json写入DataTable
    *json中的value的type有时候是个array,DataTable是不能写入这样的json的。但是由于业务需求有时候可能需要将json中的Array也写入DataTable。*解决方案是将DataTable中......
  • 曾经最强性能的人脸检测算法(Wider Face Dataset)
    计算机视觉研究院专栏作者:Edison_G今天分享的内容,在其他各平台估计都有陆续分享,今天我们“计算机视觉研究院”从我们自己的角度来分析下YOLOF框架,看看他值不值得被CVPR2021......
  • C# 读取Excel到DataSet
    1///<summary>2///读取Excel文件3///</summary>4///<returns></returns>5publicstaticDataSetReadExcel(stringpath)6{7DataSetds=ne......