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

时间:2015-01-23 15:34:28

标签: sql-server delphi

我使用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运行相似的代码,我有结果,但我总是有相同的消息错误

1 个答案:

答案 0 :(得分:1)

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

您在此处清除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;的错误,INSERT用于执行不返回行集的查询,例如DELETEADOQuery4.Open,等等。您需要使用ADOQuery4.Active := TrueSELECT代替ExecSQL。这是你得到的错误的实际原因;你使用返回行集的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; ,这是无效的。

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

dbgridappr2.DataSource

(我不知道DisableControls的所有杂耍是什么,但除非你从不同的查询中更改数据源,否则这些都不是必需的。调用EnableControls并且{{1}}会阻止在执行新查询时更新任何UI组件。)