一、DataTable简介
  (1)构造函数

名称 说明
DataTable()  不带参数初始化DataTable 类的新实例
DataTable(string tableName) 用指定的表名初始化DataTable 类的新实例
DataTable(string tableName, string tableNamespace)  用指定的表名和命名空间初始化DataTable类的新实例

  (2)常用属性

名称 说明
CaseSensitive 指示表中的字符串比较是否区分大小写
ChildRelations 获取此DataTable 的子关系的集合
Columns 获取属于该表的列的集合
Constraints 获取由该表维护的约束的集合
DataSet 获取此表所属的DataSet
DefaultView 获取可能包括筛选视图或游标位置的表的自定义视图
HasErrors 获取一个值,该值指示该表所属的DataSet 的任何表的任何行中是否有错误
MinimumCapacity 获取或设置该表最初的起始大小。该表中行的最初起始大小。默认值为50
Rows 获取属于该表的行的集合
TableName  获取或设置DataTable的名称

  (3)常用方法

名称 说明
AcceptChanges()  提交自上次调用AcceptChanges() 以来对该表进行的所有更改
BeginInit()  开始初始化在窗体上使用或由另一个组件使用的DataTable。初始化发生在运行时
Clear() 清除所有数据的DataTable
Clone() 克隆DataTable 的结构,包括所有DataTable 架构和约束
EndInit() 结束在窗体上使用或由另一个组件使用的DataTable 的初始化。初始化发生在运行时
ImportRow(DataRow row) 将DataRow 复制到DataTable 中,保留任何属性设置以及初始值和当前值
Merge(DataTable table) 将指定的DataTable 与当前的DataTable 合并
NewRow() 创建与该表具有相同架构的新DataRow

二、DataTable使用技巧

  (1)查找Select    

