最近在进行项目开发时,我遇到了一个问题:需要将从数据库查询出来的数据传输给另一个系统进行分析。为了实现这一目标,我采用了HTTP的POST请求方式。然而,在传输过程中,当数据量达到两万多条时,请求变得非常缓慢,而且每次只能传输五千多条数据,剩下的部分就会丢失。
问题的原因在于对方系统对HTTP请求最大数据量的设置是2M。因此,我们协商了一个解决方案:在上传数据之前,对数据进行分片处理。为了实现这一目标,我决定对查询出的数据进行分页,然后按页传输。
与我们在平时网页开发中使用的分页思路相同,我一次性从数据库中获取了所有数据,然后使用datatable对数据进行分页处理。这种方法可以看作是一种“伪分页”。
以下是我抽象出来的分页方法:
```csharp
// 定义一个分页类
public class Pagination
{
public int PageIndex { get; set; } // 当前页数
public int PageSize { get; set; } // 每页显示的数据条数
public int TotalCount { get; set; } // 总数据条数
}
// 对数据进行分页处理的方法
public List PaginateData(List dataList, Pagination pagination)
{
int startIndex = (pagination.PageIndex - 1) * pagination.PageSize;
int endIndex = Math.Min(startIndex + pagination.PageSize, dataList.Count);
return dataList.GetRange(startIndex, endIndex - startIndex);
}
```
通过这个方法,我可以将查询出的数据按照指定的页数和每页显示的数据条数进行分页。在实际应用中,可以根据需要对这个方法进行扩展,以满足不同的分页需求。
以下是根据提供的代码内容重构后的段落结构:
```csharp
///
/// DataTable分页处理
///
/// 想要进行分页的DataTable
/// 当前页数
/// 每页记录数
///
public DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{
if (PageIndex == 0)
return dt; //0页代表每页数据,直接返回
DataTable newdt = dt.Copy(); //复制dt的框架
newdt.Clear(); //清空新表格的数据列
int rowbegin = (PageIndex - 1) * PageSize; //计算要显示的起始行索引
int rowend = PageIndex * PageSize; //计算要显示的结束行索引
if (rowbegin >= dt.Rows.Count) //源数据记录数小于等于要显示的记录,直接返回新表格
return newdt;
if (rowend > dt.Rows.Count) //结束行索引大于源数据记录数,将结束行索引设置为源数据记录数
rowend = dt.Rows.Count;
for (int i = rowbegin; i <= rowend - 1; i++) //遍历要显示的行索引范围内的数据行
{
DataRow newdr = newdt.NewRow(); //创建新的DataRow对象
DataRow dr = dt.Rows[i]; //获取当前数据行对象
foreach (DataColumn column in dt.Columns) //遍历所有列名
{
newdr[column.ColumnName] = dr[column.ColumnName]; //将当前数据行中的值赋给新表格中的对应列名位置
}
newdt.Rows.Add(newdr); //将新创建的DataRow对象添加到新表格中对应的行索引位置处
}
return newdt; //返回已分页的DataTable对象
}
```
具体调用如下:
```csharp
// 总记录数,dt为想要对其进行分页的DataTable
int parkingCount = dt.Rows.Count;
int pageSize = 4000; // 每页显示记录数
int pageCount; // 总页数
if (parkingCount % pageSize == 0) {
pageCount = parkingCount / pageSize;
} else {
pageCount = parkingCount / pageSize + 1;
}
// pageIndex:当前页数
// 在这里因为是控制台程序,所以不能实时接收pageIndex
List
for (int pageIndex = 1; pageIndex <= pageCount; pageIndex++) {
DataTable pageDt = GetPagedTable(dt, pageIndex, pageSize);
String json = JsonHelper.Serialize(dt);
list.Add(json);
LogHelper.Info("查询出来的停车记录" + json);
}
```