小Q的博客

  • 首页
  • net编程
    • 产品和框架
    • 开发实例
    • 经验技巧
    • 开源组件
  • wp独立站
  • 自媒体
  • 日记本
  • 工具箱
每个程序员,都应该有一个自己的博客站
  1. 首页
  2. net编程
  3. 经验技巧
  4. 正文

net中c#教程 DataTable的常用操作

2022年10月7日 2048点热度 0人点赞 0条评论

提起DataTable这个对象,可能工作1-2年的小伙伴都不知道,它其实是ado.net时代的产物,用于连接数据库返回列表数据,因为现在都用ORM框架,DataTable用得越来越少。不过,它其实还是很用的,今天分享下它的一些常用操作

Table of Contents

Toggle
  • 1、DataTable转List<T>
  • 2、List<T>转DataTable
  • 3、字符串快速生成DataTable
  • 4、实现DataTable的分组
  • 5、四则运算
  • 6、DataSet和字符串互转
  • 7、DataRow[]生成DataTable
  • 8,DataColumn也可以自增量

1、DataTable转List<T>

DataTable属于弱类型对象,虽然适用性很强,但不能用Linq。因此需要把它转成List<T>,Linq操作的性能要好得多,也方便。推荐使用

//1,DataTable转List<T>
DataTable dt1 = new DataTable();
dt1.Columns.Add("id", typeof(int));
dt1.Columns.Add("name", typeof(string));
dt1.Columns.Add("ctime", typeof(DateTime));
for (int i = 1; i <= 20; i++)
{
    dt1.Rows.Add(new object[] { 1, "name_" + i.ToString(), DateTime.Now });
}
List<PersonModel> list1 = DataTableHelper.GetListByDataTable<PersonModel>(dt1);
int count1 = list1.Count;   //结果:20

2、List<T>转DataTable

有时也需要反过来操作,比如Winform控件中的DataSource,是用DataTable对象赋值的

//2,List<T>转DataTable
List<PersonModel> list2 = new List<PersonModel>();
for(int i = 1; i < 20; i++)
{
    list2.Add(new PersonModel()
    {
        id = i,
        name = "name-" + i.ToString(),
        ctime = DateTime.Now,
    });
}
DataTable dt2 = DataTableHelper.GetTableByList<PersonModel>(list2);
int rowCount2 = dt2.Rows.Count;

 

3、字符串快速生成DataTable

这个场景一般用于生成控件的DataSource数据源

//3,字符串快速生成DataTable
DataTable dt3 = DataTableHelper.GetTableByString("zhangs,张三|lis,李四|wangw,王五|zhaol,赵六");
int rowCount3 = dt3.Rows.Count;

 

4、实现DataTable的分组

就是Sql里的Distinct函数,保持数据的唯一性

//4,实现DataTable的分组
DataTable dt4 = new DataTable();
dt4.Columns.Add("user_id", typeof(string));
dt4.Columns.Add("user_name", typeof(string));
dt4.Rows.Add(new object[] { "zhangs", "张三" });
dt4.Rows.Add(new object[] { "zhangs", "张三" });
dt4.Rows.Add(new object[] { "lis", "李四" });
dt4.Rows.Add(new object[] { "lis", "李四" });
int rowCount4 = dt4.Rows.Count;     //结果:4

DataTable dt42 = DataTableHelper.GetTableByDistinct(dt4, new string[] { "user_id", "user_name" });
int rowCount42 = dt42.Rows.Count;  //结果:2

5、四则运算

直接看代码就行了,很简单吧

//5,四则运算
DataTable dt5 = new DataTable();
dt5.Columns.Add("id", typeof(string));
dt5.Rows.Add(new object[] { "id_value" });
string formula = "1+2*3-4";
object objR5 = dt5.Compute(formula, "");
decimal decR5 = Math.Round(Convert.ToDecimal(objR5), 6);

6、DataSet和字符串互转

直接使用WriteXml(fileName),如果包含中文字符串,会乱码,需要用Stream中转下

//6,DataSet和字符串互转
DataTable dt6 = new DataTable();
dt6.Columns.Add("user_id", typeof(string));
dt6.Columns.Add("user_name", typeof(string));
dt6.Rows.Add(new object[] { "zhangs", "张三" });
dt6.Rows.Add(new object[] { "lis", "李四" });

DataSet dset6 = new DataSet();
dset6.Tables.Add(dt6.Copy());

//6.1,DataSet转字符串
//(屏蔽,原因:中文会乱码)
//dset6.WriteXml(@"d:\dset6.xml");
StringWriter sw6 = new StringWriter();
dset6.WriteXml(sw6);
string sData6 = sw6.ToString();

//6.2,字符串转DataSet
StringReader sr6 = new StringReader(sData6);
DataSet dset63 = new DataSet();
dset63.ReadXml(sr6);

 

7、DataRow[]生成DataTable

以前是循环DataRow[],New个新DataRow,ItemArray接收下;现在可以一句话搞定

//7,DataRow[]转DataTable
DataTable dt7 = new DataTable();
dt7.Columns.Add("id", typeof(int));
dt7.Columns.Add("name", typeof(string));
dt7.Columns.Add("ctime", typeof(DateTime));
for (int i = 1; i <= 20; i++)
{
    dt7.Rows.Add(new object[] { i, "name_" + i.ToString(), DateTime.Now });
}
DataRow[] dr7s = dt7.Select("id < 10");            

//7.1,常用方法
DataTable dt72 = dt7.Clone();
foreach(DataRow dr7 in dr7s)
{
    DataRow drAdd = dt72.NewRow();
    drAdd.ItemArray = dr7.ItemArray;
    dt72.Rows.Add(drAdd);
}
int rowCount72 = dt72.Rows.Count;   //结果:9

//7.2,高效的方法
DataTable dt73 = dr7s.CopyToDataTable();
int rowCount73 = dt73.Rows.Count;   //结果:9

 

8,DataColumn也可以自增量

可以模拟数据库的表

//8,DataColumn也可以自增量
dt7.Columns["id"].AutoIncrement = true;

 

相关阅读

net中c#教程 DateTime日期时间的常用操作

net中c#教程 list泛型的常用操作

net中c#教程 string字符串的常用操作

标签: c#教程 DataTable操作 net教程
最后更新:2022年10月7日

小Q

80后中年不油腻大叔,喜欢编写代码、打羽毛球、做木制玩具。目前定居浙江杭州

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022 小Q的博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

浙ICP备2022019157号-2