我有一个Delphi 7应用程序,通过BDE使用Paradox数据库,我已经将其转换为Delphi XE3和Firebird。Paradox数据库中有一个字符串字段,其中包含一个加密字符串,据称该字符串用于软件的许可。问题是,虽然在旧程序(D7/Pladox)中读取该字符串的例程运行良好,但在新程序(XE3/Firebird)中,该例程抛出了一个错误。我通过调试发现的原因是从数据库中读取的字符串不同。我该怎么解决这个问题?
旧Paradox数据库中的字符串:
Ng DrLrDOtfâtD89D1‘D’îu
新火鸟数据库中的字符串:
Ng DrLrDOtfâtD89D1‘D’îu
正如您在上面看到的,两个数据库中的字符串是相同的。
在新的DelphiXE3程序中,使用UniDAC数据访问组件时,我试图使用FieldByName("fieldname")获取字段的值
Ng DrLrDOtfãtD89D1‘D’âu
你可以看到有几个角色是不同的。这导致在程序中检查此字符串的例程出错。你以前经历过这种情况吗?这个问题的可能原因是什么?我可以采取什么措施来解决这个问题。
注1:我使用Delphi中编写的转换器将Paradox数据库转换为Firebird(有关此转换器的实际代码,请参阅:http://goo.gl/6xu2ST)
注2:我用DEFAULT CHARACTER SET UTF8创建了数据库,UniDAC连接组件(TUniConnection)的SpecificOptions CharSet设置为"UTF8"。
我通过以下方式解决了问题:
-
在数据模块或代码中,将TUniConnection组件特性SpecificOptions UseUnicode设置为True。
-
关闭项目和Delphi IDE。打开WinGrep,在所有项目PAS和DFM文件中为字符串TStringField执行Find Replace,将其更改为TWideStringField。
-
重新编译。
瞧,它工作得很完美!由于数据库中Unicode字符的翻译/解释不完整而导致的运行时错误已经消失。
感谢大家早些时候的回复。