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

时间:2014-12-04 11:42:46

标签: c++ c++builder

目前,我正致力于在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;
}

任何想法为什么会发生?

提前致谢

2 个答案:

答案 0 :(得分:1)

你的未来会有很多痛苦。

无论如何,您遇到的问题是数据库连接。数据库中有一个名为&#34; Function&#34;的字段。持有一个字符串。此字段与String一起使用此程序最初使用的古代数据库驱动程序。你闪亮的新数据库驱动程序告诉VCL期望像Unicode这样的东西,而VCL并不想把这些东西推到普通的String中,所以它希望你准备好WideString在其中推它。

幸运的是,有很多方法可以将VCL击败。您想要做什么,因为您肯定不想通过更改TIBDataSet来重写应用程序的一半,就是告诉连接不要打扰Unicode。为了做到这一点,你必须设置TSQLConnection对象UseUnicode=false,我希望(我无法再测试VCL代码)看起来应该是这样的:

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

connectionTSQLConnection对象的位置。我认为你必须在连接数据库之前这样做。

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

答案 1 :(得分:0)

问题已解决 - 这个字段Function在C ++ Builder设计视图中有其他类型 - 它是TStringField,其余字段有TIBStringField ...

相关问题