Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / CDatabase exception / 11 сообщений из 11, страница 1 из 1
20.07.2005, 11:57
    #33175400
kxmep
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
Пишу следующий код (примерно):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
try
{
СDatabase MyDB;

MyBD.OpenEx(_T( "DSN=my_odbc;UID=user;PWD=1234;" ), CDatabase::noOdbcDialog);
	
MyDB.ExecuteSQL("{CALL sp_Any_Procedure()}");

MyDB.Close();
}
catch(...)
{
}

Запускаю - все замечательно.

Но предположим, что хп с именем sp_Any_Procedure не существует, тогда CDatabase "ругается" в виде еррор меседжа (что мне абсолютно не надо), т.е. никогда не происходит исключения, которое я могу обработать (а именно ничего не делать).

Подскажите как побороть этот еррор меседж?

Код: plaintext
 kxmep 
...
Рейтинг: 0 / 0
20.07.2005, 12:19
    #33175473
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
Врёшь ты всё. Написал, точно такой код, всё работает.

(драйвер MSAccess)
...
Рейтинг: 0 / 0
20.07.2005, 13:06
    #33175642
kxmep
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
К сожалению, не вру :(

У меня:
1. Сервер: MS SQL Server
2. Источник ODBC: System DSN (my_odbc)

Возможно с MSAccess работает. Хотя я сомневаюсь, т.к. в ExecuteSQL вызывается AFX_ODBC_CALL с последующим AfxThrowDBException, который в свою очередб обрабатывается в wincore.cpp:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
CATCH_ALL(e)
	{
		lResult = AfxProcessWndProcException(e, &pThreadState->m_lastSentMsg);
		TRACE(traceAppMsg,  0 , "Warning: Uncaught exception in WindowProc (returning %ld).\n",
			lResult);
		DELETE_EXCEPTION(e);
	}

так вот, функция AfxProcessWndProcException отображает месадж, который мне не нужен. А до моего обработчика вообще никогда ошибка не "доходит".

Код: plaintext
 kxmep 
...
Рейтинг: 0 / 0
20.07.2005, 13:47
    #33175796
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
kxmepПишу следующий код (примерно):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
try
{
СDatabase MyDB;

MyBD.OpenEx(_T( "DSN=my_odbc;UID=user;PWD=1234;" ), CDatabase::noOdbcDialog);
	
MyDB.ExecuteSQL("{CALL sp_Any_Procedure()}");

MyDB.Close();
}
catch(...)
{
}

Запускаю - все замечательно.

Но предположим, что хп с именем sp_Any_Procedure не существует, тогда CDatabase "ругается" в виде еррор меседжа (что мне абсолютно не надо), т.е. никогда не происходит исключения, которое я могу обработать (а именно ничего не делать).

Подскажите как побороть этот еррор меседж?

Код: plaintext
 kxmep 

Ну так и сделай обработчик конкретно для этого типа исключений. То есть перед catch(...) вставь catch(CDBException &e) { } и проверь под отладчиком...
Все должно пойматься...
...
Рейтинг: 0 / 0
20.07.2005, 14:23
    #33175957
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
Во-первых,
Код: plaintext
catch(CDBexception(*,& e)
помочь не должно, т.к. catch(...) включает и это exception.

Во-вторых, сделал я пустую программку с указанным текстом и подключился именно к MSSQL. И ничего не изменилось, т.е. всё отработало.

И при чём тут wincore.cpp, если exception должно пойматься прямо в теле твоей функции?
...
Рейтинг: 0 / 0
20.07.2005, 14:40
    #33176045
kxmep
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
Ой ВэйИ при чём тут wincore.cpp, если exception должно пойматься прямо в теле твоей функции?

Смотрел дебагером:
при выполнении ExecuteSQL (dbcore.cpp) попадаем на участок кода:
...
AFX_ODBC_CALL(::SQLExecDirect(hstmt, reinterpret_cast<SQLTCHAR *>(pszSQL), SQL_NTS));
if (!CheckHstmt(nRetCode, hstmt)) AfxThrowDBException(nRetCode, this, hstmt);
...

Т.к. такой ХП на сервере нет - выполняется AfxThrowDBException и обрабатывается тут же:
...
CATCH_ALL(e)
{
::SQLCancel(hstmt);
AFX_SQL_SYNC(::SQLFreeStmt(hstmt, SQL_DROP));
THROW_LAST();
}
END_CATCH_ALL
...

В свою очередь THROW_LAST обрабатывется в wincore.cpp:
...
CATCH_ALL(e)
{
lResult = AfxProcessWndProcException(e, &pThreadState->m_lastSentMsg);
TRACE(traceAppMsg, 0, "Warning: Uncaught exception in WindowProc (returning %ld).\n",
lResult);
DELETE_EXCEPTION (e);
}

AfxProcessWndProcException - показывает месадж
DELETE_EXCEPTION - нет ошибки, т.е. ко мне она не приходит (да уже и не надо т.к. месадж уже показан :( )


Может у проекта настройки какие-нить не те?
MFC, ATL... хз



Код: plaintext
 kxmep 
...
Рейтинг: 0 / 0
20.07.2005, 14:54
    #33176097
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
Ну давай методом последовательных приближений :)

Прилагаю крошечный проект, в котором всё работает (только имя источника поменяй на своё).

Ты тоже попробуй изолировать маленький кусочек своего проекта, чтобы не работало (я могу скачать и большой, но он же небось секретный).

То что THROW_LAST() обрабатывается в WndProc, это ненормально.
Может быть у тебя какая-то нездоровая многопоточность? Или таймер?
...
Рейтинг: 0 / 0
20.07.2005, 15:18
    #33176211
kxmep
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
1. Спасибо за крошечный проект
2. Простите меня - засранца :)

Все правильно обрабатывается (действительно ошибки ловятся). Это я не правильный код закинул... подумал, что нет никакой разницы с:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
	CDatabase* MyDB;
	MyDB = new CDatabase;

	try
	{

		MyDB->OpenEx(_T( "DSN=isa_odbc;UID=isa_writer;PWD=12345678;" ), CDatabase::noOdbcDialog);
		
		MyDB->ExecuteSQL("{CALL sp_Any()}");
				
		MyDB->Close();
				
		delete MyDB;
	}
	catch(...)
	{
		if (MyDB)
		{
			delete MyDB;
		}

	}

Использую этот вариант потому, что мне кажется, что в первом варианте MyDB не будет удаляться из памяти, а здесь я делаю delete MyDB.
Я не прав?

Код: plaintext
 kxmep 
...
Рейтинг: 0 / 0
20.07.2005, 15:27
    #33176251
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
Нет, не прав.
В том случае, что ты написал сначала (и как сделано в моём проекте) MyDB (как и почти любая локальная переменная) "умрёт" на выходе из того блока, в котором была объявлена (блок это грубо говоря то что ограничено {}). И память освободится.

А в случае с new хватит одного delete после блока try/catch.

Наверно, в случае с new уменьшается размер exe-файла.


Так всё-таки, работает или нет? В чём было дело?
...
Рейтинг: 0 / 0
20.07.2005, 15:33
    #33176278
kxmep
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
> Наверно, в случае с new уменьшается размер exe-файла.
Размер файла такой же.

> Так всё-таки, работает или нет? В чём было дело?
если использовать
Код: plaintext
MyDB = new CDatabase
, то отлов ошибок не работает :(

переписал на
Код: plaintext
CDatabase MyDB
- работает, как ты и писал: "Написал, точно такой код, всё работает."

большой сенькс, буду тестировать.

ПС:
> но он же небось секретный
это фильтр для ISA Server

Код: plaintext
 kxmep 
...
Рейтинг: 0 / 0
20.07.2005, 15:49
    #33176346
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CDatabase exception
Размер ехе-файла меняется квантами, обычно по 4Кб, поэтому надо объявить много переменных, чтобы это стало заметно :-) Наверно, это лучше видно на массивах (замена статических на динамические).

Работает и с
Код: plaintext
MyDB = new CDatabase
. Никакой разницы для отлова исключений тут нет (попробуй сделать это в моём проекте).

Пожалуйста, рад помочь.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / CDatabase exception / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]