powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не понял, в натуре - Output Parameter + ADO + VC++
7 сообщений из 7, страница 1 из 1
Не понял, в натуре - Output Parameter + ADO + VC++
    #32014371
vavania
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не завалялся ли subj example у somebody?
Что-то я опух: примеры у Гейтса однобокие, а тут выяснилось, что есть bug'и в этом месте ADO,
так что и непонятно: то ли я неправ, то ли - они. Суть в том, что в Stored Procedure передаются
параметры, в том числе и OUTPUT:

CREATE PROCEDURE sp_SponsorShortTryWrite
@NAME2 VARCHAR(30),@ID INT OUTPUT AS
...
SELECT @ID = ID FROM DOGOVOR WHERE NAME2 = @NAME2
так вот, если процедура выполняет только SELECT, то в @ID есть значение:
IF @ID IS NOT NULL RETURN @ID
если же будет запись (а там триггеры и т.п.) то @ID = 0?!!!:
SELECT @ID = ISNULL(MAX(ID),0)+1 FROM DOGOVOR
INSERT INTO DOGOVOR (ID,NAME2) VALUES (@ID,@NAME2)

RETURN @ID

В Query Analyzer все пучком - дело где-то в ADO for VС++, но где?
------- Добавляется параметр вот так:
Param1 = m_Command->CreateParameter( _bstr_t(L""),
ADONS::adInteger,
ADONS::adParamInputOutput,//adParamOutput,
-1,_variant_t( i) );
Param1->Value = _variant_t( i );
k = m_Command->Parameters->Append( Param1 );
------- Забирается вот так:
_variant_t var = m_Command->GetParameters()->GetItem((_variant_t)i)->Value;
------- Инициализация Stored Proc вот так:
m_Command->PutCommandText((_bstr_t)"EXEC sp_SponsorShortTryWrite ?,? OUTPUT");
m_Command->CommandType = ADONS::adCmdStoredProc; // type
...
Рейтинг: 0 / 0
Не понял, в натуре - Output Parameter + ADO + VC++
    #32014386
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Классная ситуация! Полдня с ней вожусь и наконец-то доперло


Делюсь результатом. Фишка в том, что когда ты передаешь параметр через ADO, ты выставляешь ему определенное значение (ноль, например). Если SELECT @id = ID FROM DOGOVOR WHERE NAME2 = @NAME2 не может выбрать ни одной строчки, то он НЕ УСТАНАВЛИВАЕТ @id в null. Следовательно, IF @ID is not null работает не так, как ты ожидаешь. Он честно проверяет условие 0 is not null и честно выходит из процедуры. Ситуация лечится добавлением в процедуру первой строки set @ID = null.

Несколько замечаний по всему остальному:

1. У тебя какое-то странное описание параметров. Мне даже удивительно, что твой код вообще работал. Для примера -
par1 = com1->CreateParameter(_bstr_t(L"@NAME2"), adVarChar, adParamInput, bstrVal.length(), bstrVal);
par2 = com1->CreateParameter(_bstr_t(L"@ID"), adInteger, adParamInputOutput, -1, _variant_t((long)0));
com1->Parameters->Append(par1);
com1->Parameters->Append(par2);

com1->Execute(NULL, NULL, 0);
То есть невредно именовать параметры - самому же удобнее будет.

2. Собственно о процедуре. Насколько я понимаю, тебе хотелось получить вот такое поведение - если строчка с таким именем в таблице есть, то вернуть ее ID, если нет, то добавить новую и вернуть полученный ID для новой строки. Так ? Ну, а теперь представь, что с твоей программой работает несколько пользователей и они разом ломанулись добавлять договора. Ты считаешь, что строки SELECT @ID = ISNULL(MAX(ID), 0) + 1 FROM DOGOVOR и INSERT INTO DOGOVOR (ID, NAME2) VALUES (@ID, @NAME2) выполняются строго одна за другой. На самом деле может быть ситуация, что двое практически ОДНОВРЕМЕННО сделали select, получили один и тот же ID, а потом попытались выполнить insert. Нельзя!

3. Запись return @id означает поведение процедуры как функции, то есть то же, что в сишнике будет return id. Для output параметра это бессмысленно. В твоем случае надо просто присваивать @id какое-то значение и выполнять return.

Спасибо за интересный пример! Мне аж понравилось
...
Рейтинг: 0 / 0
Не понял, в натуре - Output Parameter + ADO + VC++
    #32014413
