首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi :使用SQL聚合函数的AdoQuery参数信息错误

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

Stack Overflow用户
提问于 2015-01-23 15:34:27
回答 1查看 812关注 0票数 0

我使用delphi XE5,我有一个有7个表的数据库,我的问题是:我单击一个运行以下代码的按钮:

代码语言:javascript
运行
复制
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运行类似的代码,我有结果,但总是有相同的消息错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-23 16:13:49

你贴出的代码是一堆烂摊子。原因如下:

在这里清除adoquery4.Parameters,并将adoquery4分配给datasource6.DataSet

代码语言:javascript
运行
复制
dbgridappr2.Enabled:=false;
adoquery4.Parameters.Clear;
datasource6.DataSet:=adoquery4;

然后立即丢弃现有的adoquery4 (进程中的内存泄漏),并将其替换为TADOQuery的新实例。

代码语言:javascript
运行
复制
ADOQuery4:=TADOQuery.Create(Application);

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

代码语言:javascript
运行
复制
adoquery4.Active:=False;
adoquery4.Connection:=ADOConnection1;
adoquery4.SQL.Clear;

到目前为止,你所做的事情中有90%是毫无意义的。

然后调用ADOQuery4.ExecSQL;,它用于执行不返回行集的查询,如INSERTDELETE等。您需要使用ADOQuery4.OpenADOQuery4.Active := True来代替SELECT。这是所得到的错误的实际原因;您使用返回行集的SQL语句调用ExecSQL,这是无效的。

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

代码语言:javascript
运行
复制
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的所有杂耍都是关于什么的,但是除非您要从不同的查询中更改数据源,否则这些都没有必要。在执行新查询时,对DisableControlsEnableControls的调用将阻止更新任何UI组件。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28113296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档