powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов процедур. Текстовые поля.
25 сообщений из 25, страница 1 из 1
Вызов процедур. Текстовые поля.
    #34690178
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В прошлый раз Вы провели мне классный ликбез :). Еще раз большое спасибо за это. Помогите пож-та и сейчас.

Вызываю процедуру, в которой объявлен текстовый OUTPUT параметр.
Могу ли я ДО ВЫЗОВА процедуры узнать, какой размер данных из текстового поля мне вернется?

Размер столбца я могу узнать после вызова SQLDescribeCol. Но мне бы хотелось узнать фактический размер данных в этом столбце до вызова SQLExecute - это возможно?
В моем случае вопрос встал, потому что я передаю в качестве OUTPUT параметра указатель на строку и мне нужно выделить нужное кол-во памяти. Выделять память по размеру столбца - плохое решение, потому что чаще всего он намного превышает истинный размер данных.

Спасибо.
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34690202
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LenieВ прошлый раз Вы провели мне классный ликбез :). Еще раз большое спасибо за это. Помогите пож-та и сейчас.

Вызываю процедуру, в которой объявлен текстовый OUTPUT параметр.
Могу ли я ДО ВЫЗОВА процедуры узнать, какой размер данных из текстового поля мне вернется?Конечно! Как раз до вызова их и надо узнавать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQLPrepare( ..... );
SQLNumParams(hStmt, &paramCount); // получаешь количество параметров
for (i= 1 ; i<=paramCount; i++ )
   SQLDescribeParam( hstmt, i, .... ); // узнаешь тип и размер параметра
   SQLBindParam(...); // связываешь свой буфер с параметром
}
SQLExecute()
SQLNumResultCols(hStmt, &columnCount); // и уже начинаешь разбирать результат
Конечно если ты заранее знаешь сколько у тебя параметров можно будет не возится с чтением количества параметров и циклом привязки... Но иногда нужно и совсем динамически параметры строить...


LenieРазмер столбца я могу узнать после вызова SQLDescribeCol.Не путай, параметры это не столбцы. Это две разные сущности хоть они и похожи....
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34690221
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, спасибо!
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34698914
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скажите пжл, можно отлаживать хранимые процедуры на SQL Server 2000, которые вызываются из вижуал студио 2005 через SQL-функции?
SQLExecute отрабатывает, но в OUTPUT-параметрах пусто, хотелось пошагово отследить выполнение ХП
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699146
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не в тот форум. Ходи в форум по этому уродцу SQL Server'у. Может там подскажут как.
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699189
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:
> Вопрос не в тот форум. Ходи в форум по этому уродцу SQL Server'у. Может
> там подскажут как.

Не ругай его, он не всегда таким был, когда-то он был красавцем Sybase ASE.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699192
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenie пишет:

> скажите пжл, можно отлаживать хранимые процедуры на SQL Server 2000,
> которые вызываются из вижуал студио 2005 через SQL-функции?

Можно. В VC Enterprise и кажется еще что-то ставить надо на сервак.

> SQLExecute отрабатывает, но в OUTPUT-параметрах пусто, хотелось пошагово
> отследить выполнение ХП

А тут и отлаживать нечего. До тех пор пока не выберешь все результаты,
OUT -параметры не придут.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699231
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
Не ругай его, он не всегда таким был, когда-то он был красавцем Sybase ASE.
Posted via ActualForum NNTP Server 1.4
:) даже не думала

MasterZiv
Lenie пишет:
> SQLExecute отрабатывает, но в OUTPUT-параметрах пусто, хотелось пошагово
> отследить выполнение ХП

А тут и отлаживать нечего. До тех пор пока не выберешь все результаты,
OUT -параметры не придут.
Posted via ActualForum NNTP Server 1.4

а если ХП выполняется (SQLExecute = SQL_NO_DATA), но не возвращает резалтсет (SQLNumResultCols = 0), то выбирать нечего, я не вызываю SQLFetch. Вместо него вызываю SQLMoreResults в ожидании что после его отработки получу аутпут параметры, и не получаю...
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699272
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenie MasterZiv
Не ругай его, он не всегда таким был, когда-то он был красавцем Sybase ASE.
:) даже не думалаЗато я думал :)

