You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ADO中替代Delphi/Paradox TTable.SetRange的实现方案咨询

解决ADO替代TTable.SetRange的问题

问题分析

原Paradox代码通过SetRange基于复合索引快速定位记录,而ADO的Filter是客户端层面的过滤机制,不仅效率低下,还可能因字段类型、语法规则差异导致结果不符合预期。

最优替代方案:直接使用SQL查询(推荐)

ADO更适合通过SQL语句在服务器端直接筛选数据,既避免客户端加载冗余数据,逻辑上也完全匹配SetRange的作用:

替代SopHeads的SetRange逻辑

dm.SopHeads.Close;
dm.SopHeads.SQL.Text := 'SELECT * FROM SopHeads WHERE OrderNo = :OrderNo AND LineNo = 0';
dm.SopHeads.Parameters.ParamByName('OrderNo').Value := OrderNumber;
dm.SopHeads.Open;

替代SopLines的SetRange逻辑

dm.SopLines.Close;
dm.SopLines.SQL.Text := 'SELECT * FROM SopLines WHERE OrderNo = :OrderNo AND LineNo BETWEEN 0 AND 999';
dm.SopLines.Parameters.ParamByName('OrderNo').Value := OrderNumber;
dm.SopLines.Open;

采用参数化查询既能避免SQL注入风险,还能自动适配字段类型(无需手动处理数值/字符串的格式差异)

若必须使用Filter(仅适合小数据集)

如果需要保留全量数据集加载后过滤的模式,需修正以下问题:

  • 字段类型适配:如果OrderNo是字符串类型,需为值添加单引号:
    Globals.WkStrg := 'OrderNo = ''' + IntToStr(OrderNumber) + ''' And LineNo = 0';
    
  • 确保数据集已加载全部记录:调用Open后需确认数据已完整取回(比如TADOQuery的SQL需为全表查询)
  • 字段名一致性:确认代码中使用的OrderNo、LineNo与数据库表中的字段名完全匹配

单条记录定位的替代方法

针对SopHeads这种仅需定位单条记录的场景,可使用Locate方法,利用索引提升效率:

dm.SopHeads.Locate('OrderNo;LineNo', VarArrayOf([OrderNumber, 0]), []);

内容的提问来源于stack exchange,提问作者Patrick Fleck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:25:33