【C#】程序开发,使用 DataTable 还是 List?

系列文章

【C#】单号生成器(编号规则、固定字符、流水号、产生业务单号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787

【C#】二维码标签制作及打印(完整版)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126884228

【C#】单据打印方案(设计打印模板、条形码&二维码、图片、字体)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723

【C#】日期范围生成器(构建开始日期、结束日期)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663

【C#】组件化开发,调用dll组件方法
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129492112

【C#】GridControl控件和List数据集双向绑定
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129423755

【C#】数据实体类使用
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128816638

【C#】单据审批流方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/128972545

【C#】条码管理操作手册
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126589496

【C#】WebAPI发布和IIS部署,及异常处理
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126539836

【C#】提高编程效率,代码自动生成器
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126890673

【C#】提高编程效率,Excel数据导入工具
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126427323

【C#】Windows服务(Service)安装及启停方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053794

【C#】穿透Session隔离,服务调用外部程序(无窗体界面解决)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/124053033

【C#】任务计划实现,使用Quartz类
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123667723

【C#】《周计划管理关于产前准备模块》解决方案20200203
本文链接:https://blog.csdn.net/youcheng_ge/article/details/122919543

【C#】源码解析正则表达式
本文链接:https://blog.csdn.net/youcheng_ge/article/details/118337074

【C#】软件版本和文件MD5记录(XML操作)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/112513871

【C#】如何测试网络是否连通
本文链接:https://blog.csdn.net/youcheng_ge/article/details/110137288

【Inno Setup】安装包制作,项目打包方案
本文链接:https://blog.csdn.net/youcheng_ge/article/details/123665633

【Regex正则】最全正则表达使用手册
本文链接:https://blog.csdn.net/youcheng_ge/article/details/108216964



前言

我能抽象出整个世界,但是我不能抽象你。 想让你成为私有常量,这样外部函数就无法访问你。 又想让你成为全局常量,这样在我的整个生命周期都可以调用你。 可惜世上没有这样的常量,我也无法定义你,因为你在我心中是那么的具体。

哈喽大家好,本专栏为【项目实战】专栏,有别于【底层库】专栏,我们可以发现增加 了『问题描述』、『项目展示』章节,十分符合项目开发流程,让读者更加清楚项目解决的问题、以及产品能够达到的效果。本专栏收纳项目开发过程的解决方案,是我项目开发相对成熟、可靠方法的提炼,我将这些问题的解决思路梳理,撰写本文分享给大家,大家遇到类似问题,可按本文方案处理。

本专栏会持续更新,不断完善,专栏文章关联性较弱(文章之间依赖性较弱,没有阅读顺序)。大家有任何问题,可以私信我。如果您对本专栏感兴趣,欢迎关注吧,我将带你用最简洁的代码,实现复杂的功能。

·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。
在这里插入图片描述


一、问题描述

【C#】程序开发,使用 DataTable 还是 List?

二、解决方案

数据模型,使用DataTable和List比较

三、软件开发(项目源码)

3.1 数据模型定义不同

List需要创建Model类,DataTable需要定义列。