Lenieа если ХП выполняется (SQLExecute = SQL_NO_DATA), но не возвращает резалтсет (SQLNumResultCols = 0), то выбирать нечего, я не вызываю SQLFetch. Вместо него вызываю SQLMoreResults в ожидании что после его отработки получу аутпут параметры, и не получаю...Нет, SQLMoreResults() здесь не нужен. А вот один вызов SQLFetch() может пригодится. :)
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699313
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot White Owl
Lenieа если ХП выполняется (SQLExecute = SQL_NO_DATA), но не возвращает резалтсет (SQLNumResultCols = 0), то выбирать нечего, я не вызываю SQLFetch. Вместо него вызываю SQLMoreResults в ожидании что после его отработки получу аутпут параметры, и не получаю...Нет, SQLMoreResults() здесь не нужен. А вот один вызов SQLFetch() может пригодится. :)[/quot]
ага...
а если SQLFetch() возвращает ошибку, значит я неправильно написала функцию...
прочту внимательно все посты и переделаю, спасибо
(ошибка от SQLFetch() такая: "Invalid cursor state, The StatementHandle was in an executed state but no result set was associated with the StatementHandle")
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699380
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenieа если SQLFetch() возвращает ошибку, значит я неправильно написала функцию...ээээ.... не обязательно.... Тут проблема в том, что вопрос "когда именно возвращаемый параметр становится доступным" официально нигде не отвечен. И каждый производитель БД и драйвера к этой БД может сделать что угодно. Тут надо смотреть на конкретную базу, конкретный драйвер.
Но стандарт де-факто на сегодня: Если процедура не возвращает резалтсета в принципе, но имеет возвращаемый параметр, этот возвращаемый параметр будет доступен сразу после SQLExecute(). Если есть и резалтсет и возвращаемый параметр, то пока весь резалтсет не выбран через SQLFetch() возвращаемый параметр доступен не будет.

Lenieпрочту внимательно все посты и переделаю, спасибо
(ошибка от SQLFetch() такая: "Invalid cursor state, The StatementHandle was in an executed state but no result set was associated with the StatementHandle")Да, это правильная ошибка для процедуры без резалтсета.

А вообще, я бы сначала посмотрел повнимательнее на определение параметра... Может ты его забыла объявить SQL_PARAM_OUTPUT или дала мало памяти под буффер?
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699444
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlНо стандарт де-факто на сегодня: Если процедура не возвращает резалтсета в принципе, но имеет возвращаемый параметр, этот возвращаемый параметр будет доступен сразу после SQLExecute(). Если есть и резалтсет и возвращаемый параметр, то пока весь резалтсет не выбран через SQLFetch() возвращаемый параметр доступен не будет.
понятно
у меня есть всё: и возвращаемый параметр, и аутпут параметр и возможно резалтсет

White OwlА вообще, я бы сначала посмотрел повнимательнее на определение параметра... Может ты его забыла объявить SQL_PARAM_OUTPUT или дала мало памяти под буффер?

с этим все в порядке

получается такая штука: не работает (не возвращаются значения OUT параметров из ХП в связанные переменные в программе), если в ХП есть более одного UPDATE.
Выполнение ХП в query analyzer работает, а из вижул студио - нет.
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699470
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lenieполучается такая штука: не работает (не возвращаются значения OUT параметров из ХП в связанные переменные в программе), если в ХП есть более одного UPDATE.
Выполнение ХП в query analyzer работает, а из вижул студио - нет.

Если быть более точной, создаю простейшую хранимую процедуру с парой out параметров и возвращаемым значением. В теле процедуры просто присваиваю out параметрам некоторые значения и делаю некий UPDATE - в данном случае данные корректно передаются в out параметры. Если же добавляю совершенно идентичный UPDATE после первого UPDATE, то данные не возвращаются. Мистика. В чем может быть проблема?

Пример описанной процедуры:
SET @out1 = 123
SET @out2 = 'example'
UPDATE table1 SET filed1 = @out1
- работает


