Аномалия при переходе с WinXP на Win7
У мена на Windows XP успешно работало приложение, написанное на RADStudio C++ 2010 с использованием локального сервера СУБД MySQL. Перевел машину на Windows 7 и стали вылезать аномалии. Тестовый вариант одного из запросов, дающих сбои приведен ниже:
//---------------------------------------------------------------------------
void __fastcall TForm1::UpdBookBtnClick(TObject *Sender)
{
TADOQuery* ADOQuery2;
ADOQuery2 = new TADOQuery(this);
ADOQuery2->Connection = ADOConn;
String SQL2 =
"UPDATE Book \
SET NbrOfEditions = :ENbr, Volume = :Vol \
WHERE BookNbr = :BNbr2";
ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add(SQL2);
Param3 = ADOQuery2->Parameters->ParamByName("ENbr");
Param3->DataType = ftSmallint;
Param3->Value = StrToInt(NbrOfEditionsEdit->Text);
Param4 = ADOQuery2->Parameters->ParamByName("Vol");
Param4->DataType = ftFloat;
Param4->Value = StrToFloat(BookVolumeEdit->Text);
Param5 = ADOQuery2->Parameters->ParamByName("BNbr2");
Param5->DataType = ftSmallint;
Param5->Value = StrToInt(BookKeyEdit->Text);
ADOQuery2->Prepared = true;
ADOQuery2->ExecSQL();
}
Таблица Book, к которой обращается запрос, была создана следующим SQL скриптом:
CREATE TABLE `book` (
`BookNbr` SMALLINT(6) NOT NULL AUTO_INCREMENT,
`BookName` VARCHAR(50) COLLATE utf8_general_ci DEFAULT NULL,
`AuthorNbr` SMALLINT(6) DEFAULT NULL,
`Volume` DECIMAL(5,2) DEFAULT NULL,
`FirstPub` SMALLINT(6) UNSIGNED DEFAULT NULL,
`NbrOfEditions` SMALLINT(6) DEFAULT NULL,
`Comment` VARCHAR(60) COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`BookNbr`) COMMENT ''
)ENGINE=InnoDB
Запросы были написаны в соответствие с рекомендациями из статьи
ms-help://embatcadero.rs2010/codesamples/ADOQuery_(C++).html и при работе в Windows XP все работало без аномалий.
После переноса задачи на машину с Windows 7, запросы дают правильные результаты, но, по крайней мере, в половине случаев при исполнении запроса происходит остановка и выдается сообщение класса EOleException: «Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом». Если в окне сообщения нажать кнопку “Continue”, то запрос выполняется и его результат правильный. Это означает, что аргументы имели правильное значение, а сообщение об ошибке было ложным. Даже при повторении запроса без изменения аргументов, остановки то происходят, то нет. В этой же среде Windows 7 компиляция очень большой С++ Builder программы и ее исполнение при работе с той же базой при работе с данными через компоненту TADOTable происходят без аномалий. Что бы это могло означать и как от такой остановки избавиться?
У меня Windows 7 (32 bit), MySQL 5.5.25 и MySQL ODBC Connector 5.3.4-Win32