如何检查单行中是否为空值

Gle*_*rse 2 delphi ado delphi-xe2

我从db获取一个值,当值为NULL时,我收到一个错误

无法将类型(null)的变体转换为类型(整数)

如果我用0填充数据库而不是(NULL),则错误消失

所以说我有这个

  OneSpell.PerCent     :=              FQuery.Recordset.Fields[ DB_FLD_PER_CENT    ].Value;
  OneSpell.Plus        := TCardPlus  ( FQuery.Recordset.Fields[ DB_FLD_PLUS        ].Value );
  OneSpell.Quantity    :=              FQuery.Recordset.Fields[ DB_FLD_QUANTITY    ].Value;
Run Code Online (Sandbox Code Playgroud)

有没有办法说,如果值为NULL然后使其为0?或者这必须通过数据库来完成.

FQueryadoquery和db是访问

我知道我能做到

if  .... = null then 
  onespell.plus := 0 
else
   .........
Run Code Online (Sandbox Code Playgroud)

但我希望在onepell的每个值的一行中做到这一点

Sir*_*ufo 8

这是常见的方法:

提取重复部分以保持代码DRY并提高可读性

function IfNull( const Value, Default : OleVariant ) : OleVariant;
begin
  if Value = NULL then
    Result := Default
  else
    Result := Value;
end;

...
OneSpell.Plus := IfNull( FQuery.Recordset.Fields[ DB_FLD_PER_CENT].Value, 0 );
Run Code Online (Sandbox Code Playgroud)


Ken*_*ite 6

因为您正在使用ADOQuery.Recordset,它返回对底层的引用_Recordset(不是来自Delphi,而是直接是ADO对象引用),您的选择仅限于ADO直接支持的那些.Delphi的TADOQuery包装方法隐藏了在较低级别处理ADO的大量复杂性,而使用的方法Recordset严重限制了您的选择.

AFAICT,在一行中唯一的方法是使用一条利用函数和函数的长行(如果省略了参数,则默认为):VarIsNullMath.IfThen0AFalse

OneSpell.PerCent := IfThen(not VarIsNull(FQuery.Recordset.Fields[ DB_FLD_PER_CENT].Value), FQuery.Recordset.Fields[DB_FLD_PER_CENT].Value);
Run Code Online (Sandbox Code Playgroud)

您可以使用中间OleVariant变量(仍然需要Math单位)以两行更可读地执行此操作:

var
  Val: OleVariant;
...
  Val := FQuery.Recordset.Fields[DB_FLD_PER_CENT].Value;
  OneSpell.PerCent := IfThen(not VarIsNull(Val), Val);
Run Code Online (Sandbox Code Playgroud)

最简单的替代方法(无论如何,从Delphi代码的角度来看)将在您的SQL语句本身中使用IsNullCoalesce在MS Access中使用或等效处理它,因此您不必在应用程序代码中担心它; 你可以简单地访问Value并知道它包含一个整数.

实际上,如果您实际上不需要这样做,最简单的替代方法是不使用RecordSet(因为结果中有多个记录集TADOCommand).如果您只是直接使用Delphi TADOQuery,您可以简单地使用本机TField.AsXXX属性,它将自动为您处理转换:

OneSpell.PerCent := FQuery.Fields[DB_FLD_PER_CENT].AsInteger; // Or AsFloat
Run Code Online (Sandbox Code Playgroud)