SET @out1 = 123
SET @out2 = 'example'
UPDATE table1 SET filed1 = @out1
UPDATE table1 SET filed1 = @out1
- не работает (два UPDATE)
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699538
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LenieМистика. В чем может быть проблема?Полностью процедуру показывай. Со всеми заголовками и конечными end'ами...
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699549
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CREATE PROCEDURE [dbo].[_test]
@SessionID BIGINT,
@UserID BIGINT OUT,
@LoginName NVARCHAR(15) OUT,
@Password NVARCHAR(15) OUT
AS
BEGIN
UPDATE USER_Connections SET UserID = @UserID WHERE [ID] = @SessionID

SET @UserID = 100
SET @LoginName = 'Guest'
SET @Password = 'GP'

UPDATE USER_Connections SET UserID = 99 WHERE [ID] = 99

RETURN 200
END
GO


Данные в таблицах обновляются (инструкция UPDATE срабатывает), только нет результата в аутпут параметрах.
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699691
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LenieДанные в таблицах обновляются (инструкция UPDATE срабатывает), только нет результата в аутпут параметрах.Ok... a если второй update убрать, то тот-же самый клиент, без перекомпиляции будет получать корректные значения через output параметры?
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699709
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl LenieДанные в таблицах обновляются (инструкция UPDATE срабатывает), только нет результата в аутпут параметрах.Ok... a если второй update убрать, то тот-же самый клиент, без перекомпиляции будет получать корректные значения через output параметры?
да, именно так...

в общем, проблема даже не в output параметрах, а в более одном апдейте

на этом сайте http://www.sql.ru/forum/actualthread.aspx?tid=400996 нашла линк про "Data conflicts when procedures read from or write to tables" (http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/ad/c0009164.htm)

попробовала в ХП объявить курсор и делать обновление таблицы внутри курсора, но не прокатило, ошибка осталась (за ошибку я считаю, когда RETURN_VALUE мне не возвращается, т.е. аутпут параметры отложила в сторону, т.к. повторюсь проблема в двух и более вызовах инструкции UPDATE)

CREATE PROCEDURE [dbo].[_test2]
AS
BEGIN

DECLARE crs CURSOR FOR
SELECT a, b FROM z --FOR UPDATE OF a, b

OPEN crs
UPDATE z SET a = 1, b = 'b'
CLOSE crs

OPEN crs
UPDATE z2 SET a = 2, b = 'c'
CLOSE crs

RETURN 199

END
GO

вызов такой ХП из программы с++ возвращает RETURN VALUE = 0 (таким, как я его проинициализировала изначально)
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699745
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenie White Owl LenieДанные в таблицах обновляются (инструкция UPDATE срабатывает), только нет результата в аутпут параметрах.Ok... a если второй update убрать, то тот-же самый клиент, без перекомпиляции будет получать корректные значения через output параметры?
да, именно так...Cтранный глюк. Прикола ради можно попробовать сделать set переменных после второго update.
Вообще, мне начинает казаться, что тут действитель надо копать в сторону SQLMoreResults() Во всяком случае в описании этой функции есть глава "Availability of Row Counts" с кучей предупреждений что это все на уровне "может быть так а может и не так и все зависит от сервера и его настроек".
Попробуй после SQLExecute запустить цикл с SQLMoreResults() и читать параметры между каждым вызовом. Появятся?

По идее каждый update записывает в специальную переменную количество измененых строк. И на некоторых серверах (не знаю как насчет SQL Server) это количество строк можно прочитать через SQLRowCount(). В случае если в пакете было несколько update надо будет звать пару SQLRowCount()/SQLMoreResults() столько раз, сколько было update в пакете. Возможно что установка output параметров в процедуре тоже где-то там завязана....

А вообще, если честно, я не любою использовать output параметры. Не удобно это. Именно вот из-за таких приколов. Намного проще и удобнее делать возврат через резалтсеты, они по крайней мере стандартизированы и поэтому предсказуемы.
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699772
Lenie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тут такое дело...
в родном мсдн-е нашла статью и.... короче, вписала в ХП на серваке строку
"SET NOCOUNT ON" и почему-то заработало, т.е. стало всё возвращаться.
я уже завтра подумаю, почему заработало

