MSDAORA & SQLOLEDB в чем разница в использовании
От: podaa Россия  
Дата: 03.10.05 11:02
Оценка:
Доброго времени суток, ALL!!!
давненько использую OLEDB для доступа к базам (ATL). В основном к MSSQL. поэтому поддержку восстановления при сбое отлаживал на нем.
работает след образом
при первом обращении к базе вызывается:
HRESULT ColeDB_base::OpenDataSource(void)
{
if (m_session) return S_OK;
HRESULT hr=S_FALSE;
while(!m_session)
{
CDataSource db;
CDBPropSet dbinit(DBPROPSET_DBINIT);

dbinit.AddProperty(DBPROP_AUTH_PASSWORD, db_passw.c_str());
dbinit.AddProperty(DBPROP_AUTH_USERID, db_user.c_str());
if (m_bs==MSSQL) dbinit.AddProperty(DBPROP_INIT_CATALOG, db_base.c_str());
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, db_server.c_str());
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1049);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
switch(m_bs)
{
case MSSQL:
hr = db.Open(_T("SQLOLEDB.1"), &dbinit);
break;
case ORA:
hr = db.Open(_T("MSDAORA"), &dbinit);
break;
}
if (FAILED(hr))
{
continue;
}
m_session = new CSession;
if (!m_session) continue;
hr = m_session->Open(db);
if (SUCCEEDED(hr))
{
m_connect = true;
return hr;
}
if (m_session)
{
delete m_session;
m_session=NULL;
}
}
return hr;
}

если что-то случилось то уничтожается объект CSession (m_session), а при след обращении к базе создается новый объект CSession этим же кодом...
это работает уже не первый год... но с MSSQL. как я наивно считал что и с MSDAORA тоже работает и даже не проверял
но рак на горе свистнул — пропало соединение с сервером oracle и оказалось что это не работает
строка hr = db.Open(_T("MSDAORA"), &dbinit); вываливает в int 3... причем где то в недрах NTDLL...
где смотреть? как обеспечить постоянное и надежное соединение (если где то что-то упало чтоб оно само могло восстановиться) на OLEDB ? причем независимо от провайдера...
пишу код одинковый — только меняю сервера — то MSSQL, то ORACLE, с MSSQL все замечательно (искуственно вставляю дисконнект с базой (уничтожающий m_session)). Стоит пересобрать тестовый проект для работы с ORACLE — первый вызов хранимой процедуры успешен, дисконнект успешен, а повторный вызов db.Open(_T("MSDAORA"), &dbinit); ломается — HEAP: Free Heap block 1b9fd40 modified at 1b9ff08 after it was freed.

извиняюсь что утомил... неделю бьюсь — ни в какую...
скачал новую библиотеку msdaora.dll — то же самое...

очень надеюсь на Ваш совет!!!
заранее огромное спасибо за внимание!!!



03.10.05 16:02: Перенесено из 'C/C++. Прикладные вопросы'
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.