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;