--- 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(); ```