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++. Прикладные вопросы'
Re: MSDAORA & SQLOLEDB в чем разница в использовании
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 03.10.05 11:16
Оценка: +3
Здравствуйте, podaa, Вы писали:

P>скачал новую библиотеку msdaora.dll — то же самое...


Есть еще родной OLEDB провайдер от самого Оракла. Не пробовал?

По моему субъективному впечатлению — он реально получше.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: MSDAORA & SQLOLEDB в чем разница в использовании
От: podaa Россия  
Дата: 04.10.05 02:21
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>Есть еще родной OLEDB провайдер от самого Оракла. Не пробовал?


КД>По моему субъективному впечатлению — он реально получше.


буду пробовать...
просто интересен сам принцип обеспечения самовостановления приложения (тем более если это служба и она трудится годами без перезагрузки, вернее трудилась... пока все данные были на MSSQL) при коннекте через OLEDB... причем как пишут в достоинствах — мол единообразный доступ к различным данным... и багах пока ничего не нашел про это дело... может ларчик проще открывается — в CDBPropSet нужно какое-нибудь специфическое свойсво выставить...
еще вопрос — родной провайдер с клиентом оракловским ставится? какой у него ProgID ?

спасибо за совет!
Re[3]: MSDAORA & SQLOLEDB в чем разница в использовании
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 04.10.05 03:08
Оценка:
Здравствуйте, podaa, Вы писали:

P>причем как пишут в достоинствах — мол единообразный доступ к различным данным...


Формально это так. На практике... ну я, например, знаю ловушки для неискушенного пользователя, в которые он сам рад попадаться. Думать-то никто не хочет

P>может ларчик проще открывается — в CDBPropSet нужно какое-нибудь специфическое свойсво выставить...


Посмотри свойства через "Rowset Viewer" — это очень полезная хреновина из MDAC SDK

P>еще вопрос — родной провайдер с клиентом оракловским ставится?


Да. Может есть способ попроще, но я его не знаю.

P>какой у него ProgID ?

Насчет ProgID — что-то типа "ORAOLEDB". Через "Rowset Viewer" увидешь
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: MSDAORA & SQLOLEDB в чем разница в использовании
От: podaa Россия  
Дата: 06.10.05 02:46
Оценка:
Доброго времени суток!
долго и упорно искал провайдера от производителя БД
наконец нашел — поставился он _только_ если ставить базу данных (в клиенте нет ни в одной кофигурации) причем Oracle9i , в дистрибутиве 8-го такого зверя не оказалось совсем. Там всего то 8 dll и один tlb файлик (все вместе около 800 кб) (интересно почему на сайте оракла дистрибутив этого дела весит 120 мб?)
и самое интересное — все работает!!! в программе не поменял ни строчки кроме ProgID конечно... и все стало на свои места...

огромное спасибо за совет
(с MSDAORA надобы конечно повоевать до победного... но опосля...)
Re[5]: MSDAORA & SQLOLEDB в чем разница в использовании
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 06.10.05 03:23
Оценка:
Здравствуйте, podaa, Вы писали:

P>Доброго времени суток!

P>долго и упорно искал провайдера от производителя БД
P>и самое интересное — все работает!!! в программе не поменял ни строчки кроме ProgID конечно... и все стало на свои места...

Ну, это, типа ты главное помни, что приличные OLEDB провайдеры могут писать не только производители DBMS
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[6]: MSDAORA & SQLOLEDB в чем разница в использовании
От: Аноним  
Дата: 18.10.05 10:01
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, podaa, Вы писали:



P>>Доброго времени суток!

P>>долго и упорно искал провайдера от производителя БД
P>>и самое интересное — все работает!!! в программе не поменял ни строчки кроме ProgID конечно... и все стало на свои места...

КД>Ну, это, типа ты главное помни, что приличные OLEDB провайдеры могут писать не только производители DBMS


поспешил я тады со "своими местами" малехо... да закрутился и сразу не написал про это
у родного провайдера оказалось интересное свойство — он нуль в конец строк в возвращаемых параметрах не ставит... ну думаю — удивил, взял всю строку нулями заполнил (это OUTPUT параметр) перед вызовом... и тут удивлению не было предела — ERRORSINCOMMAND стало возвращать при выполнении... команда осталась старая — я просто память под параметр (возвращаемый!!!) нулями забил (забивал полностью, ставил только первый байт нулевой, ради прикола записывал туда какую-нить строчку — эффект один — ERRORSINCOMMAND) пока не победил, переменные где в сгенеренном для хранимой процедуры классе хранится длина возвращаемой строки не нашел...
ну обернул я старый вызов (с родным провайдером) в __try {} __except(EXCEPTION_EXECUTE_HANDLER){/*тут нечто сохраняющее лог*/}
под отладчиком работать плохо — останавливает конечно, но что самое интересно — когда запускаю не под отладчиком, и debug и release версию — в блок __except не попало еще ни разу (работает все время ровно неделю, связь конечно не пропадает все время, но по специфике работы иногда делается дисконнект от базы (там xml чего то где то криво накапливает — сессия потихоньку но неумолимо замедляется, пока админы ищут приччину — работать то надо...))
одно настораживает — что не попало _пока_... обнадежишься по этому поводу а оно рухнет совсем в самый неподходящий момент...

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.