gpt4 book ai didi

c# - 合并后DataTable排序排序不正确

转载 作者:太空宇宙 更新时间:2023-11-03 14:46:14 28 4
gpt4 key购买 nike

我有 2 个数据表,我正在使用 .Merge 方法进行合并。

2 个数据表的列类型是 System.Decimal。但它似乎没有正确排序。第一个 DataTable 的数据将首先排序,然后是第二个 DataTable 的数据。

enter image description here

因此,如果您看到上图,它将显示第一个 DataTable 数据,然后是第二个 DataTable,按开始时间排序。

如果我反转排序,它将按降序对第二个 DataTable 数据进行排序,然后显示第一个 DataTable。

enter image description here

这是我的排序代码

DataView dv = new DataView(dataTableResult);
dv.Sort = string.Format("{0} {1}", ViewState["sortexp"].ToString(),
GetSortDirection());
return dv;

ViewState["sortexp"] 在这种情况下包含开始时间,GetSortDirection 是“ASC”或“DESC”。

我的查询:

select  ....
to_number(to_char([start_field],'hh24mi')) as start_time,
to_number(to_char([end_field], 'hh24mi')) as end_time,
...
from [table]
where [condition]

另一个是我从网络服务获取结果并手动填充数据行。

foreach (DTResult dtr in result)
{
DataRow dr = dtTable2.NewRow();
...
dr["start_time"] = Decimal.Parse(dtr.start_time.Replace(":", ""));
dr["end_time"] = Decimal.Parse(dtr.end_time.Replace(":", ""));
...
dtTable2.Rows.Add(dr);
}

合并代码

dataTableResult.Merge(dtTable1);
dataTableResult.Merge(dtTable2);

dtTable 列的定义:

...
dtTable2.Columns.Add("start_time", typeof(decimal));
dtTable2.Columns.Add("end_time", typeof(decimal));
...

如何解决问题?

最佳答案

调试后发现是由于dataTableResult.Merge(dtTable2);命令在dataTableResult中新建了列,使得列数变成了一倍.

所以 dataTableResult 的内容类似于以下内容:

--------------------------------------------------------------------
|Rows | start_time | end_time | start_time | end_time |
--------------------------------------------------------------------
|0 | 1200 | 1400 | NULL | NULL | --> 1st data table merge
|1 | 800 | 1000 | 800 | 1000 | --> 2nd data table merge
|2 | 1400 | 1600 | 1400 | 1600 | --> 2nd data table merge
|3 | 1600 | 1800 | 1600 | 1800 | --> 2nd data table merge
--------------------------------------------------------------------

列名只是为了说明,因为我看不到实际的列名。因此,一旦合并第二个数据表,它就会创建新列。第一个数据表的新列包含 NULL。并且第二个数据表的列内容将重复(就像两个 start_time 列将具有相同的值)。不过这很奇怪。

下面是我解决问题的方法:

dataTableResult 中,我将使用大写字母作为列名来定义所有列。出于某种原因,之前的查询使用的是普通字母,这​​导致它加倍。

dataTableResult.Columns.Add("START_TIME", typeof(decimal));
dataTableResult.Columns.Add("END_TIME", typeof(decimal));

然后在数据库查询中,我也会使用大写字母作为列名别名

select  ....
to_number(to_char([start_field],'hh24mi')) as START_TIME,
to_number(to_char([end_field], 'hh24mi')) as END_TIME,
...
from [table]
where [condition]

第二个数据表也是如此

dtTable2.Columns.Add("START_TIME", typeof(decimal));
dtTable2.Columns.Add("END_TIME", typeof(decimal));

这样一来,在调用dataTableResult.Merge(dtTable2);时,生成的数据表将不会有重复的列,排序问题也得到了解决。

关于c# - 合并后DataTable排序排序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54084780/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com