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

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

Если добавляю туда какие нибудь строки, то ошибки почему то нету(считываються). Выскакивает ошибка если строк нету(резалт сет пустой)
...
Рейтинг: 0 / 0
24.12.2005, 08:23
    #33455622
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
Действительно пропадает конект если запрашиваю пустой резалт сет. После выскакивания этой ошибки больше ни один запрос не идет.
...
Рейтинг: 0 / 0
24.12.2005, 08:59
    #33455636
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
Кажеться нашел в чем дело. Процедура действительно не создает резалт сета если не оказалось данных. Хе, тогда почему SQLNumResultCols() говорит 2...
...
Рейтинг: 0 / 0
24.12.2005, 09:18
    #33455646
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
Все же, есть ли способ помимо SQLNumResultCols() узнать наличие резалт сета?
...
Рейтинг: 0 / 0
24.12.2005, 09:31
    #33455650
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
White OwlЕсли ты не знаешь какого типа (с или без резалтсета) был запрос, то вызывай SQLNumResultCols() оно тебе даст ноль колонок если резалтсета нету вообще, или количество колонок в резалтсете. При чем не важно пустой резалтсет или не пустой. Потом уже зовешь в цикле SQLFetch() пока он не вернет SQL_NO_DATA...
Вот тут то и проблема. Хранимая процедура обьявлена так, что возвращает резалт сет из двух столбцов. А внутри процедуры что-бы не тратить процессорные ресурсы впустую, делаеться проверка, и в зависимости от результата проверки исполняеться select либо нет. Соответственно, если не исполняеться, резалт сет не возвращаеться. А вот SQLNumResultCols() все равно говорит 2(столько обьявлен result у процедуры). Ориентируясь на результат SQLNumResultCols() я либо делаю SQLFetch(), либо нет. Вот и получаеться - SQLNumResultCols() сказал 2, я делаю SQLFetch() на не существующий резалт сет, и конект отваливаеться. Неужели надо переделывать хранимую процедуру таким образом, что-бы она обязательно создавала резалт сет не зависимо от того, будет ли он пустым? Ведь это пустая трата ресурсов, делать select, результат которого уже известен.
Или все же есть еще способ помимо SQLNumResultCols() определить наличие резалт сета?
...
Рейтинг: 0 / 0
24.12.2005, 15:01
    #33455830
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
Да нет никакой проблемы. У тебя соответственно либо SQLNumColums вернет 0, либо что-то > 0.
...
Рейтинг: 0 / 0
24.12.2005, 17:28
    #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
25.12.2005, 17:09
    #33456328
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
Так не надо писать
RESULT (....
...
Рейтинг: 0 / 0
26.12.2005, 08:15
    #33456649
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
MasterZivТак не надо писать
RESULT (....
:-)))
Думаешь я его просто так пишу? :-)
Возвращаю резалт сет если есть записи, и не создаю его если нету записей
...
Рейтинг: 0 / 0
27.12.2005, 17:52
    #33460283
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
Не используй слово RESULT в объявлении процедуры.
Если в объявлении процедуры есть RESULT(чего-то), то SQLNumResultCols() будет всегда возвращать указаное количество колонок и к ним можно даже будет SQLBindCol() делать.
А если RESULT в объявлении процедуры нету вообще, то вот тогда SQLNumResultCols() будет работать по фактическому резалтсету, а не по обещаному :)
К тому же, появится возможность из одной и той же процедуры возвращать разные резалтсеты и даже по нескольку резалтсетов за раз :)
...
Рейтинг: 0 / 0
27.12.2005, 17:56
    #33460295
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
Eugene7Возвращаю резалт сет если есть записи, и не создаю его если нету записей
В том то все и дело :) Если процедуре сказано что есть RESULT, она должна вернуть указаный резалтсет. Если фактически возвращаемый резалтсет не совпадает с описаным в RESULT... по идее сервер должен на это ругаться...
...
Рейтинг: 0 / 0
27.12.2005, 18:24
    #33460352
Eugene7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как заранее определить наличие резалт сета?
White Owl Eugene7Возвращаю резалт сет если есть записи, и не создаю его если нету записей
В том то все и дело :) Если процедуре сказано что есть RESULT, она должна вернуть указаный резалтсет. Если фактически возвращаемый резалтсет не совпадает с описаным в RESULT... по идее сервер должен на это ругаться...
По идее... А на самом деле нифига не ругаеться(ASA 8). Просто не создает. Но в принципе не важно. Во всех хранимках теперь возвращаю хотя бы пустой резалт сет.
Всем спс за помошь
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как заранее определить наличие резалт сета? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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