WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Странная ошибка при использовании ADO

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Странная ошибка при использовании ADO
zenon опубликован 11-04-2001 05:47 MSK   Click Here to See the Profile for zenon   Click Here to Email zenon  
Возможно, кому-то это покажется ерундой, но я такое вижу впервые. Суть в следующем: есть массив объектов СMyObject. Каждый из этих обьектов содержит данные, скажем, на человека. Упрощенно, как бы телефонный
справочник. Данный массив отображается с помощью CListCtrl. Все нормально работает.
Добавил запись в обьекты СMyObject из Access'а с помощью ADO, и стала происходить интересная вещь. Загрузка данных
нормально происходит, но когда я закрываю приложение, выскакивает "Программа выполнила недопустимую ошибку..." и в подробностях, значит, написано, что сбой произошел в модуле User32.dll. Самое интересное, что
эта ошибка может вылезти, а может и не вылезти. На двадцать запусков программы с точным повторением всех действий один-два раза выскакивает эта ошибка. Никакой закономерности не смог определить. Я ни разу
еще не вызывал сбой в User32.dll, все обычно в mfc...dll. И ни какой закономерности!
Руки, конечно, мне править нужно. Только куда? Может кто-нибудь намекнет, в какую сторону думать.
Большое спасибо.

Если кому-то не надоело читать мое занудство, то вот кусок кода запроса к базе данных (обычный вроде код из MSDN). C ним, должно быть, это связано. Упрощенно:

void CMyDoc::ImportFromDB(CString str) // Запрос я формирую в другом месте
{
HRESULT hr = S_OK;
if(FAILED(::CoInitialize(NULL)))
return;
_ConnectionPtr pConn = NULL;
_RecordsetPtr pRs = NULL;
try
{
pConn.CreateInstance(__uuidof(Connection));
pRs.CreateInstance(__uuidof(Recordset));
pConn->Open("Personal","","",adConnectUnspecified);
_bstr_t strQuery(str);
pRs->Open(strQuery, _variant_t((IDispatch*)pConn,true),
adOpenStatic, adLockReadOnly, adCmdText);
pRs->MoveFirst();
if( pRs->EndOfFile )
{
AfxMessageBox("Recordset empty");
}
else
{
CString sLname;
_bstr_t bstrLname;
while(!(pRs->EndOfFile))
{ // Cколько строчек в Access'е, столько, значит, и новых CMyObject
bstrLname = pRs->Fields->GetItem("lname")->Value;
sLname.Format("%s",(LPCSTR)bstrLname);
CMyObject *p = new CMyObject(sLname);
myArr.Add(p);
p->sLname=sLname;
pRs->MoveNext();
}
}
pRs->Close();
pConn->Close();
}
catch (_com_error &e)
{
}
::CoUninitialize();
}

==========================
Стек: USER32! bff558ba()
KERNEL32! bff7363b()
KERNEL32! bff942e7()
QuickWatch:
BFF558BA CXX0017:Error:symbol "BFF558BA" not found

aldep опубликован 11-04-2001 21:06 MSK     Click Here to See the Profile for aldep  Click Here to Email aldep     
Точный ответ сказать сложно но вот несколько замечаний.

1. Не вызывается CoUninitialize если нет ошибки.

2. А если есть ошибка еще хреновее, так как ты сначало вызываешь CoUninitialize, а потом вызываются деструкторы Connection и Recordset'a, а ведь в этих деструкторах IUnknow->Release() вызывается.

3. Я обычно использовал следующую схему соединения с БД
pConn.Connect .....;
pRS=pConn.Execute("SELECT * FROM ....");
Она всегда работала.

zenon опубликован 13-04-2001 18:28 MSK     Click Here to See the Profile for zenon  Click Here to Email zenon     
Спасибо за помощь!
Проблема была с ресурсами - довольно хитрый алгоритм записи полученных данных в обьекты.
Запутался конкретно. Память и утекла!

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.