Ошибка присваивания при назначении значения параметризованному запросу
Я использую Delphi XE2 с компонентами AnyDac и базой данных Advantage 10. В своем коде я использую параметризованные запросы:
q.SQL.Text := 'SELECT * FROM Table1 ' +
'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
'WHERE ' +
':0 BETWEEN Table1.StartAm AND Table1.EndeAm ' +
'AND Table2 = :1';
q.Params[0].Value := AStartDateTime;
q.Params[1].Value := AIDRessourcenGruppe;
q.Open;
это заканчивается в исключении:
Exception der Klasse EADSNativeException mit der Meldung '[AnyDAC] [Phys] [ADS] Ошибка 7200: ошибка AQE: состояние = 22018;
NativeError = 2112; [Решения iAnywhere][Advantage SQL Engine] Ошибка назначения ' aufgetreten.
конечно, AStartDateTime является допустимым значением Delphi TDateTime, AIDRessourcenGruppe является целочисленным значением.
Интересно, что эти два варианта работают:
q.SQL.Text := 'SELECT * FROM Table1 ' +
'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
'WHERE ' +
':0 BETWEEN Table1.StartAm AND Table1.EndeAm ' +
'AND Table2 = :1';
q.Params[0].AsDateTime:= AStartDateTime;
q.Params[1].AsInteger:= AIDRessourcenGruppe;
q.Open;
-
q.SQL.Text := 'SELECT * FROM Table1 ' +
'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
'WHERE ' +
':SomeDate BETWEEN Table1.StartAm AND Table1.EndeAm ' +
'AND Table2 = :ID_PT_Ressourcengruppe';
q.ParamByName('SomeDate').Value := AStartDateTime;
q.ParamByName('ID_PT_Ressourcengruppe').Value := AIDRessourcenGruppe;
q.Open;
Я что-то пропустил? Спасибо за любую помощь!
1 ответ
Ответ - просто предположение:
Я бы сказал, индексированный доступ для записи в Value
Свойство параметров не определяет тип данных параметров, в то время как именованный доступ делает. И если это правильно, то у вас проблемы, потому что вы передаете все значения через Variant
тип, который должен быть преобразован в правильный формат значения перед выполнением запроса. Но все это только мое предположение - я вообще не знаю AnyDAC!
Доступ к значению AsType:
Я публикую это только потому, что мне не нравится Value
доступ к параметрам, чтобы называться профессиональным:-)
Лучше использовать AsType
Typecast хотя бы потому что:
это быстрее, потому что вы прямо говорите, какой тип вы передаете определенному параметру, таким образом, обработчик параметров запроса не должен это определять, и по сравнению с
Value
доступ, не нужно конвертироватьVariant
типэто безопаснее для вас, потому что вы не можете передать, например, строковое значение
AsDateTime
доступ к параметру, поэтому у вас есть дополнительная защита от несоответствия параметров
В вашем примере я рекомендую использовать индексированный доступ к параметрам вместо часто используемых именованных, который должен искать список параметров перед доступом и который медленнее.