Ошибка присваивания при назначении значения параметризованному запросу

Я использую 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 доступ к параметру, поэтому у вас есть дополнительная защита от несоответствия параметров

В вашем примере я рекомендую использовать индексированный доступ к параметрам вместо часто используемых именованных, который должен искать список параметров перед доступом и который медленнее.

Другие вопросы по тегам