Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Правильное заведение и освобождение STMT (ODBC) / 7 сообщений из 7, страница 1 из 1
10.01.2006, 18:15
    #33474971
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильное заведение и освобождение STMT (ODBC)
Не могу найти нормальной литературы по ODBC(что-бы понять как он работает, а не только синтаксис и описание функций, что есть в MSDN).
Есть такой вопросик: На каждый запрос надо сначала алокейтить STMT( SQLAlloceHandle() ) и затем освобождать ( SQLFreeHandle() ). Т.е.:

SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLExecDirect( hStmt, TextStatement, sizeof(TextStatement) );
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);

Если я буду делать следующий запрос предварительно не сделав SQLFreeHandle(), т.е. например так:

SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLExecDirect( hStmt, TextStatement, sizeof(TextStatement) );
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLExecDirect( hStmt, TextStatement, sizeof(TextStatement) );
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);

И только в конце освобожу его. Что может быть плохого? Что может быть плохого, если запрос с резалт-сетом(заберу резалт-сет, и не освобождая STMT снова сделаю запрос) ?
...
Рейтинг: 0 / 0
10.01.2006, 19:04
    #33475048
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильное заведение и освобождение STMT (ODBC)
Eugene7Есть такой вопросик: На каждый запрос надо сначала алокейтить STMT( SQLAlloceHandle() ) и затем освобождать ( SQLFreeHandle() ).
Нет. Не надо.
Запускаешь какую-то команду, дожидаешься ее завершения. Если команда вернула резалтсет закрываешь его через SQLCloseCursor(), и сразу кидаешь в освободившийся стейтмент новую команду.

Достаточно сделать SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt) в начале программы, сразу после подключения к базе. А SQLFreeHandle(hStmt) звать только перед самым выходом, непосредственно перед SQLDisconnect(hDdbc).
...
Рейтинг: 0 / 0
10.01.2006, 19:10
    #33475061
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильное заведение и освобождение STMT (ODBC)
Eugene7Если я буду делать следующий запрос предварительно не сделав SQLFreeHandle(), т.е. например так:

SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLExecDirect( hStmt, TextStatement, sizeof(TextStatement) );
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLExecDirect( hStmt, TextStatement, sizeof(TextStatement) );
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);

И только в конце освобожу его. Что может быть плохого? Что может быть плохого, если запрос с резалт-сетом(заберу резалт-сет, и не освобождая STMT снова сделаю запрос) ?
Что может быть плохого? Ну например утечка памяти и расходование ресурсов сервера. Причем она не "может быть", а "уже есть" :)
Каждый SQLAllocHandle запрашивает у системы некоторый блок памяти и у сервера БД тоже выделяется несколько ресурсов. Повторый вызов SQLAllocHandle в приведенном примере просто забывает о предыдущем блоке памяти и выделяет новый.
...
Рейтинг: 0 / 0
10.01.2006, 19:20
    #33475077
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильное заведение и освобождение STMT (ODBC)
White Owl
Запускаешь какую-то команду, дожидаешься ее завершения. Если команда вернула резалтсет закрываешь его через SQLCloseCursor(), и сразу кидаешь в освободившийся стейтмент новую команду.

Хм... А под "дожидаешься ее завершения" что имелось ввиду? Разве SQLExecute/SQLExecDirect сразу возвращает управление не дождавшись завершения исполнения команды? Если так, то как определить, что она исполнилась?
...
Рейтинг: 0 / 0
10.01.2006, 19:45
    #33475121
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильное заведение и освобождение STMT (ODBC)
Eugene7 White Owl
Запускаешь какую-то команду, дожидаешься ее завершения. Если команда вернула резалтсет закрываешь его через SQLCloseCursor(), и сразу кидаешь в освободившийся стейтмент новую команду.

Хм... А под "дожидаешься ее завершения" что имелось ввиду? Разве SQLExecute/SQLExecDirect сразу возвращает управление не дождавшись завершения исполнения команды? Если так, то как определить, что она исполнилась?
По умолчанию они дожидаются завершения команды сервером.
Но можно включить асинхронный режим. Смотри функцию SQLSetStmtAttr() и флаг SQL_ATTR_ASYNC_ENABLE. Тогда SQLExecute/SQLExecDirect будут посылать команду на сервер и сразу возвращаться с кодом SQL_STILL_EXECUTING. Все остальные команды выданые на этот стейтмент будут отпинываться с аналогичной ошибкой. Исполняющийся сервером стейтмент можно только отменить (SQLCancel) и посмотреть его статус (SQLGetDiagField и SQLGetDiagRec).

Можно даже делать несколько тредов в своей программе работающих через один общий стейтмент, один тред вызывает SQLExecute() а второй сидит в цикле и ждет пока стейтмент осводиться, и быстро-быстро посылает свою собственную команду :)
...
Рейтинг: 0 / 0
11.01.2006, 09:44
    #33475585
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильное заведение и освобождение STMT (ODBC)
Спасибо
Я так понимаю, если резалт-сет пустой, курсор все равно открываеться?
...
Рейтинг: 0 / 0
11.01.2006, 17:48
    #33477307
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильное заведение и освобождение STMT (ODBC)
Eugene7Спасибо
Я так понимаю, если резалт-сет пустой, курсор все равно открываеться?
Если команда в принципе должна возвращать резалт-сет, то да, курсор откроется. Если команда без резалтсета - курсор не откроется.
То есть любой select создаст курсор, а update/insert не создаст. Открытие курсора на вызове хранимой процедуры зависит от хранимой процедуры, тут уже вопрос более сложный. Впрочем мы его обсуждали пару недель назад :)
В принципе, можно слать SQLCloseCursor() всегда. Это не совсем красиво, но вполне безопасно. Если курсор был - он закроется, если курсора не было, ты получишь ошибку которую можно будет проигнорировать.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Правильное заведение и освобождение STMT (ODBC) / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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