0

对不起我的英语,但我希望你能理解我: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)

我该怎么办 ?

4

5 回答 5

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;
于 2009-11-09T13:09:00.497 回答
0

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

别名你的领域:

   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;
于 2009-11-08T18:35:44.097 回答
0

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

pole.DataSet:=sql;

再见。

于 2009-11-09T02:20:04.077 回答
0

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

sql.SQL.Text:='SELECT COUNT(idrap) AS iDrapCount FROM raporty WHERE dkier 
="'+lvkierowcy.Selected.Caption+'";';
....
pole.FieldName := 'iDrapCount';
于 2009-11-09T14:08:01.663 回答
-1

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

AND idrap <> nil
于 2009-11-08T19:13:47.117 回答