DataTable:

	public DataTable m_dtTBarSave;
	//绑定左下方表格
	m_dtTBarSave = new DataTable();
	m_dtTBarSave.Columns.Add("公司编号", typeof(System.String));
	m_dtTBarSave.Columns.Add("工厂名称", typeof(System.String));
	m_dtTBarSave.Columns.Add("存货编码", typeof(System.String));
	m_dtTBarSave.Columns.Add("采购订单编号", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条供应商编号", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条出厂批次号", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条出厂规格", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条出厂重量", typeof(System.Decimal));
	m_dtTBarSave.Columns.Add("材料类型", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条类型", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条编号", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条状态描述", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条规格", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条重量", typeof(System.Decimal));
	m_dtTBarSave.Columns.Add("钨条打标时间", typeof(System.DateTime));
	m_dtTBarSave.Columns.Add("钨条打标录入时间", typeof(System.DateTime));
	m_dtTBarSave.Columns.Add("钨条打标操作人编号", typeof(System.String));
	m_dtTBarSave.Columns.Add("钨条打标备注", typeof(System.String));
	GridControl_List.DataSource = m_dtTBarSave;

List:

public BindingList<钨条信息表Model> m_listTBarSave = new BindingList<钨条信息表Model>();

注意:需要提前新建 钨条信息表Model.cs文件,工具可以自动生成。

3.2 数据赋值方式不同

List有简单数据类型校验,而DataTable没有。

DataTable:

 	for (int i = 0; i < l_intBatchNum; i++) //每批数量
	   {
	       int num = 0;
	       int.TryParse(text2, out num);
	
	       DataRow dr = m_dtTBarSave.NewRow();
	       dr["公司编号"] = "Z";
	       dr["工厂名称"] = baseDataInput_FactoryName.StringValue.Trim();
	       dr["存货编码"] = baseDataInput_InventoryCode.StringValue.Trim();
	       dr["采购订单编号"] = baseDataInput_OrderNo.StringValue.Trim();
	       dr["钨条供应商编号"] = baseDataInput_Supply.StringValue.Trim();
	       dr["钨条出厂批次号"] = baseDataInput_FactoryBatchNo.StringValue.Trim();
	       dr["钨条出厂规格"] = baseDataInput_FactorySpec.StringValue.Trim();
	       dr["钨条出厂重量"] = baseDataInput_FactoryWeight.DecimalValue;
	       dr["材料类型"] = baseDataInput_MaterialType.StringValue.Trim();
	       dr["钨条类型"] = baseDataInput_TBarType.StringValue.Trim();
	       dr["钨条编号"] = text1 + (num + i).ToString().PadLeft(6, '0');
	       dr["钨条状态描述"] = 钨条状态常量.等待钨条样检验;
	       dr["钨条规格"] = baseDataInput_Spec.StringValue.Trim();
	       dr["钨条重量"] = baseDataInput_Weight.DecimalValue;
	       dr["钨条打标时间"] = DateTime.Now;
	       dr["钨条打标录入时间"] = DateTime.Now;
	       dr["钨条打标操作人编号"] = BaseVal.UserID;
	       dr["钨条打标备注"] = baseDataInput_Note.StringValue.Trim();
	       m_dtTBarSave.Rows.Add(dr);
	   }

List:

	for (int i = 0; i < l_intBatchNum; i++) //每批数量
	{
	    int num = 0;
	    int.TryParse(text2, out num);
	
	   钨条信息表Model model = new 钨条信息表Model();
	   model.公司编号 = "Z";
	   model.工厂名称 = baseDataInput_FactoryName.StringValue.Trim();
	   model.存货编码 = baseDataInput_InventoryCode.StringValue.Trim();
	   model.采购订单编号 = baseDataInput_OrderNo.StringValue.Trim();
	   model.钨条供应商编号 = baseDataInput_Supply.StringValue.Trim();
	   model.钨条出厂批次号 = baseDataInput_FactoryBatchNo.StringValue.Trim();
	   model.钨条出厂规格 = baseDataInput_FactorySpec.StringValue.Trim();
	   model.钨条出厂重量 = baseDataInput_FactoryWeight.DecimalValue;
	   model.材料类型 = baseDataInput_MaterialType.StringValue.Trim();
	   model.钨条类型 = baseDataInput_TBarType.StringValue.Trim();
	   model.钨条编号 = text1 + (num + i).ToString().PadLeft(6, '0');
	   model.钨条状态描述 = 钨条状态常量.等待钨条样检验;
	   model.钨条规格 = baseDataInput_Spec.StringValue.Trim();
	   model.钨条重量 = baseDataInput_Weight.DecimalValue;
	   model.钨条打标时间 = DateTime.Now;
	   model.钨条打标录入时间 = DateTime.Now;
	   model.钨条打标操作人编号 = BaseVal.UserID;
	   model.钨条打标备注 = baseDataInput_Note.StringValue.Trim();
	   m_listTBarSave.Add(model);
	}

3.3 向服务端发送数据格式不同

List传json字符串,DataTable直接传表

DataTable:

	//发送请求
	BaseSuperMessage SuperMsg = new BaseSuperMessage(仓库消息.钨条打标);
	SuperMsg.Append(m_dtTBarSave);
	SuperMsg.Append("PrinterPCName", System.Net.Dns.GetHostName());
	BaseNetClient.SendSuperMessage(SuperMsg);

List:

	//需要转json字符串
	string l_strValueTBarInfo = JsonConvert.SerializeObject(m_listTBarSave);
	//发送请求
	BaseSuperMessage SuperMsg = new BaseSuperMessage(仓库消息.钨条打标);
	SuperMsg.Append("PrinterPCName", System.Net.Dns.GetHostName());
	SuperMsg.Append(钨条信息表.表名, l_strValueTBarInfo);
	BaseNetClient.SendSuperMessage(SuperMsg);

3.4 服务端接收数据格式不同

List多一步反序列化过程,DataTable可直接接收。

DataTable:

	//钨条信息表
	DataTable l_dtTBarInfo = SuperMsg.TableSet[0];
	strSQL = MySQLBuilder.CreateInsertSQLBuilder(钨条信息表.表名, l_dtTBarInfo);
	MySQL.Excute(strSQL);

List:

	//钨条信息表
	string l_strNameNameTBarInfo = SuperMsg.Data[1].Name;
	string l_strValueTBarInfo = SuperMsg.Data[1].Value;
	List<钨条信息表Model> l_list = JsonConvert.DeserializeObject<List<钨条信息表Model>>(l_strValueTBarInfo);
	strSQL = MySQLBuilder.CreateInsertSQLBuilder(l_strNameNameTBarInfo, l_list);
	MySQL.Excute(strSQL);

3.5 服务端工作站打印任务传参不同

List可以直接返回json,DataTable需要挨个传参。

DataTable:

	//工作站打印任务
	if (!DicQueueTask_WorkStation.Keys.Contains(PrinterPCName))
	{
	    DicQueueTask_WorkStation.Add(PrinterPCName, new ConcurrentQueue<List<BaseData>>());
	}
	foreach (DataRow dr in l_dtTBarInfo.Rows)
	{
	    //粗丝标签信息
	    List<BaseData> dataList = new List<BaseData>();
	    dataList.Add(new BaseData("任务目标", PrinterPCName));
	    dataList.Add(new BaseData(工作站任务常量.钨条打标, 工作站任务常量.钨条打标));
	    dataList.Add(new BaseData("钨条编号", dr["钨条编号"].ToString()));
	    dataList.Add(new BaseData("规格", dr["钨条规格"].ToString()));
	    dataList.Add(new BaseData("重量", dr["钨条重量"].ToString()));
	    dataList.Add(new BaseData("厂家", dr["钨条供应商编号"].ToString()));
	    dataList.Add(new BaseData("批次号", dr["钨条出厂批次号"].ToString()));
	    dataList.Add(new BaseData("制单人", Client.用户姓名));
	    dataList.Add(new BaseData("日期", DateTimeNow));
	
	    DicQueueTask_WorkStation[PrinterPCName].Enqueue(dataList);
	}

List:

	//工作站打印任务
	if (!DicQueueTask_WorkStation.Keys.Contains(PrinterPCName))
	{
	    DicQueueTask_WorkStation.Add(PrinterPCName, new ConcurrentQueue<List<BaseData>>());
	}
	List<BaseData> dataList = new List<BaseData>();
	dataList.Add(new BaseData("任务目标", PrinterPCName));
	dataList.Add(new BaseData(工作站任务常量.钨条打标, l_strValueTBarInfo));
	DicQueueTask_WorkStation[PrinterPCName].Enqueue(dataList);

3.6 客户端执行打印任务不同

List有基本对应关系,DataTable需要根据传参顺序。

DataTable:

if (dataList[0].Name == 工作站任务常量.钨条打标)
{
    //钨条打标
    Excel.Workbook wb = ExcelHelper.OpenPrintTemple("仓库管理_打印模板.xlsm");
    Excel.Worksheet sht = wb.Worksheets["钨条标签"];

    //根据服务端依次打印 
    sht.Cells[2, 3] = dataList[1].Value;
    sht.Cells[3, 5] = dataList[2].Value;
    sht.Cells[4, 5] = dataList[3].Value;
    sht.Cells[5, 5] = dataList[4].Value;
    sht.Cells[6, 5] = dataList[5].Value;
    sht.Cells[7, 5] = dataList[6].Value;
    sht.Cells[8, 5] = dataList[7].Value;

    string MacroName = "Fun_WuTaioPrint";
    ExcelHelper.RunMacro
        (
            wb.Application,
            MacroName,
            new object[]
            {
                1
            }
        );
    BaseHMI.TimeDelay(1000);

    //关闭打印模板
    ExcelHelper.ClosePrintTemple(wb);

    return;
}

List:

if (dataList[0].Name == 工作站任务常量.钨条打标)
{
    //钨条打标
    Excel.Workbook wb = ExcelHelper.OpenPrintTemple("仓库管理_打印模板.xlsm");
    Excel.Worksheet sht = wb.Worksheets["钨条标签"];

    //循环打印,12个标签
    List<钨条信息表Model> l_listTBar = JsonConvert.DeserializeObject<List<钨条信息表Model>>(dataList[0].Value);
    foreach (var item in l_listTBar)
    {
        sht.Cells[2, 3] = item.钨条编号;
        sht.Cells[3, 5] = item.钨条规格;
        sht.Cells[4, 5] = item.钨条重量;
        sht.Cells[5, 5] = item.钨条供应商编号;
        sht.Cells[6, 5] = item.钨条出厂批次号;
        sht.Cells[7, 5] = item.钨条打标操作人编号;
        sht.Cells[8, 5] = item.钨条打标时间;

        string MacroName = "Fun_WuTaioPrint";
        ExcelHelper.RunMacro
            (
                wb.Application,
                MacroName,
                new object[]
                {
                    1
                }
            );
        BaseHMI.TimeDelay(1000);
    }

    //关闭打印模板
    ExcelHelper.ClosePrintTemple(wb);
    return;
}

3.7 编译器调试过程的不同

List较能看清参数值变化,DataTable需要展开列,依次点击多层,也未必看到。

DataTable:
在这里插入图片描述
在这里插入图片描述
List:
在这里插入图片描述

3.8 日志记录形式不同

List较能看清用户提交数据,DataTable不太方便查看。
DataTable需要按“|”分割,进Excel表查看
可以借助第三方解析工具,查看json

DataTable:
在这里插入图片描述
List:
在这里插入图片描述

在这里插入图片描述

四、项目展示

暂无

五、资源链接

暂无

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花北城

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值