将 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;