在Borland C++Builder XE下编译旧的C++类

Compiling old C++ classes under Borland C++Builder XE

本文关键字:C++ 编译 Borland C++Builder XE      更新时间:2023-10-16

目前,我正在C++ Builder XE下编译旧的.cpp类。除了许多麻烦之外,还有一个我完全不知道如何解决。

我的代码:

String txt = "<Not so long sql query>";
int licz =  some_function(txt, dzeFDS);    //1
//assigning licz to somewhere
txt = "<much longer query>";
licz =  some_function(txt, budFDS);        //2

问题是在第二次调用程序期间some_function程序停止,我有此警报: First chance exception at $75A1C42D. Exception class EDatabaseError with message 'budFDS: Type mismatch for field 'Function', expecting: String actual: WideString'. Process Call.exe (1896)

这是奇怪的形式,因为第一次调用some_function工作正常,但第二个调用(具有相同类型的参数(则不然。

some_function代码:

int __fastcall some_function(String txt, TIBDataSet *firDS)
{
   firDS->Close();
   firDS->SelectSQL->Text = txt;
   firDS->Open();               //during debugging, exception occurs in this line
   int count = 0;
   while(!firDS->Eof)
   { count++;
     firDS->Next();
   }
   return count;
}

任何想法为什么会发生?

提前致谢

你的未来有很多痛苦。

无论如何,您遇到的问题在于数据库连接。数据库中有一个名为"Function"的字段,用于保存字符串。此字段与该程序最初使用的古老数据库驱动程序String。你闪亮的新数据库驱动程序告诉VCL期待Unicode这样的东西,而VCL不喜欢把这些东西塞进普通的String,所以它希望你有一个准备好的WideString来推它。

幸运的是,有一些方法可以击败VCL屈服。由于您肯定不想通过更改TIBDataSet来重写一半的应用程序,因此您要做的是告诉连接不要打扰Unicode。为此,您必须使用 UseUnicode=false 设置TSQLConnection对象,我希望(我无法再测试 VCL 代码(应该如下所示:

connection->Params->Add("UseUnicode=false");

其中connectionTSQLConnection对象。我认为您必须在连接到数据库之前执行此操作。

如果这不起作用,请查看是否可以将数据库驱动程序配置为不使用 Unicode。

问题

已解决 - 这个字段Function在生成器设计视图中C++具有其他类型的 - 它被TStringField,其余字段TIBStringField...