Delphi : 使用 SQL 聚合函数的 AdoQuery 不正确的参数消息错误

Delphi : incorrect parameter message error with AdoQuery using SQL aggregate function

我使用 delphi XE5,我有一个包含 7 个表的数据库,我的问题是:我单击了一个按钮,其中 运行 是此代码:

dbgridappr2.Enabled:=false;
adoquery4.Parameters.Clear;
datasource6.DataSet:=adoquery4;
ADOQuery4:=TADOQuery.Create(Application);
adoquery4.Active:=False;
adoquery4.Connection:=ADOConnection1;
adoquery4.SQL.Clear;
adoquery4.SQL.Add('select SPEC.ISp AS ''Spécialité'',COUNT(APPR.NValAp) AS ''Nombre dApprentis de même Spécialité''  ');
adoquery4.SQL.Add('FROM APPR,SPEC ');
adoquery4.SQL.Add('where SPEC.CSp=APPR.CSp ');
adoquery4.SQL.Add('GROUP BY SPEC.ISp ');
adoquery4.SQL.Add('ORDER BY COUNT(APPR.NValAp) desc ');
ADOQuery4.Prepared := True;
ADOQuery4.ExecSQL;
//adoquery4.Open;
adoquery4.Active:=true;
dbgridappr2.Visible:=true;
dbgridappr2.DataSource:=datasource6;
dbgridappr2.Enabled:=true;

我在 DbGrid 中得到了结果,但消息错误显示不正确的参数 ??

我更改了按钮代码,但总是收到相同的错误消息。我有 10 个按钮,所有 运行 相似代码但不同 AdoQuery 我得到了结果,但我总是有相同的消息错误

您发布的代码一团糟。原因如下:

你把这里的adoquery4.Parameters清空,把adoquery4赋值给datasource6.DataSet:

dbgridappr2.Enabled:=false;
adoquery4.Parameters.Clear;
datasource6.DataSet:=adoquery4;

然后您立即丢弃现有的 adoquery4(进程中的内存泄漏),并用 TADOQuery 的新实例替换它:

ADOQuery4:=TADOQuery.Create(Application);

然后关闭新创建的 ADOQuery4(此时不可能是 Active),分配一个连接(这没问题),并清除 SQL (这里不可能有任何内容):

adoquery4.Active:=False;
adoquery4.Connection:=ADOConnection1;
adoquery4.SQL.Clear;

到目前为止,您所做的大约 90% 都是毫无意义的。

然后您错误地调用了 ADOQuery4.ExecSQL;,它用于执行 return 没有行集的查询,例如 INSERTDELETE 等。对于 SELECT,您需要使用 ADOQuery4.OpenADOQuery4.Active := True。这是您收到错误的实际原因;您使用 SQL 语句调用 ExecSQL,return 是一个行集,这是无效的。

我们再试一次,在SQL过程中稍微改进一下。忽略您在此处发布的所有内容,然后重新开始:

ADOQuery4.DisableControls;
try
  // If the query is
  if ADOQuery4.Active then
    ADOQuery4.Close;

  ADOQuery4.Parameters.Clear;
  ADOQuery4.SQL.Clear;
  AdoQuery4.SQL.Add('select SPEC.ISp AS ''Spécialité'',');
  AdoQuery4.SQL.Add('COUNT(APPR.NValAp) AS ''Nombre dApprentis de même Spécialité''');
  AdoQuery4.SQL.Add('FROM APPR INNER JOIN SPEC');
  AdoQuery4.SQL.Add('ON SPEC.CSp = APPR.CSp');
  AdoQuery4.SQL.Add('GROUP BY SPEC.ISp ');
  AdoQuery4.SQL.Add('ORDER BY COUNT(APPR.NValAp) desc');
  ADOQuery4.Open;
finally
  ADOQuery4.EnableControls;
end;

(我不知道 dbgridappr2.DataSource 的所有杂耍是关于什么的,但是除非您从不同的查询 none 更改数据源,否则这是必要的。调用到 DisableControlsEnableControls 在执行新查询时停止更新任何 UI 组件。)