zoukankan      html  css  js  c++  java
  • 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的地方就实现为空白了:

      

  • 相关阅读:
    moment.js常用时间示例,时间管理
    RabbitMQ用户增删及权限控制
    CDN概念基本介绍
    在LinkedIn的 Kafka 生态系统
    发行说明
    Kafka 1.0版本发布
    redis应用场景及实例
    Redis哨兵集群
    redis-订阅与发布
    redis事务
  • 原文地址:https://www.cnblogs.com/mingxuantongxue/p/3791049.html
Copyright © 2011-2022 走看看