Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странное поведение TADOCommand


Max Zyuzin ©   (2005-12-08 12:52:00) 

Приветствую всех!

Динамически создаю TADOCommand делаю следующий "финт ушами"

WorkADOCommand.CommandText := 'update CustPayment set cpPaymDate = :pcpPaymDate, cpPaymNumber = :pcpPaymNumber '+
'where cpCustomer = :pcpCustomer and cpDate = :pcpDate and cpPaymSum = :pcpPaymSum and  cpCustContract = :pcpCustContract '+
' and cp1CDocNum = :pcp1CDocNum and cpCurCode = :pcpCurCode ';
if GetSubstr(curStr,7) = ' ' then WorkADOCommand.Parameters.ParamByName('pcpPaymNumber').Value := NULL
else WorkADOCommand.Parameters.ParamByName('pcpPaymNumber').Value := StrToInt(GetSubstr(curStr,7));
if GetSubstr(curStr,8) = ' ' then WorkADOCommand.Parameters.ParamByName('pcpPaymDate').Value := NULL
else WorkADOCommand.Parameters.ParamByName('pcpPaymDate').Value := StrToDate(GetSubstr(curStr,8));

....

WorkADOCommand.Execute(i,NULL);



GetSubstr функция собственного написания.

Так вот вне зависимости от того что присваиваешь параметру pcpPaymDate результат один и тот же… после Execute поле NULL. При парсинге параметру присваивается корректное значение.
Значение полю cpPaymNumber при этом присваивается корректно.

И самое интересное, что если переделать 1-ю строчку на (т.е. просто поменять порядок)

WorkADOCommand.CommandText := 'update CustPayment set cpPaymNumber = :pcpPaymNumber, cpPaymDate = :pcpPaymDate '+
То теперь значение в поле с датой присваиваются корректно, а в cpPaymNumber NULL…

В общем как в том стихотворении «стою на асфальте я в лыжи обутый, то ли лыжи не едут, то ли я …»


Johnmen   (2005-12-08 14:29:00) [1]

>Max Zyuzin ©   (08.12.05 14:28) [18]
>ибо важен порядок значений параметров.

Это да :)


Max Zyuzin   (2005-12-08 14:28:00) [2]

>Johnmen ©   (08.12.05 14:19) [17]
На мой взгляд мене очевидный, проще запутаться... ибо важен порядок значений параметров.


Johnmen   (2005-12-08 14:19:00) [3]

>Max Zyuzin ©   (08.12.05 14:14) [16]

Ну почему же этот метод кривой? Совсем нет. Притом "быстрый", о чём также говорится в хелпе.


Max Zyuzin   (2005-12-08 14:14:00) [4]

В обчем вниматеьно перечитал, понял за параметры имелись ввиду в Execute. Вот только вопрос неужто токо таким "кривым" способом можно вытащить количество обработаных строк?


Johnmen   (2005-12-08 13:59:00) [5]


> msguns ©   (08.12.05 13:49) [14]
> Жэка, не умничай
>  ;)


Я только чуть-чуть :)
Есть у меня такая слабость...


msguns   (2005-12-08 13:49:00) [6]

>Johnmen ©   (08.12.05 13:13) [7]
>Серёга, если что-то катит, то это не значит, что только так и нужно катить...

Жэка, не умничай
 ;)


Desdechado   (2005-12-08 13:41:00) [7]

Зачем так сложно с самописными функциями? Можно ведь:

ParamCheck := True;
CommandText := ...
oParam := Params.FindParam( 'P_Type' );
if( oParam <> nil ) then
 oParam.Value := ...

или я что-то не понял?


Johnmen   (2005-12-08 13:41:00) [8]

>Max Zyuzin ©

Максим, я не поленился нажать F1 на TADOCommand и Using TADOCommand.
Там всё так понятно написано...:)


msguns   (2005-12-08 13:30:00) [9]

>Плохиш ©   (08.12.05 13:19) [9]
>Тогда возникает вопрос, какой смысл вложен в WorkADOCommand.Execute(i,NULL);?

см. [5]. Хотя самому интересно ;)


Max Zyuzin   (2005-12-08 13:30:00) [10]

>Плохиш ©   (08.12.05 13:19) [9]
мне хочется узнать сколько записей обработано


Плохиш   (2005-12-08 13:19:00) [11]


> Max Zyuzin ©   (08.12.05 13:10) [5]

О, блин, только заметил, что в том так красиво отформатированном коде, параметры написаны.
Тогда возникает вопрос, какой смысл вложен в WorkADOCommand.Execute( i,NULL );?


Max Zyuzin   (2005-12-08 13:17:00) [12]

>Johnmen ©   (08.12.05 13:13) [7]
Женя & Сергей, чего вы решили что я присваиваю строку этому параметру? Там вроде стоит явное преобразование StrToDate... Что возвращает TDateTime


Johnmen   (2005-12-08 13:13:00) [13]

>msguns ©   (08.12.05 13:11) [6]

Серёга, если что-то катит, то это не значит, что только так и нужно катить...
:)


msguns   (2005-12-08 13:11:00) [14]

>Johnmen ©   (08.12.05 12:59) [2]
>Если тип datetime, то и присваивать надо
>WorkADOCommand.Parameters.ParamByName('pcpPaymDate').Value := <<TDateTime Value>>;

В ADO "катят" и "строчные" даты (и не только даты).


Max Zyuzin   (2005-12-08 13:10:00) [15]

>Плохиш ©   (08.12.05 13:01) [3]
Да, если сделать просто WorkADOCommand.Execute;
То все присваивается, мне хочется узнать сколько записей обработано, для этого и пытаюсь сделать WorkADOCommand.Execute(i,NULL)
Почитал хелп по Execute нашел что парметры типа OleVariant и все. без объяснения что же за параметры выполнения.

>Плохиш ©   (08.12.05 13:02) [4]
Подозрение верно... в морг? ;)


Плохиш   (2005-12-08 13:02:00) [16]


> Johnmen ©   (08.12.05 12:59) [2]
> Если тип datetime, то и присваивать надо
> WorkADOCommand.Parameters.ParamByName('pcpPaymDate').Value
> := <<TDateTime Value>>;

Есть подозрение, что он вообще Parameters не использует


Плохиш   (2005-12-08 13:01:00) [17]


> WorkADOCommand.Execute ( [i,NULL ] );


Johnmen   (2005-12-08 12:59:00) [18]

Если тип datetime, то и присваивать надо
WorkADOCommand.Parameters.ParamByName('pcpPaymDate').Value := <<TDateTime Value>>;


Max Zyuzin   (2005-12-08 12:53:00) [19]

Ой забыл укзать... MSSQL, D7


Наверх

Титульная страница Поиск, карта сайта Написать письмо