C#操作DataTable类
一、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类相关推荐
- .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑
在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...
- oracleHelper 操作帮助类
1 using System; 2 using System.Configuration; 3 using System.Data; 4 using System.Collections; 5 usi ...
- ASP.NET基础教程-DataTable类对象-属性方法和事件
DataTable类对象可以表示表格,也可以在DataSet中存储多个DataTable对象. 该对象的属性方法和事件列表如下: 转载于:https://blog.51cto.com/chenxing ...
- C#(asp.net)对字符串的操作公共类(StringUtil.cs)
C#(asp.net)对字符串的操作公共类(StringUtil.cs) 我们在做项目时会需要对字符串进行特殊处理,以下提供C#(asp.net)对字符串的操作公共类,直接复制以下代码到新建cs文件S ...
- C#--动态操作DataTable
C#动态操作DataTable(新增行.列.查询行.列等) 方法一:动态创建一个DataTable ,并为其添加数据 public void CreateTable() { ...
- 【Android 逆向】Android 逆向通用工具开发 ( 静态库项目中的网络操作核心类 CNetwork 分析 )
文章目录 一.adabingo 静态库项目中的网络操作核心类 CNetwork 分析 一.adabingo 静态库项目中的网络操作核心类 CNetwork 分析 CNetwork 相关方法分析 : 等 ...
- 线程间定制化调用通信—— 1 高内聚低耦合的前提下,线程操作资源类 2 判断/干活/通知 3 多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)
生产者与消费者模式 一个生产者与一个消费者 题目:现在有两个线程,可以操作初始值为0的一个变量,实现一个线程对该变量加1,另一个线程对该变量减1,这两个线程的操作加一.减一交替,进行10轮,变量的初始 ...
- php高性能sqllite,简洁的PHP操作SQLite类
原标题:简洁的PHP操作SQLite类 如果有文章推荐,或者你们要看什么的技术文章,请在留言处留言,感谢支持 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式 ...
- 封装SQLDMO操作的类
封装SQLDMO操作的类,能完成常用的SQL Server 2000管理工作. 使用前请添加 "Microsoft SQLDMO Object Library" COM 引用. 有 ...
最新文章
- Android 修改Progressbar 旋转速度
- Tomcat在自定义xml文件中配置虚拟目录
- gan semi conductor
- MFC中快速应用OpenCV教程
- ant部署web工程模板
- (原創) 如何在Ubuntu上啟動ADSL連線? (OS) (Linux) (Ubuntu)
- mysql实现axure协同工作_Axure8利用Axure Share创建团队项目,进行多人协作开发
- 阿里巴巴JAVA开发手册最新版pdf
- 【活体人脸识别】FaceBagNet论文翻译详解
- 基站查询网址、软件、API接口汇总
- Pdfminer 分析
- python 炒股公式_计算股票公式
- 【Spring MVC 源码】MultipartResolver 的使用与解析
- 编译 LineageOS 源码,并重定义 kernel log
- 铁打的阿里,流水的美团,21届校招生Offer薪资曝光后,伤了老员工的心…
- CPU架构之ARM优化
- 实现基于D3.js的图形动态变化
- Vue.js实战第十章笔记
- 变量定义和声明的区别(整理)
- Spring之AOP系列--将方法上的注解做为切点(用@Around)