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. 最新版AltiumDesignerSummer9下载+破解

    下载地址:ed2k://|file|AltiumDesignerSummer9Build9.3.1.19182.7z|1875307483|e65d364bf987fb5dcfb81c081a1562 ...

  2. Linux中C/C++头文件一览

    1.Linux中一些头文件的作用: #include <assert.h>       //ANSI C.提供断言,assert(表达式) #include <glib.h>  ...

  3. 《Programming WPF》翻译 第7章 2.图形

    原文:<Programming WPF>翻译 第7章 2.图形 图形时绘图的基础,代表用户界面树的元素.WPF支持多种不同的形状,并为它们每一个都提供了元素类型. 7.2.1基本图形类 在 ...

  4. ORA-3136报错

    当使用错误的用户名或密码登陆数据库时,会提示如下报错内容: bash-4.1$ sqlplus a/a@test SQL*Plus: Release 10.2.0.4.0 - Production o ...

  5. UML--核心元素之用例

    Use case 一个系统就是由各种各样的愿望组成的. 一个用例就是与参与者actor交互的,并且给参与者提供可观测的有意义的结果的一系列活动的集合. 例如你想做一顿饭吃,你需要完成煮饭和炒菜两件事情 ...

  6. July 【补题】

    A(zoj 3596) bfs,记忆搜都可以, 按余数来记录状态. B(zoj 3599) 博弈,跳过 C(zoj 3592) 简单dp,题意不好懂 D(zoj 3602) 子树哈希, 对根的左右儿子 ...

  7. ubuntu 16.04 Ubuntu 安装GDebi,从而安装deb文件

    其实在ubuntu直接双击deb文件就能安装,可是我现在装了ubuntu 16.04后,发现谷歌浏览器的deb和搜狗输入法的deb都不能直接双击安装,有点小问题. 但是安装GDebi软件后,直接在终端 ...

  8. windows-JDK环境变量设置

    JAVA_HOME=C:\Program Files\Java\jdk1.6.0_43;CLASS_PATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;p ...

  9. [HeadFirst-HTMLCSS学习笔记][第十三章表格]

    表格 -table 块 tr 行 table row th 表头 table head td 表数据 table data; caption 表格标题 <table> <captio ...

  10. 面试前的准备---C#知识点回顾----02

    经过昨天大量的简历投递,今天陆续收到面试邀约,明日准备大战一场,是死是活一试便知 1.数据库的范式 这算入门问题了吧,但凡是个数据库类的,都得问吧, 但我们在回答的时候开始背书啦 第一范式(1NF)无 ...