Datatable.select排序和SQL中orderby排序结果不同的问题

lost_queen 2011-08-10 04:07:06
例子:表A,只有一个字段:Code,类型是string

三条数据

0
-4
1


如果是sql文检索,orderby Code,结果集是

-4
0
1
但是先抽出来放在内存里,用datatable.select排序,结果是

0
1
-4

想请问的是,怎么才能在不连接数据库的情况下,得到和sql文排序结果相同的结果集?
...全文
3596 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2011-08-11
  • 打赏
  • 举报
回复
原因找到,但是要解决的话,你只能自己写排序方法了,调用DataTable的排序函数无法处理。
引用
.NET Framework 使用了三种不同的排序方式:单词排序、字符串排序和序号排序。单词排序执行区分区域性的字符串比较。某些非字母数字字符可能被赋予了特殊权重。例如,连字符(“-”)的权重非常小,因此“coop”和“co-op”在排序列表中是紧挨着出现的。字符串排序与单词排序类似,只不过它没有特殊情况。因此,所有非字母数字符号会排在所有字母数字字符之前。而序号排序基于字符串中各元素的 Unicode 值对字符串进行比较。

这里的“-”被认为是连字符了,具有特殊权重,比较的时候自动忽略了这个“-”而去比较后面的字符。在String类的Compare方法中,有一个参数(CompareOptions.StringSort)可以恢复原来的比较,但是这个DataTable中没有办法修改,因此无法通过Select排序来做到了。
lost_queen 2011-08-11
  • 打赏
  • 举报
回复
楼上说的有道理,我又去看了下数据库。

现在数据库写入时的规则是:当第一位是数字时前补零,当第一位不是数字时后补空格。

所以数据库中的数据是

-4(后面有18个空格)
00000000000000000001
00000000000000000002

数据库排序是认为负号“-”比0小,排在前面,而datatable.select()认为0比“-”小,导致了两边排序不一致。
qldsrx 2011-08-11
  • 打赏
  • 举报
回复
你是如果抽取数据的?数据库类型是nchar(20)的话,会有很多空格才对,那么这些空格是前导空格还是后导空格,再或者被你Trim掉了,空格是影响排序的重要字符。
lost_queen 2011-08-11
  • 打赏
  • 举报
回复
是字符串,这个列可以输入中英日文字符。

可能我举例不好,只写了数字,让各位误会数据库里是int

数据库类型是 nchar(20)

我的数据库是sql2005,排序规则Japanese_CI_AS

不知道.NET中有没有能修改排序规则的接口或者属性,能让datatable.select()的排序方法和sqlserver相同。

谢谢
qldsrx 2011-08-11
  • 打赏
  • 举报
回复
你先输出下那个列的DataType类型,我怀疑是字符串。
劉宏哲 2011-08-11
  • 打赏
  • 举报
回复
用linq排一下。
var test = (from DataRow record in dt.Rows
select record).OrderBy(r => int.Parse(r["排序列"].ToString()));
应该可以实现按数字顺序排列。
lost_queen 2011-08-11
  • 打赏
  • 举报
回复
有没有办法改变datatable.select的排序规则?
lost_queen 2011-08-11
  • 打赏
  • 举报
回复
去msdn好好学习了下。

感谢楼上的回答,明白了,虽然最后还是决定自己排序。

结贴,给分啦。
小心眼 2011-08-10
  • 打赏
  • 举报
回复
后面的ci_as都有自己特定的涵义
小心眼 2011-08-10
  • 打赏
  • 举报
回复
比如我的数据库以japanese_ji_cs排序的
小心眼 2011-08-10
  • 打赏
  • 举报
回复
你自己查下字的几数据库是以什么顺序排序的,属性里面有查询顺序的,
lost_queen 2011-08-10
  • 打赏
  • 举报
回复
sql2005对char排序是按照什么规则?
lost_queen 2011-08-10
  • 打赏
  • 举报
回复
Code字段的类型是 nchar(20)

是不是类型的关系?
lost_queen 2011-08-10
  • 打赏
  • 举报
回复
嗯,都是升序排列。

sql里面直接order by 结果,负号在0前面

但是.select方法的结果是0在负号前面。

客户希望看到的顺序是和sql排序相同。难道只能自己写?
moxcm 2011-08-10
  • 打赏
  • 举报
回复
对于SQL的,你说的应该是升序,对于DataTable的,如:
[Quote=引用 2 楼 chiyan42 的回复:]

DataTable.Select () 获取所有 DataRow 对象的数组。 由 .NET Compact Framework 支持。

DataTable.Select (String) 按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有 DataRow 对象的数组。 由 .NET Compact Framework 支持。

DataTable.Se……
[/Quote]
pwxcomer 2011-08-10
  • 打赏
  • 举报
回复
DataTable排序?

DataView dv = dt.DefaultView;
dv.Sort = "c1 Asc";
DataTable dt2 = dv.ToTable();
chiyan42 2011-08-10
  • 打赏
  • 举报
回复
如果你一定要实现你的那些功能 只能for循环 一条一条从新自己排列
chiyan42 2011-08-10
  • 打赏
  • 举报
回复
DataTable.Select () 获取所有 DataRow 对象的数组。 由 .NET Compact Framework 支持。

DataTable.Select (String) 按照主键顺序(如果没有主键,则按照添加顺序)获取与筛选条件相匹配的所有 DataRow 对象的数组。 由 .NET Compact Framework 支持。

DataTable.Select (String, String) 获取按照指定的排序顺序且与筛选条件相匹配的所有 DataRow 对象的数组。 由 .NET Compact Framework 支持。

DataTable.Select (String, String, DataViewRowState) 获取与排序顺序中的筛选器以及指定的状态相匹配的所有 DataRow 对象的数组。 由 .NET Compact Framework 支持。

这是msdn给的解释。


lost_queen 2011-08-10
  • 打赏
  • 举报
回复
csdn好热闹,一会儿帖子就没影了。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