Как разбить таблицу данных на несколько таблиц с добавлением 1-минутной задержки - PullRequest
2 голосов
/ 15 апреля 2019

Я знаю, что есть много вопросов и решений, связанных с этим.Но я не получаю их.У меня есть таблица данных записей 8000, и она будет увеличиваться в будущем.Я хочу разделить его на 1000 записей на таблицу, а затем добавить задержку в одну минуту.Ниже приведен мой код

DataTable dt = util.getReading();

if (dt != null && dt.Rows.Count > 0)
    {
        totalRec = dt.Rows.Count;
        string ReqEnvPath = System.Configuration.ConfigurationManager.AppSettings["ReadEnvPath"].ToString();
        XElement SoapReqEnv = XElement.Load(ReqEnvPath);

        foreach (DataRow dr in dt.Rows)
        {
            //string uniqueID = dr["UNIQ_KEY"].ToString();
            string uniqueID = dr["uniqueid"].ToString();
            string meterNo = dr["msn"].ToString();
            //APPLICATION_NO, REF_NO, XMETER_NO, METER_SERIAL_NO, KWH_METER_STATUS
            string timestamp = DateTime.UtcNow.ToString("o");
            StringBuilder sbArg0 = new StringBuilder();
            try
            {
                sbArg0.AppendFormat(@"<?xml version=""1.0"" encoding=""UTF-8"" ?>          " + SoapReqEnv.ToString(), uniqueID, startTS, endTS, timestamp, this.HEXURL, this.HEXUID, this.HEXPWD);
                Guid currentGuid = Guid.NewGuid();    


                obj.getResponseAsync(sbArg0.ToString(), currentGuid + "$" + uniqueID);
                obj.getResponseCompleted += this.myHandler;

                string delayMS = System.Configuration.ConfigurationManager.AppSettings["DelayMS"].ToString();
                ushort delay = 1000;
                ushort.TryParse(delayMS, out delay);
                System.Threading.Thread.Sleep(delay);



            }
            catch (Exception ex)
            {
                error += "Error for UniqID:" + uniqueID + "Desc:" + ex.Message + "\n";
            }
            finally
            {
                //System.Threading.Thread.CurrentThread.Join();
            }
        }
    }

Как разделить таблицу данных на 1000 строк, добавляя время задержки в 1 минуту, чтобы следующие 1000 записей могли быть получены после задержки в 1 минуту?

Обновление 1

Для целей тестирования я взял 20 записей, и, следуя этому решению, я разделил таблицу данных на 5.

private List<DataTable> SplitTable(DataTable originalTable, int batchSize)
{
    List<DataTable> tables = new List<DataTable>();
    int i = 0;
    int j = 1;
    DataTable newDt = originalTable.Clone();
    newDt.TableName = "Table_" + j;
    newDt.Clear();
    foreach (DataRow row in originalTable.Rows)
    {
        DataRow newRow = newDt.NewRow();
        newRow.ItemArray = row.ItemArray;
        newDt.Rows.Add(newRow);
        i++;
        if (i == batchSize)
        {
            tables.Add(newDt);
            j++;
            newDt = originalTable.Clone();
            newDt.TableName = "Table_" + j;
            newDt.Clear();
            i = 0;
        }
    }
    return tables;
}  

public string LoadAMIReadings()
{
    string[] arr = new string[] 
    {"37030298060","28373341367200U","002997004330","002997004330",
     "37010674330","28371551110400U","002997006388","002997006388",
     "37030315632","28373131369800U","002998000563","002998000563",
     "37010681112","28374211369900U","002998000938","002998000938",
     "37010682305","28374331368400U","002998000351","002998000351",
     "37010682312","28374331369600U","002998000995","002998000995",
     "37030297517","28373321004010U","002998003915","002998003915",
     "37010674134","28371550292110U","002997006486","002997006486",
     "37030295965","28373150875200U","002997004697","002997004697",
     "37010678805","28372720047060U","002997002511","002997002511",
     "37010675029","28372230024431U","002999000385","002999000385",
     "37030299221","28373430506600U","002997000337","002997000337",
     "37030299227","28373430507200U","002997000382","002997000382",
     "37030297870","28373340570200U","002997001558","002997001558",
     "37010679004","28372730053742U","002997001334","002997001334",
     "37010719967","28372810024580U","002997006816","002997006816",
     "37010720185","28374120091810U","002998003930","002998003930",
     "37010720008","28372810036450U","002997006911","002997006911",
     "37010680399","20374131467200U","002998002734","002998002734",
     "37030296089","28373151133100U","002997002578","002997002578"};

    DataTable dt = new DataTable();
    dt.Columns.Add("Application_No", typeof(string));
    dt.Columns.Add("REF_NO", typeof(string));
    dt.Columns.Add("METER_SERIAL_NO", typeof(string));
    dt.Columns.Add("XMETER_NO", typeof(string));

    dt.FillDataTable(arr);
if (dt != null && dt.Rows.Count > 0)
    {
        totalRec = dt.Rows.Count;
        string ReqEnvPath = System.Configuration.ConfigurationManager.AppSettings["ReadEnvPath"].ToString();
        XElement SoapReqEnv = XElement.Load(ReqEnvPath);
        List<DataTable> splitdt = SplitTable(dt, 5);

        foreach (DataRow dr in dt.Rows) // here I want to pass splitdt but it gives me error
        {

            //string uniqueID = dr["UNIQ_KEY"].ToString();
            string uniqueID = dr["Application_No"].ToString();
            string meterNo = dr["METER_SERIAL_NO"].ToString();
            //APPLICATION_NO, REF_NO, XMETER_NO, METER_SERIAL_NO, KWH_METER_STATUS
            string timestamp = DateTime.UtcNow.ToString("o");
            StringBuilder sbArg0 = new StringBuilder();
            try
            {
                sbArg0.AppendFormat(@"<?xml version=""1.0"" encoding=""UTF-8"" ?>          " + SoapReqEnv.ToString(), uniqueID, startTS, endTS, timestamp, this.HEXURL, this.HEXUID, this.HEXPWD);
                Guid currentGuid = Guid.NewGuid();    


                obj.getResponseAsync(sbArg0.ToString(), currentGuid + "$" + uniqueID);
                obj.getResponseCompleted += this.myHandler;

                string delayMS = System.Configuration.ConfigurationManager.AppSettings["DelayMS"].ToString();
                ushort delay = 1000;
                ushort.TryParse(delayMS, out delay);
                System.Threading.Thread.Sleep(delay);


            }
            catch (Exception ex)
            {
                error += "Error for UniqID:" + uniqueID + "Desc:" + ex.Message + "\n";
            }
            finally
            {
                //System.Threading.Thread.CurrentThread.Join();
            }
        }
    }

}

Теперь у меня есть 4 таблицы из каждых 5 строк.Я хочу взять данные из 1-го процесса таблицы, затем он ждет 1 минуту, а затем получить 2-й разделенной таблицы и так далее.

Я пытаюсь передать splitdt в foreach(DataRow in splitdt.Rows), но это дает мне ошибку.

Как мне этого добиться?

Любая помощь будет высоко оценена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...