![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странное поведение 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