XiaodaBlogSource/source/_posts/C# DataTable.md
2023-01-14 14:43:43 +08:00

116 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: C# DataTable
date: 2021-03-23 10:30:31
author: 文永达
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg
---
# C# DataTable
## 基础概念
表示一个内存内关系数据的表,如同关系型数据库中的表
## 创建 DataTable
```c#
//引用命名空间
using System.Data;
//创建一个空表,
DataTable dt = new DataTable();
//创建一个名为"Table_New"的空表
DataTable dt = new DataTable("Table_New");
```
## 列 DataColumn
- DataColumn 定义每列的数据类型来确定表的架构
- DataTable中的列可以映射到数据源中的列、包含从表达式计算所得的值、自动递增它们的值或包含主键值
- DataColumn的DataType属性可限制该列的数据类型为整数、字符串或十进制数等但必须将数据类型与数据源中的数据类型匹配。
```shell
//1.创建空列
DataColumn dc = new DataColumn();
dt.Columns.Add(dc);
//2. 提供列名,并对列属性进行设置
DataTable workTable = new DataTable("Customers");
//带列名和类型名
DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));
// 对进行属性设置
workCol.AllowDBNull = false; //列的属性设置为不允许 DBNull 值
workCol.Unique = true; //值约束为唯一
workColumn.AutoIncrement = true; //在表中添加新行时自动递增
workColumn.AutoIncrementSeed = 200; //从值 200 开始并以 3 为增量递增的列
workColumn.AutoIncrementStep = 3;
column.DefaultValue = 25;
// 定义主键:唯一地标识表中的每一行
workTable.PrimaryKey = new DataColumn[] {workTable.Columns["CustID"]};
// Or
DataColumn[] columns = new DataColumn[1];
columns[0] = workTable.Columns["CustID"];
workTable.PrimaryKey = columns;
// 创建表达式列:能够包含根据 同一行 中其他列值或根据表中 多行 的列值计算而得的值
//比如 表达式类型 示例
// 比较 “总计 >= 500”
// 计算 "UnitPrice * Quantity"
// 聚合 Sum(Price)
workTable.Columns.Add("Total", typeof(Double));
workTable.Columns.Add("SalesTax", typeof(Double), "Total * 0.086");
```
## 复制DataTable
```c#
objectTable = sourceTable .Copy();//深复制包含DataRow
objectTable = sourceTable .Clone();//浅复制,只复制架构
```
## 复制 DataRow
### ImportDataRow方法
```c#
public void ImportDataRow( DataRow DataRow);
objectTable = sourceTable.clone();//必须先复制表的架构,使具有相同的的列或关系!
foreach (DataRow oRow in sourceTable)
{
objectTable.ImportDataRow(oRow);//在objectTable中添加一个新行并将sourceRow的值复制进去,要求表的结构一样!
}
```
### 自定义复制
```c#
objectTable.Columns.Add ("id");//不需要有一样的架构,只复制自己需要的列!
Object[] myArry = new Object[1];
foreach (DataRow oRow in sourceTable.Rows)
{
tempRow = objectTable.NewRow();//此方法必须调用!
myArry[0] = oRow["id"];//如果myArry中没有源表中的id列的话就会报错
tempRow.ItemArray = myArry;//ItemArray属性为Object类型数组,根据程序的需要需要可自行复制多个列的数据!
objectTable.Rows.Add(tempRow); //此方法必须调用否则DataRow中的数据将不能显示!
}
```
### LoadDataRow方法
```c#
public DataRow LoadDataRow(Object[] values,bool fAcceptChanges);
Object[] newRow = new Object[3];
// 设置对象数组的值
newRow[0] = "Hello";
newRow[1] = "World";
newRow[2] = "two";
DataRow myRow;
ObjectTable.BeginLoadData();
// 将新行添加到表中
myRow = ObjectTable.LoadDataRow(newRow, true);//标志要设置为true,表示添加新行
ObjectTable.EndLoadData();
```