首页 > 解决方案 > 在 ForEach C# 期间继续向表中添加行

问题描述

我有下面的代码,它非常适合运行 foreach 语句来运行多个文件,填充名为 dt_LearnDelivery 和 dt_LearnDelFAM 的数据表。但是,对于它运行的每个文件,它都会覆盖表的现有内容。我想要发生的是每次它通过 foreach 语句读取一个新文件时,它都会添加到 dt_LearnDelivery 和 dt_LearnDelFAM 中的任何现有行。有什么建议么?

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MessageLogging;

namespace ILRValidation
{
    public static partial class Validation
    {
    static MessageLogging.Msgs msgs = Msgs.Instance;
    static MessageLogging.Progress progress = Progress.Instance;
    /// <summary>
    /// Takes ILR Converted dataset, and checks for null values and outputs to separate validation dataset
    /// </summary>
    /// <param name="ds_NullChecks">ILR XML Import Dataset</param>
    /// <returns></returns>
    public static DataSet NullChecks(DataSet ds_NullChecks)
    {
        return Checks(ds_NullChecks);
    } 

    public static DataSet NullChecks(string xmlPath)
    {

        DataSet ds_xmlDataset = new DataSet();
        FileInfo fileInfo = new FileInfo(xmlPath);

        ds_xmlDataset.ReadXml(fileInfo.FullName, XmlReadMode.Auto);

        return Checks(ds_xmlDataset);
    }
    private static DataSet Checks(DataSet dataset)
    {
        msgs.AddMsg("Entering Checks");
        progress.ResetValue();

        if (ds_Validation.Tables.Contains("LearningDelivery_NullValues"))
        {
            ds_Validation.Tables.Remove("LearningDelivery_NullValues");
        }

        if (ds_Validation.Tables.Contains("LearnerDeliveryFAM_NullValues"))
        {
            ds_Validation.Tables.Remove("LearnerDeliveryFAM_NullValues");
        }

        msgs.AddMsg("Adding Extra columns to LearningDelivery & LearningDeliveryFAM");
        dataset.Tables["LearningDelivery"].Columns.Add("LearnRefNumber").SetOrdinal(0);
        dataset.Tables["LearningDelivery"].Columns.Add("Comments");
        dataset.Tables["LearningDeliveryFAM"].Columns.Add("LearnRefNumber").SetOrdinal(0);
        dataset.Tables["LearningDeliveryFAM"].Columns.Add("Comments");

        DataTable dt_LearnDelivery = new DataTable();
        dt_LearnDelivery.TableName = "LearningDelivery_NullValues";



        foreach (DataColumn dataColumn in dataset.Tables["LearningDelivery"].Columns)
        {
            dt_LearnDelivery.Columns.Add(dataColumn.ColumnName);
        }



        //Make a table to hold the issues with LearnerDeliveryFAM
        DataTable dt_LearnDelFAM = new DataTable();
        dt_LearnDelFAM.TableName = "LearnerDeliveryFAM_NullValues";

        foreach (DataColumn dataColumn in dataset.Tables["LearningDeliveryFAM"].Columns)
        {
            dt_LearnDelFAM.Columns.Add(dataColumn.ColumnName);
        }

        progress.SetMax(dataset.Tables["LearningDelivery"].Select("Isnull(LearnAimRef,'') = ''").Count());
        progress.SetMessage("Checked for issues 1 of 9");

        //Add "No Aim" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDelivery"].Select("Isnull(LearnAimRef,'') = ''"))
        {
            dr["LearnRefNumber"] = dr.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "LearnAimRef - No Aim Ref Supplied";

            dt_LearnDelivery.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }

        progress.int_Progress = 0;
        progress.SetMax(dataset.Tables["LearningDelivery"].Select("Isnull(AimType,'') = ''").Count());
        progress.SetMessage("Checked for issues 2 of 9");

        //Add "No Aim Type" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDelivery"].Select("Isnull(AimType,'') = ''"))
        {

            dr["LearnRefNumber"] = dr.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "AimType - No Aim Type Supplied";

            dt_LearnDelivery.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }

        progress.int_Progress = 0;
        progress.SetMax(dataset.Tables["LearningDelivery"].Select("Isnull(AimSeqNumber,'') = ''").Count());
        progress.SetMessage("Checked for issues 3 of 9");

        //Add "No Aim Sequence Number" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDelivery"].Select("Isnull(AimSeqNumber,'') = ''"))
        {

            dr["LearnRefNumber"] = dr.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "AimSeqNumber - No Aim Sequence Number Supplied";

            dt_LearnDelivery.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }
        progress.int_Progress = 0;
        progress.SetMax(dataset.Tables["LearningDelivery"].Select("Isnull(LearnStartDate,'') = ''").Count());
        progress.SetMessage("Checked for issues 4 of 9");

        //Add "No Learner Start Date" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDelivery"].Select("Isnull(LearnStartDate,'') = ''"))
        {

            dr["LearnRefNumber"] = dr.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "LearnStartDate - No Learner Start Date Supplied";

            dt_LearnDelivery.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }

        progress.int_Progress = 0;
        progress.SetMax(dataset.Tables["LearningDelivery"].Select("Isnull(LearnPlanEndDate,'') = ''").Count());
        progress.SetMessage("Checked for issues 5 of 9");

        //Add "No Learner Planned End Date" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDelivery"].Select("Isnull(LearnPlanEndDate,'') = ''"))
        {

            dr["LearnRefNumber"] = dr.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "LearnPlanEndDate - No Learner Planned End Date Supplied";

            dt_LearnDelivery.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }

        progress.int_Progress = 0;
        progress.SetMax(dataset.Tables["LearningDelivery"].Select("Isnull(FundModel,'') = ''").Count());
        progress.SetMessage("Checked for issues 6 of 9");

        //Add "No Funding Model" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDelivery"].Select("Isnull(FundModel,'') = ''"))
        {

            dr["LearnRefNumber"] = dr.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "FundModel - No Funding Model Supplied";

            dt_LearnDelivery.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }

        progress.int_Progress = 0;
        progress.SetMax(dataset.Tables["LearningDelivery"].Select("Isnull(DelLocPostCode,'') = ''").Count());
        progress.SetMessage("Checked for issues 7 of 9");

        //Add "No Delivery Location Postcode" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDelivery"].Select("Isnull(DelLocPostCode,'') = ''"))
        {

            dr["LearnRefNumber"] = dr.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "DelLocPostCode - No Delivery Location Postcode Supplied";

            dt_LearnDelivery.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }

        progress.int_Progress = 0;
        progress.SetMax(dataset.Tables["LearningDelivery"].Select("Isnull(CompStatus,'') = ''").Count());
        progress.SetMessage("Checked for issues 8 of 9");

        //Add "No Completion Status" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDelivery"].Select("Isnull(CompStatus,'') = ''"))
        {

            dr["LearnRefNumber"] = dr.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "CompStatus - No Completion Status Supplied";

            dt_LearnDelivery.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }

        progress.int_Progress = 0;
        progress.SetMax(dataset.Tables["LearningDeliveryFAM"].Select("Isnull(LearnDelFAMCode,'') = '' and LearnDelFAMType = 'SOF'").Count());
        progress.SetMessage("Checked for issues 9 of 9");

        //Add "No SOF" issues to new table
        foreach (DataRow dr in dataset.Tables["LearningDeliveryFAM"].Select("Isnull(LearnDelFAMCode,'') = '' and LearnDelFAMType = 'SOF'"))
        {
            DataRow AimRow = dr.GetParentRow("LearningDelivery_LearningDeliveryFAM");

            dr["LearnRefNumber"] = AimRow.GetParentRow("Learner_LearningDelivery")["LearnRefNumber"].ToString();
            dr["Comments"] = "LearnDelFAMCode is null where LearnDelFAMType is SOF";

            dt_LearnDelFAM.Rows.Add(dr.ItemArray);

            progress.IncProgress();
        }


        ds_Validation.Tables.Add(dt_LearnDelivery);
        ds_Validation.Tables.Add(dt_LearnDelFAM);

        return ds_Validation;
    }
}
}

