目前,我正致力于在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;
}
任何想法为什么会发生?
提前致谢
答案 0 :(得分:1)
你的未来会有很多痛苦。
无论如何,您遇到的问题是数据库连接。数据库中有一个名为&#34; Function&#34;的字段。持有一个字符串。此字段与String
一起使用此程序最初使用的古代数据库驱动程序。你闪亮的新数据库驱动程序告诉VCL期望像Unicode这样的东西,而VCL并不想把这些东西推到普通的String
中,所以它希望你准备好WideString
在其中推它。
幸运的是,有很多方法可以将VCL击败。您想要做什么,因为您肯定不想通过更改TIBDataSet
来重写应用程序的一半,就是告诉连接不要打扰Unicode。为了做到这一点,你必须设置TSQLConnection
对象UseUnicode=false
,我希望(我无法再测试VCL代码)看起来应该是这样的:
connection->Params->Add("UseUnicode=false");
connection
是TSQLConnection
对象的位置。我认为你必须在连接数据库之前这样做。
如果这不起作用,请查看是否可以将数据库驱动程序配置为不使用Unicode。
答案 1 :(得分:0)
问题已解决 - 这个字段Function
在C ++ Builder设计视图中有其他类型 - 它是TStringField
,其余字段有TIBStringField
...