不兼容的类型:widestring 和 tintegerfield

incompatible types: widestring and tintegerfield

有人知道这是怎么回事吗?

我已将所有数据库对象声明为整数,并将数据集对象声明为整数

当我 运行 我的 ado 查询时,我从这里获取值,我试图将其分配给数据集,该数据集也被声明为整数。但它一直给我

不兼容的类型:widestring 和 tintegerfield

这里是确切的代码:

dxMemData1.FieldByName(dxMemData1RetailCalendarPeriodID) := 
  adoTreeWindow.FieldByName('RetailCalendarPeriodID').AsIntege‌​r;

dxMemData1.FieldByName(dxMemData1RetailCalendarPeriodID) := adoTreeWindow.FieldByName('RetailCalendarPeriodID').AsIntege‌​r

不应该编译。

看起来 dxMemData1RetailCalendarPeriodID 是您在 dxMemData1 数据集上创建的持久字段对象。 FieldByName 方法用于根据名称查找 字段,但您不需要这样做,因为您已经拥有字段,dxMemData1RetailCalendarPeriodID!

所以,你需要的只是

dxMemData1RetailCalendarPeriodID.AsInteger := adoTreeWindow.FieldByName('RetailCalendarPeriodID').AsIntege‌​r

编译器错误的原因是 FieldByName 期望传递一个字符串,给出字段的 name 而你试图传递 field 本身,它是一个 TObject 后代而不是一个字符串。以下内容本来可以工作,但由于我已经显示的代码而没有必要:

dxMemData1.FieldByName(dxMemData1RetailCalendarPeriodID.FieldName) := adoTreeWindow.FieldByName('RetailCalendarPeriodID').AsIntege‌​r;

更新 你说你遇到了 "Invalid variant operation" 错误。如果您使用此代码,您仍然得到它吗:

if not adoTreeWindow.FieldByName('RetailCalendarPeriodID').IsNull then    
  dxMemData1RetailCalendarPeriodID.AsInteger := adoTreeWindow.FieldByName('RetailCalendarPeriodID').AsIntege‌​r

?