Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Не понял, в натуре - Output Parameter + ADO + VC++
|
|||
|---|---|---|---|
|
#18+
Не завалялся ли 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2001, 12:19 |
|
||
|
Не понял, в натуре - Output Parameter + ADO + VC++
|
|||
|---|---|---|---|
|
#18+
Классная ситуация! Полдня с ней вожусь и наконец-то доперло Делюсь результатом. Фишка в том, что когда ты передаешь параметр через 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. Спасибо за интересный пример! Мне аж понравилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2001, 15:35 |
|
||
|
Не понял, в натуре - Output Parameter + ADO + VC++
|
|||
|---|---|---|---|
|
#18+
Спасибо за доброжелательное терпение к моему творчеству... 1) set @ID = null - yes, of course 2) Вроде можно и не именовать...Я уж по всякому пробовал. 3) Согласен, типа - нехорошо, но у нас везде так. И работает... А как получше? 4) Согласен, и это, видимо, ввело меня в заблуждение о том, что иногда работает, а иногда - нет. Я хотел разобраться раз - и навсегда, используя возможности как OUTPUT PARAMETERS, так и RETURN. Так вот RETURN VALUE я получаю, а ,блин, OUTPUT PARAMETER никак не хочут вылазить. Гады...Гадо...GADO. Вроде и описал их как adParamInputOutput, и в описании посредством sp_procedure_params_rowset все пучком. Еще раз thanks. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2001, 07:30 |
|
||
|
Не понял, в натуре - Output Parameter + ADO + VC++
|
|||
|---|---|---|---|
|
#18+
Ну, хорошо, что заработало. Тогда еще чуть-чуть комментариев - >3) Согласен, типа - нехорошо, но у нас везде так. И работает... Это в корне неправильный подход! Законов Мерфи не читал? Оно не сработает именно в самый критичный момент. Кроме того, твой подход (понимаю, что неправильно, но исправлять не хочу) сильно попахивает дилетантством. Почему бы тебе не использовать identity? Если ты юзаешь SQL2K, то там есть крайне полезная штука SCOPE_IDENTITY, выгодно отличающаяся от @@identity тем, что возвращает последний @@identity в _данной_области_видимости_. Так что не возникнет никаких проблем с тем, что в триггерах делаются вставки в таблицы, где тоже есть поле identity и из-за этого в триггер верхнего уровня возвращается неправильное значение. У меня прекрасно работают и OUTPUT PARAMETERS, и RETURN. Прежде, чем вопить "гады!", подумай, а может дело не в бобине? Легче всего сказать, что это баг производителя. Труднее критически оценить свой код. Напиши подробнее, в какой ситуации у тебя не работают параметры - я постараюсь подсказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2001, 07:47 |
|
||
|
Не понял, в натуре - Output Parameter + ADO + VC++
|
|||
|---|---|---|---|
|
#18+
1) Э не-е-ет, фигушки - я плотоядная. Давай IDENTITY использовать не будем - при репликациях придется напрягаться... А может, и будем... надо ссумировать все и . Мы когда-то использовали идентютю, потом отказались. 2) OUTPUT PARAMETER запустил. Я упертый. Путаница с RETURN в процедуре приводила к путанице и в коде. Sincerely thanks for attention. Война окончена. Всем спасибо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2001, 11:01 |
|
||
|
Не понял, в натуре - Output Parameter + ADO + VC++
|
|||
|---|---|---|---|
|
#18+
Нет уж, нет уж Война еще не окончена! 1) Насчет identity присоединяюсь целиком и полностью, потому как уже довольно приличное время имею много любви с репликацией, преимущественно merge. В результате в качестве primary key везде использую поле типа uniqueidentifier и не жалуюсь. Вот в этом случае твой подход можно будет нормально использовать, заменив получение максимального ID + 1 на newid(). Тогда многопользовательская система будет работать правильно. 2) Параметр запустил, говоришь? Ну вот, а то - в Микрософте багов насажали, уроды... Сперва неплохо в зеркало смотреться А насчет многих пользователей и неизбежной паузы между select и insert ты все-таки подумай, подумай... Пока идет "офисная" работа, все будет пучком. А вот когда возникнет надобность закачать МНОГО данных сразу через скрипты, а не ручками пользователя (архив обработать или там еще что...), то здесь геморрой и начнется - и ладно, если ты будешь рагребать получившуюся траблу, а то ведь можешь кого-нибудь еще подставить, если кто вместо тебя окажется. Непрофессионально мыслишь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2001, 12:45 |
|
||
|
Не понял, в натуре - Output Parameter + ADO + VC++
|
|||
|---|---|---|---|
|
#18+
Уж больно неудобно работать с этим uni... как его, бишь, там? Не выговоришь. И не напишешь. Я спроектировал одну базу с ихним использованием. Чой-то не понравилось. Неловко как-то. Несподручно. P.S. А воще-то я с самого начала допускал небольшую возможность собственной неправоты... P.S.S. И все равно, гады. За сим Ваш, уродский дилетант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2001, 13:22 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32014460&tid=1825466]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 387ms |

| 0 / 0 |
