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类的更多相关文章

  1. C#操作DataTable类

    一.DataTable简介 (1)构造函数 名称 说明 DataTable()  不带参数初始化DataTable 类的新实例 DataTable(string tableName) 用指定的表名初始 ...

  2. 【转载】C#的DataTable类Clone及Copy方法的区别

    在C#中的Datatable类中,Clone方法和Copy方法都可以用来复制当前的DataTable对象,但DataTable类中的Clone方法和Copy方法还是有区别的,Clone方法只复制结构信 ...

  3. ADO.NET中DataTable类的使用

    DataTable类将关系数据表示为表格形式.在创建DataTable之前,必须包含System.Data名称空间.ADO.NET提供了一个DataTable类来独立创建和使用数据表.它也可以和Dat ...

  4. C#使用DataSet类、DataTable类、DataRow类、OleDbConnection类、OleDbDataAdapter类编写简单数据库应用

    //注意:请使用VS2010打开以下的源代码. //源代码地址:http://pan.baidu.com/s/1j9WVR using System; using System.Collections ...

  5. NPOI将xls文件解析为DataTable类数据

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  6. C# DataTable的詳細用法

    转载别人的转载,原作者都不知道了 在项目中经常用到DataTable,如果DataTable使用得当,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一 ...

  7. 深入详解DataTable

    在学习DataTable知识之前,我们有必要了解下ADO.NET.以下摘自MSDN: ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XM ...

  8. DataTable详解,以及dataview

    原文地址:http://www.cnblogs.com/moss_tan_jun/archive/2010/09/20/1832131.html 得到DataTable 得到DataTable有许多方 ...

  9. DataTable使用技巧总结【转】

    一.DataTable简介 ()构造函数 DataTable() 不带参数初始化DataTable 类的新实例. DataTable(string tableName) 用指定的表名初始化DataTa ...

随机推荐

  1. Unix 主机认证配置

    A机用户: ssh-keygen -t rsa ssh-keygen -t dsa cd .ssh cat *.pub >>authorized_keys  ---注意一定要追加,不然会覆 ...

  2. 2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数

    最小公倍数(lcm.c/.cpp/.pas) 题目描述 给定两个正整数,求他们的最小公倍数. 样例输入 28 12 样例输出 84 数据范围 对于40%数据:1<=a,b<=10^9 对于 ...

  3. MVC中使用EF(1):为ASP.NET MVC程序创建Entity Framework数据模型

    为ASP.NET MVC程序创建Entity Framework数据模型 (1 of 10) By  Tom Dykstra |July 30, 2013 Translated by litdwg   ...

  4. RAID,mdadm(笔记)

    RAID: 级别:仅代表磁盘组织方式不同,没有上下之分:0: 条带    性能提升: 读,写    冗余能力(容错能力): 无    空间利用率:nS    至少2块盘1: 镜像    性能表现:写性 ...

  5. 常用的Eclipse快捷键

    alt+shift+r 修改名字 ctrl+shift+r 查找源类 Eclipse快捷键功能1. [ALT+/]   --->提示此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不 ...

  6. 炉石传说__multiset

     炉石传说  Problem Description GG学长虽然并不打炉石传说,但是由于题面需要他便学会了打炉石传说.但是传统的炉石传说对于刚入门的GG学长来说有点复杂,所以他决定自己开发一个简化版 ...

  7. servlet获得完整路径

    request.getQueryString() request.getParameterMap() request.getParameterNames() 在servlet中GET请求可以通过Htt ...

  8. Firebase远程更新应用

    能打造出色的应用不意味着一定能在商业上取得成功,两者之间还有许多工作要做,绝不能简单发布应用后就宣告“收工”.您需要能迅速根据用户反馈作出调整.测试新功能,以及向用户提供他们最关注的内容. Fireb ...

  9. openssl 对称加密算法enc命令详解

    1.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用. openss ...

  10. Oracle自治事务

    定        义: Autonomous transactions are independent transactions that can be called from within anot ...