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

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

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

Спасибо.
...
Рейтинг: 0 / 0
27.07.2007, 18:52
    #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
27.07.2007, 19:08
    #34690221
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
White Owl, спасибо!
...
Рейтинг: 0 / 0
01.08.2007, 17:05
    #34698914
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
скажите пжл, можно отлаживать хранимые процедуры на SQL Server 2000, которые вызываются из вижуал студио 2005 через SQL-функции?
SQLExecute отрабатывает, но в OUTPUT-параметрах пусто, хотелось пошагово отследить выполнение ХП
...
Рейтинг: 0 / 0
01.08.2007, 17:57
    #34699146
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
Вопрос не в тот форум. Ходи в форум по этому уродцу SQL Server'у. Может там подскажут как.
...
Рейтинг: 0 / 0
01.08.2007, 18:09
    #34699189
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
White Owl пишет:
> Вопрос не в тот форум. Ходи в форум по этому уродцу SQL Server'у. Может
> там подскажут как.

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

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

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

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

А тут и отлаживать нечего. До тех пор пока не выберешь все результаты,
OUT -параметры не придут.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
01.08.2007, 18:21
    #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
01.08.2007, 18:35
    #34699272
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
Lenie MasterZiv
Не ругай его, он не всегда таким был, когда-то он был красавцем Sybase ASE.
:) даже не думалаЗато я думал :)

Lenieа если ХП выполняется (SQLExecute = SQL_NO_DATA), но не возвращает резалтсет (SQLNumResultCols = 0), то выбирать нечего, я не вызываю SQLFetch. Вместо него вызываю SQLMoreResults в ожидании что после его отработки получу аутпут параметры, и не получаю...Нет, SQLMoreResults() здесь не нужен. А вот один вызов SQLFetch() может пригодится. :)
...
Рейтинг: 0 / 0
01.08.2007, 18:51
    #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
01.08.2007, 19:18
    #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
01.08.2007, 19:48
    #34699444
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
White OwlНо стандарт де-факто на сегодня: Если процедура не возвращает резалтсета в принципе, но имеет возвращаемый параметр, этот возвращаемый параметр будет доступен сразу после SQLExecute(). Если есть и резалтсет и возвращаемый параметр, то пока весь резалтсет не выбран через SQLFetch() возвращаемый параметр доступен не будет.
понятно
у меня есть всё: и возвращаемый параметр, и аутпут параметр и возможно резалтсет

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

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

получается такая штука: не работает (не возвращаются значения OUT параметров из ХП в связанные переменные в программе), если в ХП есть более одного UPDATE.
Выполнение ХП в query analyzer работает, а из вижул студио - нет.
...
Рейтинг: 0 / 0
01.08.2007, 20:01
    #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
01.08.2007, 20:43
    #34699538
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
LenieМистика. В чем может быть проблема?Полностью процедуру показывай. Со всеми заголовками и конечными end'ами...
...
Рейтинг: 0 / 0
01.08.2007, 20:48
    #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
01.08.2007, 22:41
    #34699691
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
LenieДанные в таблицах обновляются (инструкция UPDATE срабатывает), только нет результата в аутпут параметрах.Ok... a если второй update убрать, то тот-же самый клиент, без перекомпиляции будет получать корректные значения через output параметры?
...
Рейтинг: 0 / 0
01.08.2007, 22:55
    #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
01.08.2007, 23:38
    #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
01.08.2007, 23:59
    #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
02.08.2007, 00:16
    #34699795
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедур. Текстовые поля.
Lenie пишет:
> получается такая штука: не работает (не возвращаются значения OUT
> параметров из ХП в связанные переменные в программе), если в ХП есть
> более одного UPDATE.

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

Это

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

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


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

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

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


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

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

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


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