我知道有很多问题和解决方案都与此相关。但我不会得到的。我有一个数据表的记录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();
}
}
}如何在添加1分钟延迟时间的同时将数据表拆分为1000行,以便在延迟1分钟后才能记录下1000条记录?
更新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分钟,然后得到第二个拆分表,以此类推。
我试图将splitdt传递给foreach(DataRow in splitdt.Rows),但这给了我一个错误。
我怎样才能做到这一点?
任何帮助都将不胜感激。
发布于 2019-09-20 12:49:32
我希望这是你们想要达到的目标:
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading;..。
public void Test()
{
DataTable bigDataTable = GetBigDataTable();
var splitedTables = new List<DataTable>();
var smallTable = new DataTable();
int page = 0;
int pageSize = 1000;
List<DataRow> results;
while (true)
{
results = bigDataTable.AsEnumerable().Skip(pageSize * page++).Take(pageSize).ToList();
if (!results.Any())
break;
smallTable = results.CopyToDataTable();
splitedTables.Add(smallTable);
Thread.Sleep(1000 * 60 * 1);
} while (results.Any());
}为此,您需要添加对System.Data.DataSetExtensions的引用。
因此,这也是类似的问题。
https://stackoverflow.com/questions/55688229
复制相似问题