【问题标题】:"Field 'COUNT(id)' has no dataset" TSQLQuery in DelphiDelphi中的“字段'COUNT(id)'没有数据集”TSQLQuery
【发布时间】:2009-11-08 17:57:12
【问题描述】:

对不起我的英语,但我希望你能理解我:P

我正在尝试在代码中创建新的 TSQLQuery 组件,而不是将它放在表单上。我写了那个代码:

var
sql:tsqlquery;
pole:TFMTBCDField;

....
   sql:=tsqlquery.Create(self);
   sql.SQLConnection:=ddm.konekszyn;
   sql.SQL.Text:='SELECT COUNT(idrap) FROM raporty WHERE idkier="'+lvkierowcy.Selected.Caption+'";';
   pole:=TFMTBCDField.Create(self);
   pole.Name:='sqlilerap';
   pole.FieldName:='COUNT(idrap)';
   pole.FieldKind:=fkData;
   pole.DisplayLabel:='COUNT(idrap)';

   sql.Fields.Add(pole);
   sql.Open;
   showmessage(sql.FieldByName('COUNT(idrap)').AsString);
   sql.Free;
   pole.Free;

但是当我尝试访问数据时出现异常:

First chance exception at $75999617. Exception class EDatabaseError with message 'Field 'COUNT(idrap)' has no dataset'. Process htstrm2.exe (2308)

我该怎么办?

【问题讨论】:

  • 您能否澄清一下 - 您是在打开查询时得到的,还是在尝试读取新字段的内容时得到的?它是在“SQL.Open”还是在“ShowMessage”行吐出?
  • 好的 - 有趣的是,如果您将 'FieldByName('cnt').AsString' 更改为 'Fields[0].AsString' 会发生什么 - 同样的错误?
  • 将您的 sql 查询更改为“SELECT COUNT(idrap) AS A FROM”。并使用 FieldByName('A') 或 Fields[0] 。使用参数化查询而不是字符串连接。

标签: sql delphi dbexpress


【解决方案1】:

甚至不要创建一个字段。诸如此类的查询仅返回一个字段。所以只需从字段数组中引用:

var
sql:tsqlquery;

....
   sql:=tsqlquery.Create(self);
   sql.SQLConnection:=ddm.konekszyn;
   sql.SQL.Text:='SELECT COUNT(idrap) FROM raporty WHERE idkier="'+lvkierowcy.Selected.Caption+'";';
   sql.Open;
   showmessage(sql.fields[0].AsString);
   sql.Free;

【讨论】:

  • 谢谢,它可以正常工作:D 不知道我不必添加字段。谢谢!
【解决方案2】:

您的数据库驱动程序报告聚合表达式的空字段名称。

为您的领域命名:

   sql:=tsqlquery.Create(self);
   sql.SQLConnection:=ddm.konekszyn;
   sql.SQL.Text:='SELECT COUNT(idrap) AS cnt FROM raporty WHERE idkier="'+lvkierowcy.Selected.Caption+'";';
   pole:=TFMTBCDField.Create(self);
   pole.Name:='sqlilerap';
   pole.FieldName:='cnt';
   pole.FieldKind:=fkData;
   pole.DisplayLabel:='cnt';

   sql.Fields.Add(pole);
   sql.Open;
   showmessage(sql.FieldByName('cnt').AsString);
   sql.Free;
   pole.Free;

【讨论】:

  • 不,没有帮助。仍然错误:75999617 美元的第一次机会例外。带有消息'字段'cnt'没有数据集'的异常类EDatabaseError。处理 htstrm2.exe (2864)
【解决方案3】:

您必须明确地将数据集分配给该字段,请尝试添加此行

pole.DataSet:=sql;

再见。

【讨论】:

  • 您必须将字段类型从 TFMTBCDField 更改为 TIntegerField
【解决方案4】:

别名被返回的列。然后,您可以通过该别名访问它:

sql.SQL.Text:='SELECT COUNT(idrap) AS iDrapCount FROM raporty WHERE dkier 
="'+lvkierowcy.Selected.Caption+'";';
....
pole.FieldName := 'iDrapCount';

【讨论】:

  • 您需要更具体。 “没有帮助”是什么意思?您收到错误消息吗?你的电脑是不是举手说“我没办法帮你”?不提供任何有用的东西意味着你会得到帮助——没有任何用处。
  • inst 在这种情况下提供帮助意味着在创建别名后没有任何变化,仍然是同样的错误
  • 您能否单步调试调试器中的代码并准确显示导致异常的行?
  • showmessage(sql.FieldByName('COUNT(idrap)').AsString);这是一个问题,但现在它已解决,正如 M Schenkel 上面所写,不需要字段。感谢您尝试提供帮助。 :)
【解决方案5】:

尝试将此行添加到您的查询中:

AND idrap <> nil

【讨论】:

  • 但是,它不是查询问题(我认为),在 phpmyadmin 中执行的查询没有问题,并且返回 2 到 16 之间的值。
  • 我认为您的数据集中 idrap 的某些值可能为零。如果计算聚合的所有值都不是 nil.,则某些数据库引擎不会进行聚合
  • 它没有帮助。 idrap 是表中的主键列,所以它不能为 nil(null?),它总是有一个值。
  • 你用 sql.First, sql.Next 遍历数据集了吗?您刚刚执行了查询。
猜你喜欢
  • 1970-01-01
  • 2017-02-14
  • 2021-05-13
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
相关资源
最近更新 更多