using System;
using System.Data;
using System.Text;namespace ConsoleApp
{class Program{static void Main(string[] args){DataTable dt = new DataTable("temp");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", "黄忠");SelectFun(dt);Console.ReadKey();}#region 遍历范例/// <summary>/// 遍历方式一/// </summary>/// <param name="dt"></param>static void TraversalFun1(DataTable dt){for (int i = 0; i < dt.Rows.Count; i++){Console.WriteLine("编号:{0};名称:{1}",dt.Rows[i]["Id"].ToString(),dt.Rows[i]["Name"].ToString());}}/// <summary>/// 遍历方式二/// </summary>/// <param name="dt"></param>static void TraversalFun2(DataTable dt){foreach (DataRow myRow in dt.Rows){Console.WriteLine("编号:{0};名称:{1}",myRow[0].ToString(),myRow[1].ToString());}}/// <summary>/// 遍历方式三/// </summary>/// <param name="dt"></param>static void TraversalFun3(DataTable dt){foreach (DataRow dr in dt.Rows){Console.WriteLine("编号:{0};名称:{1}",dr["Id"].ToString(),dr["Name"].ToString());}}/// <summary>/// 遍历方式四/// </summary>/// <param name="dt"></param>static void TraversalFun4(DataTable dt){StringBuilder msg = new StringBuilder();foreach (DataRow dr in dt.Rows){msg.Clear();foreach (DataColumn dc in dt.Columns){msg.AppendFormat("{0}:{1};", dc.ColumnName, dr[dc.ColumnName]);}Console.WriteLine(msg.ToString());}}#endregion#region 查找范例static void SelectFun(DataTable dt){//条件查询Console.WriteLine("条件查询示例语句:Id > 1 and Name <> '关羽'");Display(dt.Select("Id > 1 and Name <> '关羽'", "Id desc"));//like示例Console.WriteLine("like示例语句:Name like '关%");Display(dt.Select("Name like '关%'", "Id desc")); }static void Display(DataRow[] drArr){foreach (DataRow dr in drArr){Console.WriteLine(dr["Name"]);}}#endregion}
}

View Code

  (2)排序、聚合

using System;
using System.Data;namespace ConsoleApp
{class Program{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();}}
}

View Code

  (3)自增列

using System;
using System.Data;namespace ConsoleApp
{class Program{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;   //起始为1dc.AutoIncrementStep = 1;   //步长为1dc.AllowDBNull = false;     //不允许为空
dt.Columns.Add("Name", Type.GetType("System.String"));dt.Columns.Add("Age", typeof(Int32));       //注意要计算平均值要设置列类型为数字dt.Rows.Add(null, "刘备", 31);            //注意这次添加不用在手输Id了,但是要给个nulldt.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();}}
}

View Code

  (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。

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

using System;
using System.Data;namespace ConsoleApp
{class Program{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();}}
}

View Code

 

 

转载于:https://www.cnblogs.com/scmail81/p/9355112.html

C#操作DataTable类相关推荐

  1. .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑

    在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...

  2. oracleHelper 操作帮助类

    1 using System; 2 using System.Configuration; 3 using System.Data; 4 using System.Collections; 5 usi ...

  3. ASP.NET基础教程-DataTable类对象-属性方法和事件

    DataTable类对象可以表示表格,也可以在DataSet中存储多个DataTable对象. 该对象的属性方法和事件列表如下: 转载于:https://blog.51cto.com/chenxing ...

  4. C#(asp.net)对字符串的操作公共类(StringUtil.cs)

    C#(asp.net)对字符串的操作公共类(StringUtil.cs) 我们在做项目时会需要对字符串进行特殊处理,以下提供C#(asp.net)对字符串的操作公共类,直接复制以下代码到新建cs文件S ...

  5. C#--动态操作DataTable

    C#动态操作DataTable(新增行.列.查询行.列等) 方法一:动态创建一个DataTable ,并为其添加数据 public void CreateTable()         {       ...

  6. 【Android 逆向】Android 逆向通用工具开发 ( 静态库项目中的网络操作核心类 CNetwork 分析 )

    文章目录 一.adabingo 静态库项目中的网络操作核心类 CNetwork 分析 一.adabingo 静态库项目中的网络操作核心类 CNetwork 分析 CNetwork 相关方法分析 : 等 ...

  7. 线程间定制化调用通信—— 1 高内聚低耦合的前提下,线程操作资源类 2 判断/干活/通知 3 多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)

    生产者与消费者模式 一个生产者与一个消费者 题目:现在有两个线程,可以操作初始值为0的一个变量,实现一个线程对该变量加1,另一个线程对该变量减1,这两个线程的操作加一.减一交替,进行10轮,变量的初始 ...

  8. php高性能sqllite,简洁的PHP操作SQLite类

    原标题:简洁的PHP操作SQLite类 如果有文章推荐,或者你们要看什么的技术文章,请在留言处留言,感谢支持 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式 ...

  9. 封装SQLDMO操作的类

    封装SQLDMO操作的类,能完成常用的SQL Server 2000管理工作. 使用前请添加 "Microsoft SQLDMO Object Library" COM 引用. 有 ...

最新文章

  1. Android 修改Progressbar 旋转速度
  2. Tomcat在自定义xml文件中配置虚拟目录
  3. gan semi conductor
  4. MFC中快速应用OpenCV教程
  5. ant部署web工程模板
  6. (原創) 如何在Ubuntu上啟動ADSL連線? (OS) (Linux) (Ubuntu)
  7. mysql实现axure协同工作_Axure8利用Axure Share创建团队项目,进行多人协作开发
  8. 阿里巴巴JAVA开发手册最新版pdf
  9. 【活体人脸识别】FaceBagNet论文翻译详解
  10. 基站查询网址、软件、API接口汇总
  11. Pdfminer 分析
  12. python 炒股公式_计算股票公式
  13. 【Spring MVC 源码】MultipartResolver 的使用与解析
  14. 编译 LineageOS 源码,并重定义 kernel log
  15. 铁打的阿里,流水的美团,21届校招生Offer薪资曝光后,伤了老员工的心…
  16. CPU架构之ARM优化
  17. 实现基于D3.js的图形动态变化
  18. Vue.js实战第十章笔记
  19. 变量定义和声明的区别(整理)
  20. Spring之AOP系列--将方法上的注解做为切点(用@Around)

热门文章

  1. 网站布局工具的对比:Flexbox VS Susy
  2. uvm register model
  3. java Analyzer_Java实现使用IK Analyzer实现中文分词
  4. 【2019年05月07日】A股最便宜的股票
  5. 《JAVA 程序设计实验指导与习题测试》pdf 附下载链接
  6. python 项目:名片管理系统 之如何运用随机数生成一个名片系统
  7. 基于HFSS的天线设计流程
  8. linux pci 网卡驱动,linux网络设备驱动_pci网卡
  9. 体验windows server2008服务器操作系统
  10. 存储解决方案公司招聘