C# Windows Forms中sang.mdf数据库slno列升序排序失效问题
解决C# WinForms中slno列排序异常的问题
嘿,这个问题我之前开发时也踩过一模一样的坑!你看到的1、10、11、12、13、2、20、21、3、4、5这种排序结果,是典型的字符串字典序排序——这说明你的slno列在sang.mdf数据库的printi表里,是varchar/nvarchar这类字符串类型,而非int/bigint数值类型。
问题根源
字符串排序是逐个字符比较ASCII码的:比如"10"的第一个字符是"1",比"2"的第一个字符"2"的ASCII码更小,所以"10"会排在"2"前面,完全不符合我们对序列号的数值排序预期。
两种解决方案
1. 修改数据库列类型(推荐)
如果slno本质就是数值型的序列号,直接修改数据库列类型是最彻底的解决办法:
- 打开你的数据库管理工具(比如SQL Server Management Studio),找到
sang.mdf中的printi表 - 将
slno列的数据类型改为int(如果序列号可能很大,就用bigint) - 保存修改后,你原来的C#代码不用做任何改动,排序就会按数值升序正常工作了。
2. 不改数据库,在SQL中转换类型排序
如果暂时无法修改数据库结构,可以在SQL语句里把slno转换成数值类型后再排序,用CAST或CONVERT函数都可以:
修改后的SQL语句如下:
select slno, date, name, total from printi ORDER BY CAST(slno AS INT) ASC
对应的C#代码调整为:
SqlDataAdapter sda = new SqlDataAdapter("select slno, date, name, total from printi ORDER BY CAST(slno AS INT) ASC", con); DataSet ds = new DataSet(); sda.Fill(ds); dataGridView1.DataSource = ds.Tables[0]; con.Close();
注意:这个方法要求
slno列的所有内容都是纯数字字符串,如果有非数字内容,转换时会抛出SQL异常。
小提示
如果数据量不大,也可以在DataGridView的排序事件里处理,但数据库层面的排序效率更高,尤其是数据行数较多的时候。
内容的提问来源于stack exchange,提问作者Abijith C
相关产品推荐
相关产品推荐