在它运行一个文件后,添加到一个数据表中,然后它进入另一个类并执行以下操作:

    using InfExcelExtension;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ILRValidation;


namespace ILRChecks
{
    internal static partial class ILRReport
    {
        internal static void NullChecks()
        {
            Global.Progress.ResetValue();            

            foreach (string str_FileLocation in Global.fileNames)
            {
                FileInfo fileInfo = new FileInfo(str_FileLocation);




                DataSet ds_NullValue = ILRValidation.Validation.NullChecks(str_FileLocation);

                ds_NullValue.ToWorkBook(Global.output);



            }
            Global.Progress.SetMax(Global.fileNames.Count());
            Global.Progress.IncProgress();
            Global.Progress.ResetValue();




        }
    }
}

标签: c#loopsforeachdatatables

解决方案


在该方法的每次运行中,Checks(DataSet dataset)您都使用重新创建表对象

DataTable dt_LearnDelivery = new DataTable();

这个变量需要提升为类的静态变量

namespace ILRValidation
{
    public static partial class Validation
    {
        static MessageLogging.Msgs msgs = Msgs.Instance;
        static MessageLogging.Progress progress = Progress.Instance;

        static DataTable dt_LearnDelivery = new DataTable();
        ...

是的,请帮自己一个忙,按照@Broots Waymb 的建议将该方法分解为更小的方法。


推荐阅读