C# DataTable用法

介绍

是一个临时保存数据的网格虚拟表,表示内存中数据的一个表,是一个二维表,也是一个后台数据源和前台显示之间的适配器

包:System.Data

创建对象

创建一个没有名子的空表

DataTable   dt   =   new   DataTable();

创建一个名为 user 的空表

DataTable   dt   =   new   DataTable("user");

添加列

创建对象后,要添加列

方式一

仅指定列名

DataColumn dc = dt.Columns.Add("name");

方式二

指定列名、类型

DataColumn dc = dt.Columns.Add("ID",Type.GetType("System.Int32"));

方式三

通过添加 DataColumn 方式实现:

// 创建table的第一列 
DataColumn priceColumn =new DataColumn();
// 添加到表中
table.Columns.Add(priceColumn);
//列名称
priceColumn.ColumnName ="price";
//该列的数据类型
priceColumn.DataType = System.Type.GetType("System.Decimal");

或者

DataColumn column = new DataColumn("列名", typeof(数据类型));

常用列属性(DataColumn)

添加列时可通过 DataColumn 的属性自定义列行为,常用属性如下:

属性名 说明
ColumnName 列的名称(唯一标识,不可重复)。
DataType 列的数据类型(如 typeof(int)、typeof(string) 等)。
AllowDBNull 是否允许为空值(默认 true)。
DefaultValue 列的默认值(新增行时自动填充)。
Unique 列的值是否唯一(默认 false,设置为 true 时不允许重复值)。
AutoIncrement 是否自动递增(适合主键,默认 false)。
AutoIncrementSeed 自动递增的起始值(配合 AutoIncrement 使用)。
AutoIncrementStep 自动递增的步长(默认 1)。
Caption 列的显示标题(用于 UI 展示,与 ColumnName 区分)。
dc.DefaultValue =50;//该列得默认值 
dc.AutoIncrement =true;//自动增加 
dc.AutoIncrementSeed =1;//起始为1 
dc.AutoIncrementStep =1;//步长为1 
dc.AllowDBNull =false;

支持的数据类型

DataColumn 支持的常见数据类型对应 C# 类型如下:

C# 类型/关键字 说明
string 字符串类型
int/Int32 32位整数
long/Int64 64位整数
decimal 高精度小数(适合金额)
double 双精度浮点数
float 单精度浮点数
bool 布尔值(true/false)
DateTime 日期时间类型
byte[] 二进制数据(如图片、文件)

修改列名

1. 通过列名获取列并修改
dt.Columns["StuID"].ColumnName = "学号";
2. 通过索引获取列并修改(索引从 0 开始)
dt.Columns[1].ColumnName = "姓名";

修改列类型

不支持修改列类型,只能先删除列,再创建列

删除列

dt.Columns.Remove("ID");

添加数据

方式一

添加数组方式

tblDatas.Rows.Add(new object[] { "a", "b", "c" });

方式二

创建 DataRow 对象方式

DataRow   dr   =   dt.NewRow();
dt.Rows.Add(dr); // 必须有此行代码,否则没有行记录

根据列索引指定值

dr[0] = "1";
dr[1] = "张三";

方式三:根据列名赋值

创建 DataTable 并定义列(先有结构才能加数据)

DataTable dt = new DataTable("学生表");
dt.Columns.Add("学号", typeof(int));
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("年龄", typeof(int));
dt.Columns.Add("入学日期", typeof(DateTime));

通过列名赋值:

// 创建行
DataRow row = dt.NewRow();
// 将行添加到表中
dt.Rows.Add(row);

row["学号"] = 1001;       // 通过列名赋值
row["姓名"] = "张三";
row["年龄"] = 20;
row["入学日期"] = new DateTime(2023, 9, 1);

修改数据

dt.Rows[0]["字段名"] = "测试"

删除行

方式一

删除 DataRow 对象

dt.Rows.Remove(dt.Rows[0]);

方式二

删除行索引

//使用DataTable.Rows.RemoveAt(index)方法
dt.Rows.RemoveAt(0);

方式三

//使用DataRow.Delete()方法
dt.Row[0].Delete();

遍历行

for(int i = 0 ; i < dt.Rows.Count ; i++)     
{     
   string strName = dt.Rows[i]["字段名"].ToString();     
}
foreach(DataRow dr in dt.Rows)        
{        
     object value = dr["ColumnsName"];        
}

遍历列

foreach(DataRow dr in dt.Rows)        
{      
   for(int i=0;i<dt.Columns.Count;i++)      
   {      
        dr[i];      
   }        
}

筛选

筛选DataTable中的数据,使用 Select() 方法

  • Select(string):获取由与筛选条件匹配的所有 DataRow 对象组成的数组。
  • Select(string,string):以指定排序顺序,获取由与筛选条件匹配的所有 DataRow 对象组成的数组。

返回值:Select 方法返回 DataRow 对象数组。 Select 接受筛选表达式、排序表达式。

DataRow[] drArr = dt.Select("C1='abc'");//查询(如果Select内无条件,就是查询所有的数据)

//还可以这样操作:
DataRow[] drArr1 = dt.Select("C1 LIKE 'abc%'");//模糊查询(如果的多条件筛选,可以加 and 或 or )
//选择column1列值为空的行的集合
DataRow[] drs = dt.Select("column1 is null");

DataRow[] drArr2 = dt.Select("'abc' LIKE C1 + '%'", "C2 DESC");//另一种模糊查询的方法
DataRow[] drArr3 = dt.Select("C1='abc'", "C2 DESC");//排序

表格复制

克隆表,只是复制了表结构,不包括数据

DataTable dtNew = new DataTable();
dtNew = dt.Clone();

复制表,同时复制了表结构和表中的数据

DataTable dtNew = new DataTable();
dtNew = dt.Copy();
dtNew.Clear()  //清空数据
dtNew.Rows.Clear();//清空表数据
dtNew.ImportRow(dt.Rows[0]);//将DataRow复制到DataTable中,保留任何属性设置以及初始值和当前值

参考:
https://www.cnblogs.com/wordgao/p/4928150.html
https://blog.csdn.net/qq_43246722/article/details/126749418