* 过去 |
最早接触DataTable是机房重构的时候,那时的datatable用于接收数据库返回的数据,当时的自己还在纠结,是要用datatable 还是泛型。现在想想,这些在好笑的同时又很感动,想想也是,过去所做的那些事情,正是自己现在可以依靠的东西。
这是之前我们使用datatable的方式,sqlHelper那部分,没有贴出来,如果有需要的小伙伴,可以留言,
public DataTable SelectByNewsId(string newsId)
{
DataTable dt = new DataTable();
string sql = "select * from comment where newsId =@newsId";
SqlParameter[] paras = new SqlParameter[]{
new SqlParameter ("@newsId",newsId)
};
dt = sqlhelper.ExecuteQuery(sql, paras, CommandType.Text);
return dt;
}
* 可以不访问数据库吗 |
我们处理一些逻辑,往往的操作是通过sql语句,直接返回我们想要的数据格式和内容,通过表的外链接,group by之类的,当然这也还可以。不过,有的时候,涉及到循环的逻辑,我们循环的对一个表进行操作,这就有些过分了吧,它的体验是很不友好的;有的时候,我们需要返回这样的一个属性,他是不存在与数据库中的字段,那么需要经过一些运算,将他计算出来,同时这个属性,也恰恰是前台我们要显示的,这是怎么操作呢?
方案一:我们仍直接操作数据库,数据库中既然不是么有那个字段吗?好的,我们添加一个,因为这个字段是其他两个字段运算得来的,那好,我们每次添加新的内容时可以先group by,然后再运算两个字段,将结果赋值。这里我们的操作实时插入和更新。
方案二:我们返回datatable ,对datable进行操作,这里涉及到,增加列,增加行,还有相关的赋值运算,这里强调一点是,对数据库只进行了一次操作,其余操作我们转移到了datatable 上。
* datatable操作 |
是一个临时保存数据的网格虚拟表,一个内存内关系数据的表,可以独立创建和使用。
3.1 datatable自定义 |
1.创建datatable
//创建一个空表
DataTable dt = new DataTable();
//创建一个名为"Table_New"的空表
DataTable dt = new DataTable("Table_New");
当然我们可以在一个datatable的基处上创建,这里仅创建表结构:
//创建一个空表
DataTable dt = new DataTable();
//克隆表结构
dt=mydata.Clone();
2.创建列
//1.1 创建空列
dt.Columns.Add("column0");
//1.2 创建空列
DataColumn dc = new DataColumn();
dt.Columns.Add(dc);
//2.创建带列名和类型名的列(两种方式任选其一)
dt.Columns.Add("column0", System.Type.GetType("System.String"));
dt.Columns.Add("column0", typeof(String));
3.创建行
//1.1创建空行
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
//1.2创建空行
dt.Rows.Add();
//2.1 对行赋值
dt.Rows.Add("张三",DateTime.Now);//Add里面参数的数据顺序要和dt中的列的顺序对应
//2.2 行赋值
DataRow dr = dt.NewRow();
dr("column0")="张三";
dr("column1")="男";
dt.Rows.Add(dr);//这里参数的顺序可以不与dt对应
//4.通过复制dt2表的某一行来创建
dt.Rows.Add(dt2.Rows[i].ItemArray);//两个表结构,要一致
提问:我们上面创建行的方式是:DataRow dr = dt.NewRow(); 那么这样可以吗? DataRow dr=new DataRow();[ ^1]1.
[ ^1]: DataRow dr = new DataRow()
4.删除行,列
//删除行
//使用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.Columns.Remove("列名");
dt.Columns.Remove("ColumnName");
3.2 datatable 排序 |
有的时候我们对于dataTable有一些特殊的操作,例如多次的排序,筛选,这里我们可以在sql中执行通过的语句,也可以用在这里。
1.筛选行
//选择column1列值为空的行的集合
DataRow[] drs = dt.Select("column1 is null");
//选择column0列值为"李四"的行的集合
DataRow[] drs = dt.Select("column0 = '李四'");
//筛选column0列值中有"张"的行的集合(模糊查询)
DataRow[] drs = dt.Select("column0 like '张%'");//如果的多条件筛选,可以加 and 或 or
//筛选column0列值中有"张"的行的集合并按column1降序排序
DataRow[] drs = dt.Select("column0 like '张%'", "column1 DESC");
2.自定义排序
//按照age列的升序排序
dt.DefaultView.Sort = "Age ASC";
dt = dt.DefaultView.ToTable();
* end |
对datatable的合理使用,可以提高处理速度和效率。我们也要在不断的使用中去发现它的更多优点,我们的最终目的是服务于项目,使客户满意,带来更棒的用户体验。
- 这种写法是不正确的,首先我们不明确dr的结构,这样去new的话是不是没有什么太大的意义,运行的时候回报错的,当然,如果你感到好奇或是心有疑虑可以试一下的。 ↩