powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / С++ ODBC + Sybase(asa 8)
13 сообщений из 13, страница 1 из 1
С++ ODBC + Sybase(asa 8)
    #33419730
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как исполнять обычные запросы функцией SQLExecute() я научился. Но возникла проблемма с процедурами и функциями(SQL-ые функции).
Я исполняю запрос на функцию:
Код: plaintext
SQLExecute("CALL rs.ResourceColSet( ?, ?, ?);\0");
Параметры на вход я биндю функцией SQLBindParameter(). Но как быть с тем параметром, который эта SQL-функция возвращает? Получается я должен передать в запрос переменную, которая по ходу исполнения функции заполниться. Вот только как это сделать?
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33420898
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо , если вы используете не native-синтаксис, использовать эскейп-символы. Типа того :
Код: plaintext
1.
SQLExecute("{call rs.ResourceColSet( ?, ?, ?)}");

Или использовать родной синтаксис.
Код: plaintext
1.
SQLExecute("exec rs.ResourceColSet ?, ?, ?");

Если вам нужен выходной параметр, а равно как и код возврата процедуры,
то этот параметр вы должны сбиндить, указав, что вы хотите получить его наружу (там есть в API тип параметра). Тогда вы его автоматом получите.
Но учтите, что он там появиться только после окончания процесса выборки ВСЕХ!! данных.
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33421586
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЕсли вам нужен выходной параметр, а равно как и код возврата процедуры, то этот параметр вы должны сбиндить, указав, что вы хотите получить его наружу (там есть в API тип параметра). Тогда вы его автоматом получите.
Но учтите, что он там появиться только после окончания процесса выборки ВСЕХ!! данных.
Насколько я знаю, процедура возвращает набор записей(выборка из таблиц например). А во входных параметрах одну из переменных можно задать как INOUT. Это получается процедура во время исполнения может изменить значение этой переменной, и оно будет пересохранено. И в sybase central все именно так и происходит.
Но проблемма в другом: Смотрел функцию SQLBindParameter() в MSDN - есть константа SQL_PARAM_OUTPUT, которую можно задать этой функции. Но вот проблема - нет примера. Пытаюсь сам это делать - не получается, переменная все равно не изменяет свое значение.
Смотрел те справочники по ODBC, которые нашел - куча примеров с тем, где переменная просто передается туда(SQL_PARAM_INPUT), и ни одного примера на возврат(SQL_PARAM_OUTPUT). Вот исходник как я пытаюсь делать:

Код: plaintext
1.
2.
3.
4.
5.
6.
int SQLProcReturn = - 5 ;
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLPrepare(hStmt, (SQLCHAR *)"{CALL rs.ResourceCol_get( ?,? )}\0", SQL_NTS);
SQLBindParameter(hStmt,  1 , SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER,  0 ,  0 , &SQLProcReturn,  0 ,  0 );
SQLBindParameter(hStmt,  2 , SQL_PARAM_INPUT, SQL_C_TCHAR, SQL_VARCHAR, lstrlen(ResourceName)+ 1 ,  0 , ResourceName,  0 ,  0 );
SQLExecute("{CALL rs.ResourceCol_get( ?,? )}\0");
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);

Переменную SQLProcReturn специально устанавливаю в -5, что-бы проверить, изменила ли она свое значение. И она не меняет. В чем может быть проблема?
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33422546
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поищите в MSDN CExecDatabase.
Это если Вам нужен результат процедуры, возвращаемый Return.
Если нужно то, что возвращается select то это описано в описании CRecordset
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33423565
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же писал. Нужно еще выбрать данные. Даже если их нет, попытаться выбрать.
Вы же, сразу после посылки запроса, вызываете
SQLFreeHandle(SQL_HANDLE_STMT, hStmt); ,
что равносильно SQLCancel.
По-моему только в этом дело. Ничего там хитрого нет.
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33423888
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. переменная заполниться только после вызова SQLFetch? Странно это как то... Действительно не допонял. Спс за ответ.
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33424358
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего странного. Посылка запроса и получение результатов - это процесс, а вы его на пол-пути обрываете.
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33426019
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто первый параметр у процедуры INOUT, в него я ложу результат отработки процедуры(правильно ли отработала ее логика). Получается мне сначала забрать рекордсет, а потом только я смогу проверить, а нужно ли было мне его забирать :-) Ну не важно, пусть будет так.
Если способ узнать заранее сколько строк в рекордсете?
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33428675
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene7
Если способ узнать заранее сколько строк в рекордсете?

Нет.
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33429553
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем нет. Если рекордсет типа select * from smth where smth, то select count(*) smth where smth будет достаточно точен. Но это - почти экстрим.
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33429572
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameНе совсем нет. Если рекордсет типа select * from smth where smth, то select count(*) smth where smth будет достаточно точен. Но это - почти экстрим.


Это -- ответ на другой вопрос, сколько строк в таблице, удовлетворяющих условию where smth .
При этом к тому, сколько будет строк в резалт-сете после выполнения
запроса

select * from smth where smth

это не имеет никакого отношения.
Есть только один едиственный способ узнать это - профетчить все строки на клиента и посчитать их. Вызов API типа SQLGetRowCount (или как его там) именно это и делает, а если кто-то считает, что у него есть какой -то другой способ узнать заранее кол-во строк с привличением, например, некоей магии, то он глубоко ошибается -- его нет.
...
Рейтинг: 0 / 0
С++ ODBC + Sybase(asa 8)
    #33429623
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я это и имел в ввиду.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
С++ ODBC + Sybase(asa 8)
    #34199334
alex-chem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таже проблема, с невозможностью получить данные от выполнения процедур, но в Оракле, т.е. PL/SQL!!!
Как этот кусок:
авторint SQLProcReturn = -5;
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLPrepare(hStmt, (SQLCHAR *)"{CALL rs.ResourceCol_get( ?,? )}\0", SQL_NTS);
SQLBindParameter(hStmt, 1, SQL_PARAM_OUTPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &SQLProcReturn, 0, 0);
SQLBindParameter(hStmt, 2, SQL_PARAM_INPUT, SQL_C_TCHAR, SQL_VARCHAR, lstrlen(ResourceName)+1, 0, ResourceName, 0, 0);
SQLExecute("{CALL rs.ResourceCol_get( ?,? )}\0");
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);

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


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