• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C# 两个DataTable合并

武飞扬头像
太阳的后裔
帮助1

前不久小编遇到一个新需求,小编开发完毕后需要将两个EXcel导入数据库中的同一个表,大家有没有想明白该怎么做呢?没错了,方法其实有好多啦,先导入一个,第二个在导入的时候进行修改不就好了么,可惜的是,小编所做的系统中呢只有批量导入的功能,没有批量修改的功能,你想想13w的数据耶,我每搞错一次都会浪费半个小时以上的时间,痛则思痛,顿了好久一段时间,小编才想起如果两个DataTable能合并的话,那么只需要思考导入的不就可以了么?
来吧,展示代码

先将第一个Excel的数据储存起来

DataTable ly_AP_Datasdt = new();
/// <summary>
/// 导入带有的Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAPLYSizeImport_Click(object sender, EventArgs e)
{
    try
    {
        MaskLayer.Show("数据匹配中...");
        DataTable dt = NPOIHelper.ImportFromExcel("", "Sheet1", 0);
        if (dt == null)
        {
            return;
        }
        if (dt.Rows.Count <= 0)
        {
            MsgBox.ShowInformation("表中无任何有效数据");
        }
        List<HjbxxbDto> ListAll = DAL.QueryList<HjbxxbDto>(@$"select Catalog_No,lyCatalog_No,nameCn,Drug_Names from HaoYuanSystem.dbo.hjbxxb where lyCatalog_No<>''");

        
        //添加多个列,包括表头,以及数据类型
        ly_AP_Datasdt.Columns.Add("ID", typeof(int));
        ly_AP_Datasdt.Columns.Add("APCatalog_No", typeof(string));
        ly_AP_Datasdt.Columns.Add("APProduct_name", typeof(string));
        ly_AP_Datasdt.Columns.Add("LyCatalog_No", typeof(string));
        ly_AP_Datasdt.Columns.Add("Purity", typeof(string));
        ly_AP_Datasdt.Columns.Add("colorCn", typeof(string));
        ly_AP_Datasdt.Columns.Add("Size", typeof(string));
        ly_AP_Datasdt.Columns.Add("Remarks", typeof(string));
        ly_AP_Datasdt.Columns.Add("UpdatePerson", typeof(string));
        ly_AP_Datasdt.Columns.Add("UpdateTime", typeof(DateTime));
        ly_AP_Datasdt.Columns.Add("APStockID", typeof(string));

        for (int i = 0; i < dt.Rows.Count; i  )
        {
            DataRow dr = dt.Rows[i];

            if (dr["...."] == null || string.IsNullOrEmpty(dr["...."].ToString().Trim()))
            {
                continue;
            }

            if (dr["...."] == null || string.IsNullOrEmpty(dr["...."].ToString().Trim()))
            {
                continue;
            }

            //判断数据库中是否存在相同的....
            if (ListAll.Find(x => x.lyCatalog_No == dr["...."].ToString().Trim()) == null)
            {
                continue;
            }

            if (ly_AP_Datasdt.AsEnumerable().Where(c => c.Field<string>("APCatalog_No").Equals(dr["...."].ToString().Trim())).Count() > 0) { 
                continue; 
            }

            ly_AP_Datasdt.Rows.Add(0, dr["...."].ToString().Trim(), "", dr["...."].ToString().Trim(), "", "", dr["...."].ToString().Trim(), "", SystemInfo.UserName, DateTime.Now, 0);
        }
        MaskLayer.Close();
        if (ly_AP_Datasdt.Rows.Count == 0)
        {
            MsgBox.ShowInformation("剔除已配置过....信息的产品,表中无任何有效数据!");
            return;
        }
        MsgBox.ShowInformation("识别到有效数据:"   ly_AP_Datasdt.Rows.Count   "条!请导入....号和....ID的Excel!");

    }
    catch (Exception ex)
    {
        MsgBox.ShowInformation(ex.Message);
    }
}

学新通

再将第二个Excel的数据存在另一个DataTable中,然后将两的DataTable合并成一个DataTable,这样就能一次批量导入两个Excel的有效数据了

/// <summary>
/// 导入带有....Id的Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnAPLYStockIdImport_Click(object sender, EventArgs e)
{
    try
    {
        MaskLayer.Show("数据匹配中...");
        DataTable dt = NPOIHelper.ImportFromExcel("", "Sheet1", 0);
        if (dt == null)
        {
            return;
        }
        if (dt.Rows.Count <= 0)
        {
            MsgBox.ShowInformation("表中无任何有效数据");
        }

        for (int i = 0; i < ly_AP_Datasdt.Rows.Count; i  )
        {
            for (int j = 0;j < dt.Rows.Count; j  ) {
                DataRow dr = dt.Rows[j];
                if (ly_AP_Datasdt.Rows[i]["APCatalog_No"].ToString().Trim() == dr["...."].ToString().Trim() && ly_AP_Datasdt.Rows[i]["LyCatalog_No"].ToString().Trim() == dr["...."].ToString().Trim()) {
                    ly_AP_Datasdt.Rows[i]["APStockID"] = dt.Rows[j]["库存ID"].ToString().Trim();
                }
            }
        }
        MaskLayer.Close();
        if (MsgBox.ShowOKCancel("剔除已配置过....信息的产品,识别到有效数据:"   ly_AP_Datasdt.Rows.Count   "条!\r\n是否导入?") != DialogResult.OK)
        {
            return;
        }
        MaskLayer.Show("数据导入中...");

        bool issussess = DAL.Table_Insert_Dt(ly_AP_Datasdt, "Ly_AP_NumCorrespondence");

        MaskLayer.Close();
        if (issussess)
        {
            MsgBox.ShowInformation("导入....信息成功!共"   ly_AP_Datasdt.Rows.Count   "条");
        }
    }
    catch (Exception ex)
    {
        MsgBox.ShowInformation(ex.Message);
    }
    finally
    {
        GetAPLyAPNumCorrespondenceList();
    }
}
学新通

补充一点,网上还有很多人在循环数据的时候将数据插入DataTable中的时候,经常在循环中写

DataRow dr = dt_temp.NewRow();
dr["id"] = Guid.NewGuid().ToString();
dr["name"] = "bgx";
dt_temp.Rows.Add(dr);

这样写的坏处就是每次都像是实例化了一次一样,小编起初也这样没想到添加一个Excel的时候居然会花一个小时,我这样子讲,你大概知道我有多么难以处理这13w的数据了吧,如果直接写

ly_AP_Datasdt.Rows.Add(0, dr["...."].ToString().Trim(), "", dr["...."].ToString().Trim(), "", "", dr["...."].ToString().Trim(), "", SystemInfo.UserName, DateTime.Now, 0);

就可以避免每次循环的时候都实例化了,如果大家没有那么大的数据量,那就当我没说,但是当数据量起来的时候,大家一定要思考该如何优化性能了

这几年里,身边的人总是在不断的发生变化,有的人早已买了车,有的人先准备买房,有的人已经结了婚甚至都有了小孩…,今天和一位朋友聊了一下,没想到他已经不做开发了,退居家乡,买了房,准备过几年结婚,小编起初还替他遗憾,没想到一下子(指时间短暂或动作迅速)(指时间短暂或动作迅速)到变成小编羡慕的对象了,大城市买房着实不容易,如果不靠自己父母,自己要打拼多久才能真正的拼出一个房子呢?哎,苦矣,人这一辈子有太多的身不由己,也许以自己喜欢的方式过完这一生也算一种不错的结局。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiegjja
系列文章
更多 icon
同类精品
更多 icon
继续加载