|
|
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
В прошлый раз Вы провели мне классный ликбез :). Еще раз большое спасибо за это. Помогите пож-та и сейчас. Вызываю процедуру, в которой объявлен текстовый OUTPUT параметр. Могу ли я ДО ВЫЗОВА процедуры узнать, какой размер данных из текстового поля мне вернется? Размер столбца я могу узнать после вызова SQLDescribeCol. Но мне бы хотелось узнать фактический размер данных в этом столбце до вызова SQLExecute - это возможно? В моем случае вопрос встал, потому что я передаю в качестве OUTPUT параметра указатель на строку и мне нужно выделить нужное кол-во памяти. Выделять память по размеру столбца - плохое решение, потому что чаще всего он намного превышает истинный размер данных. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 18:40 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
LenieВ прошлый раз Вы провели мне классный ликбез :). Еще раз большое спасибо за это. Помогите пож-та и сейчас. Вызываю процедуру, в которой объявлен текстовый OUTPUT параметр. Могу ли я ДО ВЫЗОВА процедуры узнать, какой размер данных из текстового поля мне вернется?Конечно! Как раз до вызова их и надо узнавать. Код: plaintext 1. 2. 3. 4. 5. 6. 7. LenieРазмер столбца я могу узнать после вызова SQLDescribeCol.Не путай, параметры это не столбцы. Это две разные сущности хоть они и похожи.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 18:52 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
White Owl, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2007, 19:08 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
скажите пжл, можно отлаживать хранимые процедуры на SQL Server 2000, которые вызываются из вижуал студио 2005 через SQL-функции? SQLExecute отрабатывает, но в OUTPUT-параметрах пусто, хотелось пошагово отследить выполнение ХП ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 17:05 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
Вопрос не в тот форум. Ходи в форум по этому уродцу SQL Server'у. Может там подскажут как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 17:57 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Вопрос не в тот форум. Ходи в форум по этому уродцу SQL Server'у. Может > там подскажут как. Не ругай его, он не всегда таким был, когда-то он был красавцем Sybase ASE. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 18:09 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
Lenie пишет: > скажите пжл, можно отлаживать хранимые процедуры на SQL Server 2000, > которые вызываются из вижуал студио 2005 через SQL-функции? Можно. В VC Enterprise и кажется еще что-то ставить надо на сервак. > SQLExecute отрабатывает, но в OUTPUT-параметрах пусто, хотелось пошагово > отследить выполнение ХП А тут и отлаживать нечего. До тех пор пока не выберешь все результаты, OUT -параметры не придут. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 18:10 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
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 в ожидании что после его отработки получу аутпут параметры, и не получаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 18:21 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
Lenie MasterZiv Не ругай его, он не всегда таким был, когда-то он был красавцем Sybase ASE. :) даже не думалаЗато я думал :) Lenieа если ХП выполняется (SQLExecute = SQL_NO_DATA), но не возвращает резалтсет (SQLNumResultCols = 0), то выбирать нечего, я не вызываю SQLFetch. Вместо него вызываю SQLMoreResults в ожидании что после его отработки получу аутпут параметры, и не получаю...Нет, SQLMoreResults() здесь не нужен. А вот один вызов SQLFetch() может пригодится. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 18:35 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
[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") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 18:51 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
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 или дала мало памяти под буффер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 19:18 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
White OwlНо стандарт де-факто на сегодня: Если процедура не возвращает резалтсета в принципе, но имеет возвращаемый параметр, этот возвращаемый параметр будет доступен сразу после SQLExecute(). Если есть и резалтсет и возвращаемый параметр, то пока весь резалтсет не выбран через SQLFetch() возвращаемый параметр доступен не будет. понятно у меня есть всё: и возвращаемый параметр, и аутпут параметр и возможно резалтсет White OwlА вообще, я бы сначала посмотрел повнимательнее на определение параметра... Может ты его забыла объявить SQL_PARAM_OUTPUT или дала мало памяти под буффер? с этим все в порядке получается такая штука: не работает (не возвращаются значения OUT параметров из ХП в связанные переменные в программе), если в ХП есть более одного UPDATE. Выполнение ХП в query analyzer работает, а из вижул студио - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 19:48 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 20:01 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
LenieМистика. В чем может быть проблема?Полностью процедуру показывай. Со всеми заголовками и конечными end'ами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 20:43 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
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 срабатывает), только нет результата в аутпут параметрах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 20:48 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
LenieДанные в таблицах обновляются (инструкция UPDATE срабатывает), только нет результата в аутпут параметрах.Ok... a если второй update убрать, то тот-же самый клиент, без перекомпиляции будет получать корректные значения через output параметры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 22:41 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
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 (таким, как я его проинициализировала изначально) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 22:55 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
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 параметры. Не удобно это. Именно вот из-за таких приколов. Намного проще и удобнее делать возврат через резалтсеты, они по крайней мере стандартизированы и поэтому предсказуемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 23:38 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
тут такое дело... в родном мсдн-е нашла статью и.... короче, вписала в ХП на серваке строку "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, я вам так благодарна за помощь и терпение, виртуально пожимаю руки :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2007, 23:59 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
Lenie пишет: > получается такая штука: не работает (не возвращаются значения OUT > параметров из ХП в связанные переменные в программе), если в ХП есть > более одного UPDATE. set nocount on в процедуре есть ? Это > Выполнение ХП в query analyzer работает, а из вижул студио - нет. означает только что QA делает весь цикл выборки данных как положено, а ты - нет. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 00:16 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
Lenieтут такое дело... в родном мсдн-е нашла статью и.... короче, вписала в ХП на серваке строку "SET NOCOUNT ON" и почему-то заработало, т.е. стало всё возвращаться. я уже завтра подумаю, почему заработало А вот как раз по этому: White OwlПо идее каждый update записывает в специальную переменную количество измененых строк. И на некоторых серверах (не знаю как насчет SQL Server) это количество строк можно прочитать через SQLRowCount(). В случае если в пакете было несколько update надо будет звать пару SQLRowCount()/SQLMoreResults() столько раз, сколько было update в пакете. Возможно что установка output параметров в процедуре тоже где-то там завязана.... Lenieда, но ведь иногда аутпут параметры удобней...Мне тоже так казалось в детстве :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 00:19 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
Lenie пишет: > да, именно так... > > в общем, проблема даже не в output параметрах, а в более одном апдейте Тут был бы очень полезно установить ODBC SDK и запустить имеющуюся там программу тестовую для ODBC. Там их есть несколько. Очень полезно. Если и оно не сработает, то очень вероятно что баг в драйвере (СУБД -то и драйвер какие ? ). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 00:19 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > А вообще, если честно, я не любою использовать output параметры. Не > удобно это. Именно вот из-за таких приколов. Намного проще и удобнее > делать возврат через резалтсеты, они по крайней мере стандартизированы и > поэтому предсказуемы. Ты не прав. Это ОЧЕНЬ удобно. Если конечно использовать по назначению. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 00:23 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
Lenie пишет: > тут такое дело... > в родном мсдн-е нашла статью и.... короче, вписала в ХП на серваке строку > "SET NOCOUNT ON" и почему-то заработало, т.е. стало всё возвращаться. > я уже завтра подумаю, почему заработало Потому что все равно у тебя выборка данных неправильно написана. Не универсально. Было б универсально - все бы работало и с nocount on и с OFF. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 00:41 |
|
||
|
Вызов процедур. Текстовые поля.
|
|||
|---|---|---|---|
|
#18+
Lenie пишет: > когда нет резалтсета, то вызовы SQLMoreResults в цикле бессмысленны я > так понимаю... НЕТ НЕТ НЕТ ! Очень даже осмысленен. По крайней мере не повредит. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2007, 00:46 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34699709&tid=2028441]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
168ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 467ms |

| 0 / 0 |
