C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Ошибка при работе TQuery
Hunter
Отправлено: 22.09.2005, 08:00


Не зарегистрирован







здравствуйте! при выполнении запроса к бд access с помощью TQuery Code Guard отлавливает следующее: Method called on illegally casted object: Attempt to access 32 byte(s) at xxx. The 'this' pointer points to heap block xxx which is only 28 bytes long. Останов происходит в следующем коде TField* operator[](int Index) { return Fields[Index]; } внутри vcl. причем сама программа работает правильно и ошибок не выдает.
Вызывающий код:
Query1->Params->Items[0]->AsInteger=id;
Query1->Active=true;
r_cnt=Query1->RecordCount;
Query1->First();
for(int j=0;j {
pts[j]=Query1->Fields->operator [](0)->AsFloat;//здесь происходит ошибка
Query1->Next();
}
Query1->Active=false;
В чем может быть дело? BCB6 update 1
спасибо
AVC
Отправлено: 22.09.2005, 08:08


Ветеран

Группа: Модератор
Сообщений: 1583



А почему не написать просто как в хелпе
Query1->Fields->Fields[j]->AsFloat
?
Hunter
Отправлено: 22.09.2005, 08:30


Не зарегистрирован







Спасибо... помогло... чо то я намудрил...javascript:emoticon('ohmy.gif')
olegenty
Отправлено: 22.09.2005, 08:43


Ветеран

Группа: Модератор
Сообщений: 2412



но стиль написания кода происходит от слова ужас ohmy.gif ... подобный код чреват ДОЛГИМ поиском ошибок.

1. Обращаться к параметрам по индексу... ну, а если спецификация параметров изменится, при том произойдёт просто смена тех же самых параметров местами?
2. То же самое касается полей
3. Ориентация на RecordCount??? Да Вы, Батенька, оптимист! (Не знаю уж, в каком поколении)
4. Ну и ориентированный на RecordCount цикл, как следствие п.3., невредно заменить на:
CODE

try
{
   for (Query->Open(); !Query->Eof; Query->Next())
   {
       ... // чё-то сделать оптом, либо в розницу
   }
} __finally
{
   if (Query->Active) Query->Close();
}

Вернуться в Работа с базами данных в C++Builder