3

我在TADOQuery组件中执行 SQL 脚本时遇到问题。正在执行的脚本具有goto语句及其相应的标签,例如:

goto MyLabel

MyLabel:
  --do something else

但是,TADOQuery看到这些:字符并将它们视为参数(它们不是参数),并给我一个错误:

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

我如何指示TADOQuery不要尝试将这些视为参数?

4

1 回答 1

5

将 AdoQuery.ParamCheck 设置为 false。

更新 OP 在后续评论中表示,上述内容足以解决他的直接问题,但如果查询包含实际的 :parameters,则不会起作用。最初,我也无法让它与它们一起工作。

但是,查看 ADODB (D7) 中的 TParameters.ParseSQL 的代码,作者似乎已经预料到冒号会嵌入到 SQL 中(我的意思是,在任何可能输入的 :paramname(s) 之前作为 TParameters 的占位符),通过将双冒号 (::) 视为特殊情况。因此,我认为其意图是应该将不想被视为 TParameter 的任何冒号加倍。要了解我的意思,请参阅 Memo1 的内容:

(部分DFM)

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

然后,以下对我有用(根据分配给 AdoQuery1.Parameters[0].Value 的值在 DBGrid 中显示“正”、“负”或“零”)

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;
于 2014-07-15T15:05:54.050 回答