powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как заранее определить наличие резалт сета?
16 сообщений из 16, страница 1 из 1
Как заранее определить наличие резалт сета?
    #33453469
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю запрос в базу из клиента(ODBC). Если в результате запроса не оказываеться резалт сета, то SQLFetch() возвращает не SQL_NO_DATA, а SQL_ERROR.
SQL_NO_DATA функция возвратит если например в резалт сете оказалась хотя бы одна строка, и я пытаюсь запросить вторую не существующую.
Каким же тогда образом определить, произошла ли ошибка при исполнении SQLFetch() или ошибки не было, а просто нету резлт сета? Как вообще заранее узнать, есть ли резалт сет?
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455235
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не правда :)
Запрос может быть возвращающим резалтсет и не возвращающим резалтсет. Если запрос в принципе может вернуть резалтсет (select или вызов хранимой процедуры возвращающей резалтсет) то SQLFetch() на первой же строке может вернуть SQL_NO_DATA если резалтсет был пустой.
А вот если запрос был типа insert/update/delete или вызов ничего не возвращающей хранимой процедуры, то первый же SQLFetch() вернет SQL_ERROR.

Если ты не знаешь какого типа (с или без резалтсета) был запрос, то вызывай SQLNumResultCols() оно тебе даст ноль колонок если резалтсета нету вообще, или количество колонок в резалтсете. При чем не важно пустой резалтсет или не пустой. Потом уже зовешь в цикле SQLFetch() пока он не вернет SQL_NO_DATA...
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455467
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455498
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene7 Я проверяю SQLFetch() на ошибки, и я не хочу что-бы каждый раз срабатывала проверка на ошибку, когда просто пустой резалт сет(это ведь не ошибка).
Конкретный код ошибки - 85. Текст:
Communication link failure: Communication error
Хы! :) А может там действительно Communication error ?
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455611
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Eugene7 Я проверяю SQLFetch() на ошибки, и я не хочу что-бы каждый раз срабатывала проверка на ошибку, когда просто пустой резалт сет(это ведь не ошибка).
Конкретный код ошибки - 85. Текст:
Communication link failure: Communication error
Хы! :) А может там действительно Communication error ?

Если добавляю туда какие нибудь строки, то ошибки почему то нету(считываються). Выскакивает ошибка если строк нету(резалт сет пустой)
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455622
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно пропадает конект если запрашиваю пустой резалт сет. После выскакивания этой ошибки больше ни один запрос не идет.
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455636
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажеться нашел в чем дело. Процедура действительно не создает резалт сета если не оказалось данных. Хе, тогда почему SQLNumResultCols() говорит 2...
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455646
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все же, есть ли способ помимо SQLNumResultCols() узнать наличие резалт сета?
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455650
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсли ты не знаешь какого типа (с или без резалтсета) был запрос, то вызывай SQLNumResultCols() оно тебе даст ноль колонок если резалтсета нету вообще, или количество колонок в резалтсете. При чем не важно пустой резалтсет или не пустой. Потом уже зовешь в цикле SQLFetch() пока он не вернет SQL_NO_DATA...
Вот тут то и проблема. Хранимая процедура обьявлена так, что возвращает резалт сет из двух столбцов. А внутри процедуры что-бы не тратить процессорные ресурсы впустую, делаеться проверка, и в зависимости от результата проверки исполняеться select либо нет. Соответственно, если не исполняеться, резалт сет не возвращаеться. А вот SQLNumResultCols() все равно говорит 2(столько обьявлен result у процедуры). Ориентируясь на результат SQLNumResultCols() я либо делаю SQLFetch(), либо нет. Вот и получаеться - SQLNumResultCols() сказал 2, я делаю SQLFetch() на не существующий резалт сет, и конект отваливаеться. Неужели надо переделывать хранимую процедуру таким образом, что-бы она обязательно создавала резалт сет не зависимо от того, будет ли он пустым? Ведь это пустая трата ресурсов, делать select, результат которого уже известен.
Или все же есть еще способ помимо SQLNumResultCols() определить наличие резалт сета?
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455830
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет никакой проблемы. У тебя соответственно либо SQLNumColums вернет 0, либо что-то > 0.
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33455933
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа нет никакой проблемы. У тебя соответственно либо SQLNumColums вернет 0, либо что-то > 0.

MasterZivДа нет никакой проблемы. У тебя соответственно либо SQLNumColums вернет 0, либо что-то > 0.
Нет, SQLNumResultCols() возвращает 2, а резалт сета при этом не существует вообще. Я проверил ( запустил хр.процедуру в sybase central). Т.е. например если процедуру обьявить так:

Код: plaintext
1.
2.
3.
4.
5.
ALTER PROCEDURE rs."SomeProcedure" (
IN Parameter char( 30 ) DEFAULT NULL 
)
RESULT (
 Result1 char( 30 ),
 Result2 integer    )

но в коде процедуры результат не возвращать, то резалт сет не создасться, но SQLNumResultCols() все равно будет думать что есть резалт сет с двумя столбцами. А при этом его нету, и SQLFecth() отваливается при попытке прочитать его.
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33456328
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так не надо писать
RESULT (....
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33456649
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТак не надо писать
RESULT (....
:-)))
Думаешь я его просто так пишу? :-)
Возвращаю резалт сет если есть записи, и не создаю его если нету записей
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33460283
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не используй слово RESULT в объявлении процедуры.
Если в объявлении процедуры есть RESULT(чего-то), то SQLNumResultCols() будет всегда возвращать указаное количество колонок и к ним можно даже будет SQLBindCol() делать.
А если RESULT в объявлении процедуры нету вообще, то вот тогда SQLNumResultCols() будет работать по фактическому резалтсету, а не по обещаному :)
К тому же, появится возможность из одной и той же процедуры возвращать разные резалтсеты и даже по нескольку резалтсетов за раз :)
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33460295
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene7Возвращаю резалт сет если есть записи, и не создаю его если нету записей
В том то все и дело :) Если процедуре сказано что есть RESULT, она должна вернуть указаный резалтсет. Если фактически возвращаемый резалтсет не совпадает с описаным в RESULT... по идее сервер должен на это ругаться...
...
Рейтинг: 0 / 0
Как заранее определить наличие резалт сета?
    #33460352
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Eugene7Возвращаю резалт сет если есть записи, и не создаю его если нету записей
В том то все и дело :) Если процедуре сказано что есть RESULT, она должна вернуть указаный резалтсет. Если фактически возвращаемый резалтсет не совпадает с описаным в RESULT... по идее сервер должен на это ругаться...
По идее... А на самом деле нифига не ругаеться(ASA 8). Просто не создает. Но в принципе не важно. Во всех хранимках теперь возвращаю хотя бы пустой резалт сет.
Всем спс за помошь
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как заранее определить наличие резалт сета?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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