White OwlCтранный глюк. Прикола ради можно попробовать сделать set переменных после второго update.
Вообще, мне начинает казаться, что тут действитель надо копать в сторону SQLMoreResults() Во всяком случае в описании этой функции есть глава "Availability of Row Counts" с кучей предупреждений что это все на уровне "может быть так а может и не так и все зависит от сервера и его настроек".
Попробуй после SQLExecute запустить цикл с SQLMoreResults() и читать параметры между каждым вызовом. Появятся?
когда нет резалтсета, то вызовы SQLMoreResults в цикле бессмысленны я так понимаю...
White OwlПо идее каждый update записывает в специальную переменную количество измененых строк. И на некоторых серверах (не знаю как насчет SQL Server) это количество строк можно прочитать через SQLRowCount(). В случае если в пакете было несколько update надо будет звать пару SQLRowCount()/SQLMoreResults() столько раз, сколько было update в пакете. Возможно что установка output параметров в процедуре тоже где-то там завязана....
ой, я уже не соображаю, надо сделать 8-часовой перерыв :)
White OwlА вообще, если честно, я не любою использовать output параметры. Не удобно это. Именно вот из-за таких приколов. Намного проще и удобнее делать возврат через резалтсеты, они по крайней мере стандартизированы и поэтому предсказуемы.
да, но ведь иногда аутпут параметры удобней...

БОЛЬШОЕ СПАСИБО, White Owl, MasterZiv, я вам так благодарна за помощь и терпение, виртуально пожимаю руки :)
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699795
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenie пишет:
> получается такая штука: не работает (не возвращаются значения OUT
> параметров из ХП в связанные переменные в программе), если в ХП есть
> более одного UPDATE.

set nocount on
в процедуре есть ?

Это

> Выполнение ХП в query analyzer работает, а из вижул студио - нет.

означает только что QA делает весь цикл выборки данных как положено,
а ты - нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699800
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenieтут такое дело...
в родном мсдн-е нашла статью и.... короче, вписала в ХП на серваке строку
"SET NOCOUNT ON" и почему-то заработало, т.е. стало всё возвращаться.
я уже завтра подумаю, почему заработало
А вот как раз по этому:
White OwlПо идее каждый update записывает в специальную переменную количество измененых строк. И на некоторых серверах (не знаю как насчет SQL Server) это количество строк можно прочитать через SQLRowCount(). В случае если в пакете было несколько update надо будет звать пару SQLRowCount()/SQLMoreResults() столько раз, сколько было update в пакете. Возможно что установка output параметров в процедуре тоже где-то там завязана....


Lenieда, но ведь иногда аутпут параметры удобней...Мне тоже так казалось в детстве :)
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699801
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenie пишет:
> да, именно так...
>
> в общем, проблема даже не в output параметрах, а в более одном апдейте

Тут был бы очень полезно установить ODBC SDK и запустить имеющуюся
там программу тестовую для ODBC. Там их есть несколько.
Очень полезно. Если и оно не сработает, то очень вероятно что
баг в драйвере (СУБД -то и драйвер какие ? ).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699803
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> А вообще, если честно, я не любою использовать output параметры. Не
> удобно это. Именно вот из-за таких приколов. Намного проще и удобнее
> делать возврат через резалтсеты, они по крайней мере стандартизированы и
> поэтому предсказуемы.


Ты не прав. Это ОЧЕНЬ удобно. Если конечно использовать по назначению.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699815
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenie пишет:
> тут такое дело...
> в родном мсдн-е нашла статью и.... короче, вписала в ХП на серваке строку
> "SET NOCOUNT ON" и почему-то заработало, т.е. стало всё возвращаться.
> я уже завтра подумаю, почему заработало

Потому что все равно у тебя выборка данных неправильно написана.
Не универсально. Было б универсально - все бы работало и с
nocount on и с OFF.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Вызов процедур. Текстовые поля.
    #34699820
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lenie пишет:
> когда нет резалтсета, то вызовы SQLMoreResults в цикле бессмысленны я
> так понимаю...

НЕТ НЕТ НЕТ ! Очень даже осмысленен.
По крайней мере не повредит.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вызов процедур. Текстовые поля.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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