0

我有一个通过 BDE 使用 Paradox 数据库的 Delphi 7 应用程序,我已将其转换为 Delphi XE3 和 Firebird。Paradox 数据库中有一个字符串字段,其中包含一个加密字符串,据称该字符串用于软件许可。问题是,虽然在旧程序 (D7/Paradox) 中读取此字符串的例程运行良好,但在新程序 (XE3/Firebird) 中,该例程会引发错误。我通过调试发现的原因是从数据库中读取的字符串不同。我怎样才能解决这个问题?

旧 Paradox 数据库中的字符串:

Ng-DrLrDOtfâtD89D1'D'îu

新 Firebird 数据库中的字符串:

Ng-DrLrDOtfâtD89D1'D'îu

正如您在上面看到的,两个数据库中的字符串是相同的。

在新的 Delphi XE3 程序中,当我尝试使用 FieldByName('fieldname').AsString 获取字段的值时,使用 UniDAC 数据访问组件,这是返回的内容:

Ng-DrLrDOtfâtD89D1'D'îu

你可以看到有几个字符是不同的。这导致在程序中检查此字符串的例程中出现错误。你以前有过这种经历吗?这个问题的可能原因是什么,我可以采取哪些步骤来解决这个问题。

注 1:我使用我在 Delphi 中编写的转换器将 Paradox 数据库转换为 Firebird(有关此转换器的实际代码,请参阅:http: //goo.gl/6xu2ST

注意 2:我使用 DEFAULT CHARACTER SET UTF8 创建了数据库,并且 UniDAC 连接组件 (TUniConnection) 已将 SpecificOptions CharSet 设置为“UTF8”。

4

1 回答 1

3

我通过以下方式解决了这个问题:

  1. 在数据模块或代码中,将 TUniConnection 组件属性 SpecificOptions UseUnicode 设置为 True。

  2. 关闭项目和 Delphi IDE。打开 WinGrep 并在所有项目 PAS 和 DFM 文件中为字符串执行查找替换:TStringField,将其更改为 TWideStringField。

  3. 重新编译。

瞧,它的工作完美!由于数据库中 Unicode 字符的翻译/解释不完整而导致的运行时错误已经消失。

感谢之前回复的大家。

于 2013-07-31T02:00:09.023 回答