Delphi 如何设置TDBGrid排序中的字符顺序?

Delphi 如何设置TDBGrid排序中的字符顺序?,delphi,sorting,oracle10g,delphi-2007,tdbgrid,Delphi,Sorting,Oracle10g,Delphi 2007,Tdbgrid,我正在使用连接到TDataSource的TDBGrid。 此TDataSource使用TADOQuery作为其数据集。 TADOQuery连接到Oracle10g数据库并保存以下查询: SELECT ST.desc FROM my.subsection ST WHERE ST.date_disp = :dated ORDER BY ST.desc ST.desc是一个字符串,通常包含以下数据: '1st place' '2nd place' 'A zone' 'Her zone' 'My

我正在使用连接到TDataSource的TDBGrid。 此TDataSource使用TADOQuery作为其数据集。 TADOQuery连接到Oracle10g数据库并保存以下查询:

SELECT ST.desc
FROM my.subsection ST
WHERE  ST.date_disp  = :dated
ORDER BY ST.desc
ST.desc是一个字符串,通常包含以下数据:

'1st place'
'2nd place'
'A zone'
'Her zone'
'My zone'
'Zone'
除了在SQLTools中运行查询时,它首先返回按字母排序的数据,然后返回按数字排序的数据外,其他一切都可以正常工作。 e、 g:

但是当我运行应用程序时,结果是先是数字,然后是字母!e、 g:

'1st place'
'2nd place'
'A zone'
'Her zone'
'My zone'
'Zone'
我发现Oracle使用了一种排序语言()和另一种Delphi组件(TDBGrid或TDataSource?)

然后,我尝试使查询结果符合Delphi的组件顺序,即数字然后字母。但这并不理想,因为用户的自然顺序是字母,然后是数字


有人知道我如何确定哪个组件正在“重新排序”数据,以及我如何使两个排序顺序相同吗?

您可以使用NLSSORT函数指定使用何种排序/比较

SELECT ST.desc
FROM my.subsection ST
WHERE  ST.date_disp  = :dated
ORDER BY 
  NLSSORT(ST.desc, 'NLS_SORT=BINARY_AI')
除了指定第二个参数,您还可以仅使用该值调用nlssort,并在会话中设置默认排序(连接到数据库后)。这样做的好处是,您可以方便地在以后对其进行全局更改,甚至让用户选择他们最喜欢的排序方式:

ALTER SESSION SET NLS_SORT = 'BINARY_AI';
相反,您可以检查当前排序:

select value from v$nls_parameters
WHERE parameter = 'NLS_SORT'

这听起来像是Oracle将
NLS\u排序
或至少
NLS\u语言
设置为与您进行测试的计算机的语言编码不同的编码。首先,我将取消查询组件的
Tdatasource
链接,并检查元素返回的顺序。您说的“我将取消查询组件的Tdatasource链接”是什么意思?我已经检查过了,他们都退回了不同的订单。。。整个问题是关于如何检查/更改Delphi中组件使用的语言。
TDbGrid
本身不进行排序。它只是用来显示数据。排序(如果完成)通常由查询组件来完成。我不相信这一点,@GuillemVicens。请阅读下面的更多细节。我必须说我同意@GolezTrol在他最后的评论中所说的。排序几乎肯定是由ADO组件完成的。不确定是否有,但可以尝试检查是否有最新的Oracle ADO驱动程序以及最新的ADO版本。希望你能找到解决办法:-)谢谢@GolezTrol,但我已经把它作为解决办法了。我现在需要的是知道如何使Delphi坚持Oracle的排序顺序,而不是相反。Delphi将使用数据集的排序,数据集应按返回的顺序包含记录。我想说的是Oracle没有一个排序,但允许您指定它。如果您自己不做任何排序,那么就是这种配置差异导致了问题。我认为驱动程序可能会根据系统的区域设置来设置会话的排序。因此,要检查应用程序的设置是否真的与SQLTools的设置相同,可以执行我添加到帖子中的查询。它允许您检查NLS参数。如果它们是相同的,那么在从数据库获取结果后,可能会在Delphi中应用一些排序。oooook.:)我一点也不清楚你自己做了些分类那样的话,我认为你运气不好。做排序的根本不是Delphi。TAdoDataSet只是ADO记录集接口的包装器。正是该接口的实现完成了排序。如果设置了Sort属性,最终将调用TCustomADODataSet.InternalSetSort(值:WideString),它将调用Recordset.Sort。之后,继续搜索的最佳位置是。也许TClientDataSet提供了更多进行自定义排序的可能性。如果是这样,您可以将TDataSetProvider链接到ADODataSet,并将TClientDataSet链接到该提供程序。之后,您可以在clientdataset上对筛选进行排序,尽管我不确定是否有可能更改TClientDataSet的排序方式。
select value from v$nls_parameters
WHERE parameter = 'NLS_SORT'