DataSet & DataTable &DataRow 深入浅出

 

民俗桌面报表设计器是凭借要在系遭到安,并由此桌面快捷方式打开的设计器。根据不同之网,需要设置相应之设计器软件,同时于哪个设备上安,就只好当谁设备及采取。

 

苟在线报表设计器则是恃甭管需安装,通过各类设施的浏览器就能在线应用的报表设计器,完全去掉了桌面设备、移动设备等不等平台的范围。

本篇文章可来一定之根基的人去查看 ,最好读书过早晚net
编程基础在来查此篇。

正文通过比两种植设计器主要特点与以状况,旨在认证在线报表设计器于报表用户之价所在。

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 有个别栽事列方式,代码如下

using System;
using System.Data;

namespace testData
{
    class Program
    {
        static void Main(string[] args)
        {
            DataSet ds1 = new DataSet();//无构造实例,不指定DataSetName
            Console.WriteLine(ds1.DataSetName);
            DataSet ds2 = new DataSet("MySet");//一个构造实例,指定DataSetName
            Console.WriteLine(ds2.DataSetName);
            Console.ReadKey();
        }
    }
}

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”);//指定表名

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的以。关于创建一个数额实行我们见面以高档部分解释。

– 免安装

风的桌面设计器在运用前,都如考虑设置环境的题材,比如操作系统、.NET
版本、Linux
中之文本权限、MAC中之系统版本等,这就是人情设计器往往会针对每种环境推出相应的设计器版本的来由。

导致设计器用户以当真的开始报表设计工作之前,往往以设置环节就算待消耗大量底光阴与生机。

若果在线设计器仅需用户通过浏览器即可使,无需外的装置或布步骤,也任需考虑系统遭到是不是在依靠之插件,打开计算机,即可使,让用户把精力以及岁月投入确实有价之报表工作!

 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
里面了,其实不是这样的?具体看高级部分

 

– 跨平台

冲不同之装置,如桌面电脑、平板计算机和手握紧设备,传统设计器需要直面不同装备终端发布不同之本,但在线设计器而为生的多平台支持,无需过多考虑平台特色,利用当前太风靡的HTML5技,在不同之平台达成

也用户提供几乎同一的宏图经验,而相对传统设计器,更无存在因效益升级要带的本子混乱问题。

5.归纳使用的CRUD(增删改查)

5.1新增 

俺们以DataRow中凡是生一个特性叫RowState
叫做行状态,行态主要有如下值:“UnChange”(无变化),“Added”(新增过后之数),“Modified”(修改之后的数额),“Deleted”
删除中的多寡,如下图,下图也面添加行数据的代码,断点调试。

透过上诉分析,我们会发现,添加的数码,并无付诸至外存上,只是程序临时存储的。那么我们怎么交也,看如下代码。

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);
            }
        }
    }
}

 

– 服务端自动保存

任由系统崩溃还是停电还见面招麻烦的工作白白浪费,但运用在线报表设计器,所有的劳作都保留于劳务器端,重新打开浏览器,登陆葡萄成表系统,即可恢复之前的干活。

与此同时,这无异风味还保证了用户无论以办公室还是以出差的中途,都能够连续自己的设计工作,而及时一切都是服务端自动保存,无需用户操作。

有些报表设计工作用差不多丁协调,在线设计之特性将这么的观改成具体,在线设计允许多个用户同时编制同一摆设表。

– 所展现即所得

风土的表设计器在形成规划后,需要不断的进展公布,在最终用户的浏览环境中查阅设计力量,效率非常放下。而在线报表设计器在计划时即可预览最终效果,随时修改设计,设计效率大大提高。

 

本着表用户之价值

– 系统集成商

对于系集成商来说,效率及履周期的是一个品种成败的首要,而在线报表设计器的多风味还能大幅度的加强型中标之或。

无论售前就需求原型,亦或者发布后改新增的需要,集成商都不过经过在线设计器快速验证用户要求,并特邀用户通过浏览器就是经常之确认,以便捷专业的响应措施获取最终用户认可,同时为大的下滑售前同售后成本,提高盈利!

– 最终用户

在线报表设计器以类OFFICE的界面风格及操作习惯,并巧妙地由此分类、向导、智能提醒等措施拿原只有专业人员才主宰的繁杂报表设计编程人人可用之简便工具,从而使实时响应工作需的改动成为可能。

– 报表开发人员

以线设计器的推出让报表的开发设计也进的协同工作的一代,相对于事先报表的功效、设计、美化工作只能按序完成,而且具备人的设计器版本还用联合,避免出现不等同的动静。

设若在线设计的特征使得这些工作的互成为可能,确定需要后,建立报表的为主框架,然后到由图画人员就UI设计,而开发人员可以小心让数据准备与集体,

最后用作用跟数统一,进行末段之揭晓。并且,所有这些干活儿无论需大家汇总,随时随地都只是完成,真正的增强了工作效率。

转载请注明来源:葡萄城报表

 

相关阅读:

在线报表设计实战系列

制作表格类报表
在线报表设计实战系列

矩表高级应用
在线报表设计实战系列

制作复杂表头报表