|
|
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Как исполнять обычные запросы функцией SQLExecute() я научился. Но возникла проблемма с процедурами и функциями(SQL-ые функции). Я исполняю запрос на функцию: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 15:00 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Надо , если вы используете не native-синтаксис, использовать эскейп-символы. Типа того : Код: plaintext 1. Или использовать родной синтаксис. Код: plaintext 1. Если вам нужен выходной параметр, а равно как и код возврата процедуры, то этот параметр вы должны сбиндить, указав, что вы хотите получить его наружу (там есть в API тип параметра). Тогда вы его автоматом получите. Но учтите, что он там появиться только после окончания процесса выборки ВСЕХ!! данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2005, 23:08 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
MasterZivЕсли вам нужен выходной параметр, а равно как и код возврата процедуры, то этот параметр вы должны сбиндить, указав, что вы хотите получить его наружу (там есть в API тип параметра). Тогда вы его автоматом получите. Но учтите, что он там появиться только после окончания процесса выборки ВСЕХ!! данных. Насколько я знаю, процедура возвращает набор записей(выборка из таблиц например). А во входных параметрах одну из переменных можно задать как INOUT. Это получается процедура во время исполнения может изменить значение этой переменной, и оно будет пересохранено. И в sybase central все именно так и происходит. Но проблемма в другом: Смотрел функцию SQLBindParameter() в MSDN - есть константа SQL_PARAM_OUTPUT, которую можно задать этой функции. Но вот проблема - нет примера. Пытаюсь сам это делать - не получается, переменная все равно не изменяет свое значение. Смотрел те справочники по ODBC, которые нашел - куча примеров с тем, где переменная просто передается туда(SQL_PARAM_INPUT), и ни одного примера на возврат(SQL_PARAM_OUTPUT). Вот исходник как я пытаюсь делать: Код: plaintext 1. 2. 3. 4. 5. 6. Переменную SQLProcReturn специально устанавливаю в -5, что-бы проверить, изменила ли она свое значение. И она не меняет. В чем может быть проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 11:36 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Поищите в MSDN CExecDatabase. Это если Вам нужен результат процедуры, возвращаемый Return. Если нужно то, что возвращается select то это описано в описании CRecordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 15:04 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Я же писал. Нужно еще выбрать данные. Даже если их нет, попытаться выбрать. Вы же, сразу после посылки запроса, вызываете SQLFreeHandle(SQL_HANDLE_STMT, hStmt); , что равносильно SQLCancel. По-моему только в этом дело. Ничего там хитрого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2005, 20:38 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Т.е. переменная заполниться только после вызова SQLFetch? Странно это как то... Действительно не допонял. Спс за ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 07:17 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Ничего странного. Посылка запроса и получение результатов - это процесс, а вы его на пол-пути обрываете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 10:50 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Просто первый параметр у процедуры INOUT, в него я ложу результат отработки процедуры(правильно ли отработала ее логика). Получается мне сначала забрать рекордсет, а потом только я смогу проверить, а нужно ли было мне его забирать :-) Ну не важно, пусть будет так. Если способ узнать заранее сколько строк в рекордсете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2005, 19:27 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Eugene7 Если способ узнать заранее сколько строк в рекордсете? Нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2005, 02:59 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Не совсем нет. Если рекордсет типа select * from smth where smth, то select count(*) smth where smth будет достаточно точен. Но это - почти экстрим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2005, 21:52 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
niknameНе совсем нет. Если рекордсет типа select * from smth where smth, то select count(*) smth where smth будет достаточно точен. Но это - почти экстрим. Это -- ответ на другой вопрос, сколько строк в таблице, удовлетворяющих условию where smth . При этом к тому, сколько будет строк в резалт-сете после выполнения запроса select * from smth where smth это не имеет никакого отношения. Есть только один едиственный способ узнать это - профетчить все строки на клиента и посчитать их. Вызов API типа SQLGetRowCount (или как его там) именно это и делает, а если кто-то считает, что у него есть какой -то другой способ узнать заранее кол-во строк с привличением, например, некоей магии, то он глубоко ошибается -- его нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2005, 22:48 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Я это и имел в ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2005, 00:17 |
|
||
|
С++ ODBC + Sybase(asa 8)
|
|||
|---|---|---|---|
|
#18+
Таже проблема, с невозможностью получить данные от выполнения процедур, но в Оракле, т.е. 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); будет выгляджеть в моем случае??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2006, 12:09 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33428675&tid=2029826]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 376ms |

| 0 / 0 |
