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("", "刘备"); //添加行
dt.Rows.Add("", "关羽");
dt.Rows.Add("", "张飞");
dt.Rows.Add("", "赵云");
dt.Rows.Add("", "黄忠"); SelectFun(dt);
Console.ReadKey();
} #region 遍历范例
/// <summary>
/// 遍历方式一
/// </summary>
/// <param name="dt"></param>
static void TraversalFun1(DataTable dt)
{
for (int i = ; 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[].ToString(),
myRow[].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 }
}
(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("", "刘备", );
dt.Rows.Add("", "关羽", );
dt.Rows.Add("", "张飞", );
dt.Rows.Add("", "赵云", );
dt.Rows.Add("", "黄忠", ); 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)自增列
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
dc.AutoIncrementStep = ; //步长为1
dc.AllowDBNull = false; //不允许为空 dt.Columns.Add("Name", Type.GetType("System.String"));
dt.Columns.Add("Age", typeof(Int32)); //注意要计算平均值要设置列类型为数字
dt.Rows.Add(null, "刘备", ); //注意这次添加不用在手输Id了,但是要给个null
dt.Rows.Add(null, "关羽", );
dt.Rows.Add(null, "张飞", );
dt.Rows.Add(null, "赵云", );
dt.Rows.Add(null, "黄忠", ); 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。
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("撼地神牛", );
dt.Rows.Add("刘备", );
for (int i = ; i < dt.Rows.Count; i++)
{
if (dt.Rows[i]["Age"].ToString() == "")
{
//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();
}
}
}
C#操作DataTable类的更多相关文章
- .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑
在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...
- C#工具类:Json操作帮助类(转载)
原文转载自C#工具类:Json操作帮助类_IT技术小趣屋. Json序列化和反序列化在程序开发中时常会遇到,在C#中可以使用很多种方法实现对数据的Json序列化和反序列化,封装一个Json操作工具类来 ...
- 【转载】C#工具类:Json操作帮助类
Json序列化和反序列化在程序开发中时常会遇到,在C#中可以使用很多种方法实现对数据的Json序列化和反序列化,封装一个Json操作工具类来简化相应的操作,该工具类中包含以下功能:对象转JSON.数据 ...
- 【转载】微软官方提供的Sqlserver数据库操作帮助类SQLHelper类
在.NET平台中,C#语言一般使用ADO.NET组件来操作Sqlserver数据库,通过ADO.NET组件可以实现连接数据库.查询数据集.执行SQL语句以及关闭数据库连接等操作,为此网上有很多开发者自 ...
- oracleHelper 操作帮助类
using System; using System.Configuration; using System.Data; using System.Collections; using Oracle. ...
- XML格式示例 与 XML操作(读取)类封装
header('Content-Type: text/xml'); <?xml version="1.0" encoding="utf-8" standa ...
- 简洁的PHP操作SQLite类
SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了. ...
- 如何使用linq操作datatable进行分组
使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作, ...
- Java反射机制demo(六)—获得并操作一个类的属性
Java反射机制demo(六)—获得并操作一个类的属性 获得并操作一个类的属性?! 不可思议啊,一个类的属性一般都是私有成员变量啊,private修饰符啊! 但是毫无疑问,这些东西在Java的反射机制 ...
随机推荐
- Python 操作excel之 openpyxl模块
1. 安装 pip install openpyxl 想要在文件中插入图片文件,需要安装pillow,安装文件:PIL-fork-1.1.7.win-amd64-py2.7.exe · font(字体 ...
- Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟
事件,指的是网页中某个特定的交互时刻 一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发 但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件 这些事件和浏览器创建的事件 ...
- Java 利用枚举封装接口返回 JSON 结构
利用枚举封装返回码和返回信息 package com.template.project.util; public enum StatusCode { SUCCESS(20000, "成功&q ...
- Spring 通知和顾问进行增强
使用顾问增加前置增强和后置增强 <bean id="1" class="目标对象"></bean> <bean id=" ...
- git提示error setting certificate verify locations以及fatal: unable to access 的解决办法
z当使用git ------上传文件到GitHub上时!~~~出现了以下错误 :fatal: unable to access ' 可以采用以下解决方式: 修改GitHub上的地址格式=====ht ...
- 超声波手势识别(STM32四路超声波获取)
超声波手势识别在市场上已经有见实现,但研究其传感器发现并不是市场上随意可见的,如果暂且考虑成本,该如何入门实现简单的手势识别呢.聊天中老师给出一个很好的提议,就是固定四个超声波,分别为上下左右,然后进 ...
- ASP.NET Core 2.1中基于角色的授权
ASP.NET Core 2.1中基于角色的授权 授权是来描述用户能够做什么的过程.例如,只允许管理员用户可以在电脑上进行软件的安装以及卸载.而非管理员用户只能使用软件而不能进行软件的安装以及卸载.它 ...
- 比较 Spring AOP 与 AspectJ
本文翻译自博客Comparing Spring AOP and AspectJ(转载:https://juejin.im/post/5a695b3cf265da3e47449471) 介绍 如今有多个 ...
- Android--UI之ProgressBar
前言 开门见山,开篇明意.这篇博客主要讲解一下Android中ProgressBar控件以及间接继承它的两个子控件SeekBar.RatingBar的基本用法,因为其有继承关系,存在一些共有特性,所以 ...
- GitHub Gist 指南
Github作为代码分享平台在开发者中非常流行.此平台托管了包括游戏.书籍以至于字体在内的一千两百多万个项目(现在更多),这使其成为互联网上最大的代码库. Github还提供另一个非常有用的功能,就是 ...