|
|
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Делаю запрос в базу из клиента(ODBC). Если в результате запроса не оказываеться резалт сета, то SQLFetch() возвращает не SQL_NO_DATA, а SQL_ERROR. SQL_NO_DATA функция возвратит если например в резалт сете оказалась хотя бы одна строка, и я пытаюсь запросить вторую не существующую. Каким же тогда образом определить, произошла ли ошибка при исполнении SQLFetch() или ошибки не было, а просто нету резлт сета? Как вообще заранее узнать, есть ли резалт сет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2005, 08:35 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Не правда :) Запрос может быть возвращающим резалтсет и не возвращающим резалтсет. Если запрос в принципе может вернуть резалтсет (select или вызов хранимой процедуры возвращающей резалтсет) то SQLFetch() на первой же строке может вернуть SQL_NO_DATA если резалтсет был пустой. А вот если запрос был типа insert/update/delete или вызов ничего не возвращающей хранимой процедуры, то первый же SQLFetch() вернет SQL_ERROR. Если ты не знаешь какого типа (с или без резалтсета) был запрос, то вызывай SQLNumResultCols() оно тебе даст ноль колонок если резалтсета нету вообще, или количество колонок в резалтсете. При чем не важно пустой резалтсет или не пустой. Потом уже зовешь в цикле SQLFetch() пока он не вернет SQL_NO_DATA... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2005, 18:24 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
White OwlНе правда :) Запрос может быть возвращающим резалтсет и не возвращающим резалтсет. Если запрос в принципе может вернуть резалтсет (select или вызов хранимой процедуры возвращающей резалтсет) то SQLFetch() на первой же строке может вернуть SQL_NO_DATA если резалтсет был пустой. А вот если запрос был типа insert/update/delete или вызов ничего не возвращающей хранимой процедуры, то первый же SQLFetch() вернет SQL_ERROR. Если ты не знаешь какого типа (с или без резалтсета) был запрос, то вызывай SQLNumResultCols() оно тебе даст ноль колонок если резалтсета нету вообще, или количество колонок в резалтсете. При чем не важно пустой резалтсет или не пустой. Потом уже зовешь в цикле SQLFetch() пока он не вернет SQL_NO_DATA... В том то и дело, что я знаю, что резалт сет должен быть(не важно, есть в нем строки или нет), и SQLNumResultCols() говорит что две колонки(что правильно). Вот только как ни странно, SQLFetch() возвращает SQL_ERROR а не SQL_NO_DATA если не оказалось строк. А вот если строки оказались, то после возвращения последней строки возвращает SQL_NO_DATA. Я проверяю SQLFetch() на ошибки, и я не хочу что-бы каждый раз срабатывала проверка на ошибку, когда просто пустой резалт сет(это ведь не ошибка). Конкретный код ошибки - 85. Текст: Communication link failure: Communication error ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2005, 22:27 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Eugene7 Я проверяю SQLFetch() на ошибки, и я не хочу что-бы каждый раз срабатывала проверка на ошибку, когда просто пустой резалт сет(это ведь не ошибка). Конкретный код ошибки - 85. Текст: Communication link failure: Communication error Хы! :) А может там действительно Communication error ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2005, 23:31 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
White Owl Eugene7 Я проверяю SQLFetch() на ошибки, и я не хочу что-бы каждый раз срабатывала проверка на ошибку, когда просто пустой резалт сет(это ведь не ошибка). Конкретный код ошибки - 85. Текст: Communication link failure: Communication error Хы! :) А может там действительно Communication error ? Если добавляю туда какие нибудь строки, то ошибки почему то нету(считываються). Выскакивает ошибка если строк нету(резалт сет пустой) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 07:44 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Действительно пропадает конект если запрашиваю пустой резалт сет. После выскакивания этой ошибки больше ни один запрос не идет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 08:23 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Кажеться нашел в чем дело. Процедура действительно не создает резалт сета если не оказалось данных. Хе, тогда почему SQLNumResultCols() говорит 2... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 08:59 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Все же, есть ли способ помимо SQLNumResultCols() узнать наличие резалт сета? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 09:18 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
White OwlЕсли ты не знаешь какого типа (с или без резалтсета) был запрос, то вызывай SQLNumResultCols() оно тебе даст ноль колонок если резалтсета нету вообще, или количество колонок в резалтсете. При чем не важно пустой резалтсет или не пустой. Потом уже зовешь в цикле SQLFetch() пока он не вернет SQL_NO_DATA... Вот тут то и проблема. Хранимая процедура обьявлена так, что возвращает резалт сет из двух столбцов. А внутри процедуры что-бы не тратить процессорные ресурсы впустую, делаеться проверка, и в зависимости от результата проверки исполняеться select либо нет. Соответственно, если не исполняеться, резалт сет не возвращаеться. А вот SQLNumResultCols() все равно говорит 2(столько обьявлен result у процедуры). Ориентируясь на результат SQLNumResultCols() я либо делаю SQLFetch(), либо нет. Вот и получаеться - SQLNumResultCols() сказал 2, я делаю SQLFetch() на не существующий резалт сет, и конект отваливаеться. Неужели надо переделывать хранимую процедуру таким образом, что-бы она обязательно создавала резалт сет не зависимо от того, будет ли он пустым? Ведь это пустая трата ресурсов, делать select, результат которого уже известен. Или все же есть еще способ помимо SQLNumResultCols() определить наличие резалт сета? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 09:31 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Да нет никакой проблемы. У тебя соответственно либо SQLNumColums вернет 0, либо что-то > 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 15:01 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
MasterZivДа нет никакой проблемы. У тебя соответственно либо SQLNumColums вернет 0, либо что-то > 0. MasterZivДа нет никакой проблемы. У тебя соответственно либо SQLNumColums вернет 0, либо что-то > 0. Нет, SQLNumResultCols() возвращает 2, а резалт сета при этом не существует вообще. Я проверил ( запустил хр.процедуру в sybase central). Т.е. например если процедуру обьявить так: Код: plaintext 1. 2. 3. 4. 5. но в коде процедуры результат не возвращать, то резалт сет не создасться, но SQLNumResultCols() все равно будет думать что есть резалт сет с двумя столбцами. А при этом его нету, и SQLFecth() отваливается при попытке прочитать его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2005, 17:28 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Так не надо писать RESULT (.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2005, 17:09 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
MasterZivТак не надо писать RESULT (.... :-))) Думаешь я его просто так пишу? :-) Возвращаю резалт сет если есть записи, и не создаю его если нету записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2005, 08:15 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Не используй слово RESULT в объявлении процедуры. Если в объявлении процедуры есть RESULT(чего-то), то SQLNumResultCols() будет всегда возвращать указаное количество колонок и к ним можно даже будет SQLBindCol() делать. А если RESULT в объявлении процедуры нету вообще, то вот тогда SQLNumResultCols() будет работать по фактическому резалтсету, а не по обещаному :) К тому же, появится возможность из одной и той же процедуры возвращать разные резалтсеты и даже по нескольку резалтсетов за раз :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 17:52 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
Eugene7Возвращаю резалт сет если есть записи, и не создаю его если нету записей В том то все и дело :) Если процедуре сказано что есть RESULT, она должна вернуть указаный резалтсет. Если фактически возвращаемый резалтсет не совпадает с описаным в RESULT... по идее сервер должен на это ругаться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 17:56 |
|
||
|
Как заранее определить наличие резалт сета?
|
|||
|---|---|---|---|
|
#18+
White Owl Eugene7Возвращаю резалт сет если есть записи, и не создаю его если нету записей В том то все и дело :) Если процедуре сказано что есть RESULT, она должна вернуть указаный резалтсет. Если фактически возвращаемый резалтсет не совпадает с описаным в RESULT... по идее сервер должен на это ругаться... По идее... А на самом деле нифига не ругаеться(ASA 8). Просто не создает. Но в принципе не важно. Во всех хранимках теперь возвращаю хотя бы пустой резалт сет. Всем спс за помошь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2005, 18:24 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33460283&tid=2032217]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 251ms |
| total: | 438ms |

| 0 / 0 |
