DataTable类

DataTable是一个使用非常多的类,记得我在刚刚开始学习.Net的时候就已经了解并用过这个类,但如今再来看看,才发现这个类非常之复杂,复杂表现在哪些地方呢?主要是这个类与其他很多类都有关联,也就是说,你要玩透DataTable这个类,你必须要了解很多其他的类。

  DataTable是一个很古老的类,再往前不清楚,但是.Net2.0就肯定有了。主要用于数据的封装与存储等等。这个类,你要是在公司里工作,必定会用到,无论是维护旧系统或是使用一些老框架都会用到,必须要熟悉常用的操作。

  下面给出一些DataTable的常用操作,

  1、查找Select

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Id");           //添加列
            dt.Columns.Add("Name");
            dt.Rows.Add("1", "刘备");       //添加行
            dt.Rows.Add("2", "关羽");
            dt.Rows.Add("3", "张飞");
            dt.Rows.Add("4", "赵云");
            dt.Rows.Add("5", "黄忠");

            DataRow[] drArr = dt.Select("Id > 1 and Name <> ‘关羽‘" ,"Id desc");    //条件支持and or like与SQL语句类似
            //DataRow[] drArr2 = dt.Select("Name like ‘关%‘", "Id desc");    //like示例
            foreach(DataRow dr in drArr)
            {
                Console.WriteLine(dr["Name"]);  //输出 黄忠 赵云 张飞
            }

            Console.ReadKey();
        }

  2、排序、聚合:

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Id");
            dt.Columns.Add("Name");
            dt.Columns.Add("Age", typeof(Int32));       //注意要计算平均值要设置列类型为数字
            dt.Rows.Add("1", "刘备", 31);
            dt.Rows.Add("2", "关羽", 29);
            dt.Rows.Add("3", "张飞", 28);
            dt.Rows.Add("4", "赵云", 27);
            dt.Rows.Add("5", "黄忠", 50);

            dt.DefaultView.Sort = "Age DESC";           //排序
            dt = dt.DefaultView.ToTable();

            foreach (DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr["Name"]);
            }

            object obj = dt.Compute("Count(Id)", "Age>26");     //输出3 查询年龄大于26的人数
            Console.WriteLine(obj.ToString());

            object obj2 = dt.Compute("Avg(Age)", "true");     //输出33 查询所有人的平均年龄(要设置列为整型,否则不能计算)
            Console.WriteLine(obj2.ToString());

            object obj3 = dt.Compute("Sum(Age)", "true");     //输出165
            Console.WriteLine(obj3.ToString());

            Console.ReadKey();
        }

  3、自增列

       static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            DataColumn dc = dt.Columns.Add("Id", Type.GetType("System.Int32"));
            dc.AutoIncrement = true;    //自动增加
            dc.AutoIncrementSeed = 1;   //起始为1
            dc.AutoIncrementStep = 1;   //步长为1
            dc.AllowDBNull = false;     //不允许为空

            dt.Columns.Add("Name", Type.GetType("System.String"));
            dt.Columns.Add("Age", typeof(Int32));       //注意要计算平均值要设置列类型为数字
            dt.Rows.Add(null,"刘备", 31);            //注意这次添加不用在手输Id了,但是要给个null
            dt.Rows.Add(null,"关羽", 29);
            dt.Rows.Add(null,"张飞", 28);
            dt.Rows.Add(null,"赵云", 27);
            dt.Rows.Add(null, "黄忠", 50);

            foreach (DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr["Id"]);    //输出1 2 3 4 5
            }

            Console.ReadKey();
        }

  4、System.DBNull

  null在.Net中表示无效的对象引用。 即空对象。

  DBNull是一个类(System.DBNull)。这个类直接继承于Object,它只有继承下来的属性与方法,只有一个自己的字段value。表示它自己。指数据库中数据为空(NULL)时,在.Net中的值。DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对象是指向有效的对象。

  但是为什么 DBNull 可以表示数据库中的字符串,数字,或日期呢?原因是.Net储存这些数据的类(DataRow等)都是以 object 的形式来储存数据的。

  对于 DataRow , 它的 row["column"] 返回的值永远不为null , 要么就是具体的为column的类型的值。要么就是DBNull 。 所以 row[column].ToString() 这个写法永远不会在ToString那里发生NullReferenceException,但有可能抛下标越界的异常。

  DBNull 实现了 IConvertible 。 但是,除了 ToString 是正常的外,其他的ToXXX都会抛出不能转换的错误。

  在 IDbCommand(OleDbCommand,SqlCommand...) 的ExecuteScalar的返回值中,情况可以这样分析:

