▪ 添加引用
using System.Data;
▪ 创建表
// 方法一:创建一个空表
DataTable dt = new DataTable();
// 方法二:创建一个名为"admin"的空表
DataTable dt = new DataTable("admin");
▪ 创建列
// 方法一:创建空列
DataColumn dc = new DataColumn();
dt.Columns.Add(dc);
// 方法二:创建带列名和类型名的列
dt.Columns.Add("password", typeof(String));
dt.Columns.Add("username", System.Type.GetType("System.String"));
// 方法三:通过 DataColumn 对象添加列
DataColumn dc = new DataColumn("update_time", typeof(DateTime));
dt.Columns.Add(dc);
DataColumn dc = new DataColumn("insert_time", System.Type.GetType("System.DateTime"));
dt.Columns.Add(dc);
▪ 创建行
// 初始化
DataTable dt = new DataTable();
dt.Columns.Add("insert_time", typeof(DateTime));
dt.Columns.Add("udpate_time", typeof(DateTime));
// 方法一:创建空行
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
// 方法二:创建空行
dt.Rows.Add();
// 方法三:通过行框架创建并赋值
// Add 里面参数的数据顺序要和 dt 中的列的顺序对应
dt.Rows.Add("insert_time", DateTime.Now);
dt.Rows.Add("update_time", DateTime.Now);
// 方法四:通过复制 dt2 表的某一行来创建
dt.Rows.Add(dt2.Rows[i].ItemArray);
▪ 赋值和取值
// 初始化
DataTable dt = new DataTable();
// 新建行的赋值
DataRow dr = dt.NewRow();
dr[0] = "admin"; // 通过索引赋值
dr["insert_time"] = DateTime.Now; // 通过名称赋值
// 对表已有行进行赋值
dt.Rows[0][0] = "admin"; // 通过索引赋值
dt.Rows[0]["insert_time"] = DateTime.Now; // 通过名称赋值
// 取值
string name = dt.Rows[0][0].ToString();
string time = dt.Rows[0]["insert_time"].ToString();
▪ 筛选行
// 初始化
DataTable dt = new DataTable();
...
// 选择 username 列值为空的行的集合
DataRow[] drs = dt.Select("username is null");
// 选择 username 列值为"李四"的行的集合
DataRow[] drs = dt.Select("username = '李四'");
// 筛选 username 列值中有"张"的行的集合(模糊查询)
DataRow[] drs = dt.Select("username like '张%'");
// 筛选 username 列值中有"张"的行的集合并按 admin_id 降序排序
DataRow[] drs = dt.Select("username like '张%'", "admin_id DESC");
▪ 删除行
// 初始化
DataTable dt = new DataTable();
...
// 使用 DataTable.Rows.Remove(DataRow) 方法
dt.Rows.Remove(dt.Rows[0]);
// 使用 DataTable.Rows.RemoveAt(index) 方法
dt.Rows.RemoveAt(0);
// 使用 DataRow.Delete() 方法
dt.Row[0].Delete();
dt.AcceptChanges();
// 如果要删除DataTable中的多行,应该采用倒序循环 DataTable.Rows
// 而且不能用 foreach 进行循环删除,因为正序删除时索引会发生变化,程式发生异常,很难预料后果。
for( int i = dt.Rows.Count - 1; i >= 0; i-- ){
dt.Rows.RemoveAt(i);
}
xx.Rows.Remove() 和 xx.Rows.RemoveAt() 方法是直接删除
xx.Row[0].Delete()方法只是将该行标记为 deleted,但是还存在,还可 DataTable.RejectChanges() 回滚,使该行取消删除。
用 xx.Rows.Count 来获取行数时,还是删除之前的行数,需要使用 DataTable.AcceptChanges() 方法来提交修改。
▪ 复制表
// 初始化
DataTable dt = new DataTable();
...
// 复制表
// 同时复制了表结构和表中的数据
DataTable dtNew = new DataTable();
dtNew = dt.Copy();
// 复制表
DataTable dtNew = dt.Copy(); // 复制 dt 表数据结构
dtNew.Clear(); // 清空数据
for( int i = 0; i < dt.Rows.Count; i++ ){
if( ... ){
dtNew.Rows.Add(dt.Rows[i].ItemArray); // 添加数据行
}
}
// 克隆表
// 只是复制了表结构,不包括数据
DataTable dtNew = new DataTable();
dtNew = dt.Clone();
// 如果只需要某个表中的某一行
DataTable dtNew = new DataTable();
dtNew = dt.Copy();
dtNew.Rows.Clear(); // 清空表数据
dtNew.ImportRow(dt.Rows[0]); // 这是加入的是第一行
▪ 表排序
DataTable dt = new DataTable(); // 创建表
dt.Columns.Add("id", typeof(Int32)); // 添加列
dt.Columns.Add("age", typeof(Int32));
dt.Columns.Add("name", typeof(String));
dt.Rows.Add(new object[]{1, 20, "张三"}); // 添加行
dt.Rows.Add(new object[]{2, 25, "李四"});
dt.Rows.Add(new object[]{3, 30, "王五"});
DataView dv = dt.DefaultView; // 获取表视图
dv.Sort = "id DESC"; // 按照ID倒序排序
dv.ToTable(); // 转为表