我有2个要使用.Merge
方法合并的数据表。
2个数据表的列类型为System.Decimal
。
但它似乎无法正确排序。首先将对第一个数据表的数据进行排序,然后对第二个数据表中的数据进行排序。
因此,如果您看到上面的图片,它将显示第一个DataTable数据,然后显示第二个DataTable,按开始时间排序。
如果我反向排序,它将以降序对第二个DataTable数据进行排序,然后将出现第一个DataTable。
这是我排序的代码
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]
另外一个是我从Web服务获取结果并手动填充数据行。
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));
...
如何解决该问题?
答案 0 :(得分:0)
调试之后,我发现这是由于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);
时,结果数据表将没有重复的列,并且排序问题已得到解决。