SELECT 1     --这样返回的object是1。
SELECT null --这样返回的是DBNull.Value。

  示例,假设在DataSet中我设置了一个int类型,但是在显示的时候,我想让为0的地方显示为空白该怎么实现呢?

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Name", typeof(String));
            dt.Columns.Add("Age",typeof(Int32));
            dt.Rows.Add("撼地神牛",0);
            dt.Rows.Add("刘备", 21);
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i]["Age"].ToString() == "0")
                {
                    //dt.Rows[i]["Age"] = null;     这样写会提示如下错误:不能将 Column“Age”设置为 null。请改用 DBNull。
                    dt.Rows[i]["Age"] = DBNull.Value;
                }
                Console.WriteLine(dt.Rows[i]["Name"] + ":" + dt.Rows[i]["Age"]);
            }

            Console.ReadKey();
        }

  这样本来显示为0的地方就实现为空白了:

  

DataTable类

时间: 2024-11-12 08:05:31

DataTable类的相关文章

DataTable 类

DataTable 类表示一个内存中数据表. 一.DataTable简介 (1)构造函数 DataTable() 不带参数初始化DataTable 类的新实例. DataTable(string tableName) 用指定的表名初始化DataTable 类的新实例. DataTable(string tableName, string tableNamespace) 用指定的表名和命名空间初始化DataTable 类的新实例. (2) 常用属性 CaseSensitive 指示表中的字符串比较

C#操作DataTable类

一.DataTable简介 (1)构造函数 DataTable()  不带参数初始化DataTable 类的新实例 DataTable(string tableName) 用指定的表名初始化DataTable 类的新实例 DataTable(string tableName, string tableNamespace)  用指定的表名和命名空间初始化DataTable类的新实例 (2)常用属性 CaseSensitive 指示表中的字符串比较是否区分大小写 ChildRelations 获取此

【WinForm】杂记(6):C#之DataTable类(总结)

内容列表 属性 获取行列数 方法 添加列 添加行 删除行列 获取列名 获取列类型 更改列名 获取单元格数值 写入数值到单元格 其它 转置 将一张表的某列添加到另一张表 将一张表的某行添加到另一张表 属性 获取行列数 int numOfRows = dt.Rows.Count; int numOfCols = dt.Columns.Count; 方法 添加列 dt.Columns.Add("Name", typeof(string)).SetOrdinal(0);//to the fir

深入详解DataTable

在学习DataTable知识之前,我们有必要了解下ADO.NET.以下摘自MSDN: ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XML 公开的数据源提供一致的访问.数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索.处理和更新所包含的数据.ADO.NET 通过数据处理将数据访问分解为多个可以单独使用或一前一后使用的不连续组件.ADO.NET 包含用于连接到数据库.执行命令和检索结果的 .NET Frame

C# DataTable的詳細用法

转载别人的转载,原作者都不知道了 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简介 (1)构造函数           DataTable()   不带参数初始化DataTable 类的新实例.           DataTable(string tableName)  用指定的表名初始化DataTable 类的新实例.           

C# DataTable详细用法

通过经常使用的项目中的DataTable,假设DataTable使用得当.不仅能使程序简洁有用.并且可以提高性能,达到事半功倍的效果.现对DataTable的使用技巧进行一下总结. 一.DataTable简单介绍 (1)构造函数 DataTable()   不带參数初始化DataTable 类的新实例. DataTable(string tableName)  用指定的表名初始化DataTable 类的新实例. DataTable(string tableName, string tableNa

C# DataSet与DataTable的区别和用法

DataSet是数据集,DataTable是数据表,DataSet存储多个DataTable.DataSet和DataTable像是专门存储数据的一个容器,在你查询数据库得到一些结果时可以存在里面. DataSet功能强大有浏览.排序.搜索.过滤.处理分级数据.缓存更改等功能,还可以与XML数据互换.DataSet中可包括多个DataTable,可将多个查询结构存到一个DataSet中,方便操作 ADO.NET开发人员为方便数据处理开发出来的,是数据的集合,为解决DataReader的缺陷设计的

C# DataTable的详细用法[转]

原文链接 1.新建表   private DataTable vsDt =new DataTable(); 2.清空表中内容(表中的列还在)  vsDt.Clear(); 3.清空表中的列   vsDt.Columns.Clear(); 4.表中添加列 vsDt.Columns.Add("BH", typeof(string)); vsDt.Columns.Add("RQ", typeof(string)); 5.表中添加空行 DataRow vsDr = vsDt

jquery datatable 常用例子

在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTable简介 (1)构造函数           DataTable()   不带参数初始化DataTable 类的新实例.           DataTable(string tableName)  用指定的表名初始化DataTable 类的新实例.           DataTable(string