ADO Query обрабатывает метки goto как параметры

Я столкнулся с проблемой при выполнении сценария SQL в TADOQuery составная часть. Сценарий, который выполняется goto заявления вместе с соответствующими ярлыками, например:

goto MyLabel

MyLabel:
  --do something else

Тем не менее TADOQuery видит эти : символы и обрабатывать их как параметры (которые они не являются параметрами), и выдает мне ошибку:

Parameter object is improperly defined. Inconsistent or incomplete information was provided

Как я могу проинструктировать TADOQuery не пытаться считать это параметрами?

1 ответ

Решение

Установите для AdoQuery.ParamCheck значение false.

Обновление ОП сказал в последующем комментарии, что вышесказанного было достаточно для его непосредственной проблемы, но он не сработал бы, если бы запрос содержал фактические параметры. Сначала я не мог заставить его работать с ними.

Однако, глядя на код TParameters.ParseSQL в ADODB (D7), автор, похоже, предвидел, что двоеточия будут встроены в SQL (я имею в виду, перед любым:paramname(s)), который можно ввести, чтобы действовать в качестве заполнителей для TParameters.), рассматривая двойное двоеточие (::) как особый случай. Поэтому я думаю, что целью было удвоить двоеточие, которое не нужно рассматривать как TParameter. Чтобы понять, что я имею в виду, посмотрите содержимое Memo1:

(PartialDFM)

object Memo1: TMemo
  Left = 32
  Top = 112
  Width = 297
  Height = 113
  Lines.Strings = (
    'declare'
    '  @number int'
    'select'
    '  @number = ?'
    'if @number > 0 goto positive'
    'if @number < 0 goto negative'
    ''
    'select ''zero'''
    ''
    'positive::'
    '  select ''positive'''
    '  goto'
    '    exitpoint'
    'negative::'
    '  select ''negative'''
    'exitpoint::')
end
object ADOQuery1: TADOQuery
  Connection = ADOConnection1
  Left = 64
  Top = 24
end

Затем для меня работает следующее (отображение "положительного", "отрицательного" или "нуля" в DBGrid в соответствии со значением, присвоенным AdoQuery1.Parameters[0].Value)

procedure TForm1.DoQuery;
begin
  if AdoQuery1.Active
    then AdoQuery1.Close;
  // AdoQuery1.Prepared := True;
  AdoQuery1.SQL.Text := Memo1.Lines.Text;
  AdoQuery1.ParamCheck := False;
  ADOQuery1.Parameters.Clear;
  ADOQuery1.Parameters.CreateParameter('Param1', ftInteger, pdInput, 1, Null);
  AdoQuery1.Parameters[0].Value := 666;
  AdoQuery1.Prepared := True;
  AdoQuery1.Open;
end;
Другие вопросы по тегам