vavania
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за доброжелательное терпение к моему творчеству...

1) set @ID = null - yes, of course
2) Вроде можно и не именовать...Я уж по всякому пробовал.
3) Согласен, типа - нехорошо, но у нас везде так. И работает... А как получше?
4) Согласен, и это, видимо, ввело меня в заблуждение о том, что иногда работает, а иногда - нет.
Я хотел разобраться раз - и навсегда, используя возможности как OUTPUT PARAMETERS, так и RETURN.
Так вот RETURN VALUE я получаю, а ,блин, OUTPUT PARAMETER никак не хочут вылазить. Гады...Гадо...GADO.
Вроде и описал их как adParamInputOutput, и в описании посредством sp_procedure_params_rowset все пучком.

Еще раз thanks.
...
Рейтинг: 0 / 0
Не понял, в натуре - Output Parameter + ADO + VC++
    #32014417
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, хорошо, что заработало.

Тогда еще чуть-чуть комментариев -

>3) Согласен, типа - нехорошо, но у нас везде так. И работает...
Это в корне неправильный подход! Законов Мерфи не читал? Оно не сработает именно в самый критичный момент. Кроме того, твой подход (понимаю, что неправильно, но исправлять не хочу) сильно попахивает дилетантством. Почему бы тебе не использовать identity? Если ты юзаешь SQL2K, то там есть крайне полезная штука SCOPE_IDENTITY, выгодно отличающаяся от @@identity тем, что возвращает последний @@identity в _данной_области_видимости_. Так что не возникнет никаких проблем с тем, что в триггерах делаются вставки в таблицы, где тоже есть поле identity и из-за этого в триггер верхнего уровня возвращается неправильное значение.

У меня прекрасно работают и OUTPUT PARAMETERS, и RETURN. Прежде, чем вопить "гады!", подумай, а может дело не в бобине? Легче всего сказать, что это баг производителя. Труднее критически оценить свой код. Напиши подробнее, в какой ситуации у тебя не работают параметры - я постараюсь подсказать.
...
Рейтинг: 0 / 0
Не понял, в натуре - Output Parameter + ADO + VC++
    #32014460
GreenGlass@mail.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) Э не-е-ет, фигушки - я плотоядная. Давай IDENTITY использовать не будем - при репликациях придется напрягаться...
А может, и будем... надо ссумировать все и . Мы когда-то использовали идентютю, потом отказались.

2) OUTPUT PARAMETER запустил. Я упертый. Путаница с RETURN в процедуре приводила к путанице и в коде.

Sincerely thanks for attention. Война окончена. Всем спасибо...
...
Рейтинг: 0 / 0
Не понял, в натуре - Output Parameter + ADO + VC++
    #32014477
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет уж, нет уж Война еще не окончена!

1) Насчет identity присоединяюсь целиком и полностью, потому как уже довольно приличное время имею много любви с репликацией, преимущественно merge. В результате в качестве primary key везде использую поле типа uniqueidentifier и не жалуюсь. Вот в этом случае твой подход можно будет нормально использовать, заменив получение максимального ID + 1 на newid(). Тогда многопользовательская система будет работать правильно.
2) Параметр запустил, говоришь? Ну вот, а то - в Микрософте багов насажали, уроды... Сперва неплохо в зеркало смотреться


А насчет многих пользователей и неизбежной паузы между select и insert ты все-таки подумай, подумай... Пока идет "офисная" работа, все будет пучком. А вот когда возникнет надобность закачать МНОГО данных сразу через скрипты, а не ручками пользователя (архив обработать или там еще что...), то здесь геморрой и начнется - и ладно, если ты будешь рагребать получившуюся траблу, а то ведь можешь кого-нибудь еще подставить, если кто вместо тебя окажется. Непрофессионально мыслишь!
...
Рейтинг: 0 / 0
Не понял, в натуре - Output Parameter + ADO + VC++
    #32014485
GreenGlass@mail.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уж больно неудобно работать с этим uni... как его, бишь, там? Не выговоришь. И не напишешь.
Я спроектировал одну базу с ихним использованием. Чой-то не понравилось. Неловко как-то. Несподручно.

P.S. А воще-то я с самого начала допускал небольшую возможность собственной неправоты...
P.S.S. И все равно, гады.

За сим Ваш, уродский дилетант.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не понял, в натуре - Output Parameter + ADO + VC++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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