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?或者这必须通过数据库来完成.
FQuery是adoquery和db是访问
我知道我能做到
if .... = null then
onespell.plus := 0
else
.........
Run Code Online (Sandbox Code Playgroud)
但我希望在onepell的每个值的一行中做到这一点
这是常见的方法:
提取重复部分以保持代码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)
因为您正在使用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语句本身中使用IsNull或Coalesce在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)
| 归档时间: |
|
| 查看次数: |
29702 次 |
| 最近记录: |