在LDW模式下使用TFDTable时,降序字段会导致重复行。例如:
TFDTable.TableName is set to a VIEW name (not a tablename)
TFDTable.UpdateOptions.KeyFields is set to the primary key in the VIEW base table.
TFDTable.IndexFieldNames is set to 'PERS_NAME:A'.
显示正确的结果集,没有任何重复。如果我将 IndexFieldnames更改为“PERS_NAME:D”,则视图返回的每条记录都会显示两次或树次。
如何避免这些重复?它只会在按降序排序表时发生,无论我用哪个字段进行排序。
更新 您可以找到一个示例项目来重现github上的问题:https://github.com/cytrinox/firedac-sort-issue或通过https://github.com/cytrinox/firedac-sort-issue/archive/master.zip下载项目
答案 0 :(得分:2)
此问题将持续存在,直到我们在LDW模式下获得其他处理TFDTable的方法。
将LDW与基于数字之外的任何索引(即整数)一起使用会让你遇到各种各样的问题 - 如果你不遵守规则的话。
我也花了好几个小时试图让LDW使用索引的VARCHAR字段 - 但让我的SQL语句使用COLLATE(或直接整理字段的字符集)会使我的应用程序无用。这意味着它会因您描述的错误而崩溃。
以下是我从FireDAC的作者那里获得的信息。
由于概念,有1001种方法使LDW失败。没有意义也没有能力使客户端排序同步 在所有情况下使用服务器端排序校对。我,你什么时候 在字符串字段上对TFDTable进行排序,在更多情况下可能会失败 谁都可以想象。两种方式:
- 您正在理解为什么会发生这种情况并尝试调整FireDAC客户端排序,如上所述。我不能提供所有选择 - 太多了。
- 你不理解 - 那么最好不要在字符串列上排序TFDTable,甚至不要使用TFDTable。
你上面的段落 当你被允许使用TFDTable和时,可以考虑作为合同 什么时候没有。
Personaly我很乐意看到LDW在没有内部排序的情况下运行。 如果我们可以禁用排序并让它处理数据分页 - 那就太好了。
修改强>
想一想 - 尝试使用TFDQuery而不是TFDTable。 TFDQuery不支持LDW,那么你应该好好去。
希望这会对你有所帮助。
答案 1 :(得分:0)
我遇到了与FireDAC和PostgreSQL相同的问题。我决定继续使用TFDTable,但我创建了一个简单的视图。
对于您需要显示的每个表,请使用简单的SQL代码创建一个视图:
CREATE VIEW my_view AS
SELECT * FROM my_table;
然后,您可以从TFDTable.TableName列表中选择my_view
。问题不会出现。
答案 2 :(得分:0)
这个答案可能有点晚了,但我昨天遇到了同样的问题,将来可以帮助其他人。
问题与字符串类型索引的内部排序有关。
我们解决这个问题的方法是在连接中更改此设置:
FDConnection.FormatOptions.SortLocale:= 0;
最好的问候