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 没有行集的查询,例如 INSERT
、DELETE
等。对于 SELECT
,您需要使用 ADOQuery4.Open
或 ADOQuery4.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 更改数据源,否则这是必要的。调用到 DisableControls
和 EnableControls
在执行新查询时停止更新任何 UI 组件。)
我使用 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 没有行集的查询,例如 INSERT
、DELETE
等。对于 SELECT
,您需要使用 ADOQuery4.Open
或 ADOQuery4.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 更改数据源,否则这是必要的。调用到 DisableControls
和 EnableControls
在执行新查询时停止更新任何 UI 组件。)