在Borland C++Builder XE下编译旧的C++类
Compiling old C++ classes under Borland C++Builder XE
目前,我正在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");
其中connection
是TSQLConnection
对象。我认为您必须在连接到数据库之前执行此操作。
如果这不起作用,请查看是否可以将数据库驱动程序配置为不使用 Unicode。
已解决 - 这个字段Function
在生成器设计视图中C++具有其他类型的 - 它被TStringField
,其余字段TIBStringField
...