我熟悉Jeff Atwood 关于错误总是程序员的错的文章,但我相信我确实在 Delphi .pas 文件中发现了一个错误。
具体来说,我使用的是 Delphi 2007,错误位于 DBCommon.pas 文件的第 955 行,该文件在我的机器上位于此处:
C:\program files\codegear\rad studio\5.0\source\Win32\db\DBCommon.pas
代码是这样的:
...
FieldIndex := StrToInt(Token);
if DataSet.FieldCount >= FieldIndex then
LastField := DataSet.Fields[FieldIndex-1].FieldName else
...
如果 "Token" 的值为零,那么我们尝试访问 DataSet.Fields 的索引 -1,导致列表索引越界错误。
这个错误不会向用户提出,因为它是在它变得那么高之前被处理的,但是每次发生这种情况时让调试器中断是非常令人恼火的。
我可以“忽略这种异常类型”,但索引越界错误很常见,我不想普遍忽略它们。
导致 FieldIndex 为零的情况是当您有一个其 ORDER BY 包含函数的 SELECT 语句时,如:
ORDER BY
CASE WHEN FIELD1 = FIELD3 THEN 1 ELSE 2 END
,CASE WHEN FIELD2 = FIELD4 THEN 1 ELSE 2 END
我可以修复 DBCommon.pas 中的错误,但 Delphi 不会重新编译自己,我的更改也不会生效。如果我重命名 .DCU 文件,它只会抱怨找不到“DBCommon.dcu”。
所以(最后)我的问题是:我可以用我的修复重新编译 DBCommon.pas,如果可以,如何?